与OpenGL ES的条件混合



我想使用 OpenGL ES 3.1 实现满足以下要求的片段/混合操作:

  • 如果片段着色器生成的像素满足特定条件(最早可以在顶点着色器中确定),则应将其颜色值添加到帧缓冲区中
  • 如果像素不满足条件,则颜色应完全替换帧缓冲中的颜色。

这可以通过通常的混合功能、阿尔法技巧等来完成吗?

我认为你可以使用标准的预乘alpha混合:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

如果要替换,则从片段着色器输出 alpha 值 1。如果要执行加法,则从片段着色器输出 alpha 值 0。

这假设您只对帧缓冲区中的 RGB 值真正感兴趣。

如果你在顶点着色时知道这一点,我假设整个三角形要么是一种混合,要么是另一种混合。这是模板测试的理想之选,前提是您没有太多的几何形状。

  • 将模具清除为零。
  • 在禁用颜色写入的情况下绘制形状,对于与两个混合规则之一匹配的区域,将模具设置为 1。
  • 设置混合规则一。
  • 在启用模板测试的情况下绘制形状,并在模板 == 0 时通过。
  • 设置混合规则二。
  • 在启用模板测试的情况下绘制形状,并在模板 == 1 时通过。

这需要多少成本取决于您的几何体,因为您需要多次将其传递给渲染,但其中的模板测试部分通常接近"免费"。

最新更新