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