与 OpenGL ES 的条件混合

Conditional Blending with OpenGL ES

我想使用满足以下要求的 OpenGL ES 3.1 实现 fragment/blending 操作:

这可以通过常用的混合函数、alpha 技巧等来完成吗?

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

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

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

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

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

如果要替换,则从片段着色器输出 alpha 值 1。如果你想做加法,那么你从你的片段着色器输出一个 alpha 值 0。

假设您只真正对最终出现在帧缓冲区中的 RGB 值感兴趣。