C++ opengles的条件混合

C++ opengles的条件混合,c++,opengl-es,opengl-es-3.0,C++,Opengl Es,Opengl Es 3.0,我想使用OpenGL ES 3.1实现片段/混合操作,该操作满足以下要求: 如果片段着色器生成的像素满足特定条件(可以早在顶点着色器中确定),则其颜色值应添加到帧缓冲区中的颜色值 如果像素不满足条件,则颜色应完全替换帧缓冲区中的颜色 这可以通过常用的混合函数、alpha技巧等来实现吗?如果您在顶点着色时知道这一点,我假定整个三角形是一个混合或另一个混合。如果没有太多的几何图形,这是模板测试的理想选择 清除模具至零 在禁用颜色写入的情况下绘制形状,对于匹配两个混合规则之一的区域,模具设置为1

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

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

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

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

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

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

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

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
如果要替换,则从片段着色器输出alpha值1。如果要进行加法运算,则从片段着色器输出alpha值0


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

这样认为。谢谢