我想使用 OpenGL ES 3.1 实现满足以下要求的片段/混合操作:
- 如果片段着色器生成的像素满足特定条件(最早可以在顶点着色器中确定),则应将其颜色值添加到帧缓冲区中 。
- 如果像素不满足条件,则颜色应完全替换帧缓冲中的颜色。
这可以通过通常的混合功能、阿尔法技巧等来完成吗?
我认为你可以使用标准的预乘alpha混合:
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
如果要替换,则从片段着色器输出 alpha 值 1。如果要执行加法,则从片段着色器输出 alpha 值 0。
这假设您只对帧缓冲区中的 RGB 值真正感兴趣。
如果你在顶点着色时知道这一点,我假设整个三角形要么是一种混合,要么是另一种混合。这是模板测试的理想之选,前提是您没有太多的几何形状。
- 将模具清除为零。
- 在禁用颜色写入的情况下绘制形状,对于与两个混合规则之一匹配的区域,将模具设置为 1。
- 设置混合规则一。
- 在启用模板测试的情况下绘制形状,并在模板 == 0 时通过。
- 设置混合规则二。
- 在启用模板测试的情况下绘制形状,并在模板 == 1 时通过。
这需要多少成本取决于您的几何体,因为您需要多次将其传递给渲染,但其中的模板测试部分通常接近"免费"。