使用OpenGL ES丢弃像素着色器计算的最有效方法

时间:2014-10-13 03:16:29

标签: ios opengl-es fragment-shader

我的片段着色器中有多个纹理读取,我应该做坏事,比如在着色器中使用discard命令和条件。

问题是,我正在渲染一个纹理,我希望在以下使用其他着色器的过程中重复使用它,这些着色器不必对以前“丢弃”的像素进行操作。这是为了表现。问题是,如果制服超出某些范围(我从另一个纹理中读取),我还需要丢弃计算:想象一个循环,这些着色器始终在相同的纹理上运行,这些纹理不会被清除。

所以我现在所拥有的是一种糟糕的表现。我想到的一个想法是将glFragDepth与深度缓冲区一起使用,并使用它来触发深度测试以丢弃一些像素。但这与我想要的范围无关。

还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

您可以启用混合,并将您不想渲染的像素的Alpha值设置为零。设置:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

然后在片段着色器中,您之前调用discard

...
if (condition) {
    discard;
}
...

将alpha设置为零:

float alpha = float(condition);
...
gl_FragColor(r, g, b, alpha);

这是否比丢弃像素更好,可能与系统有很大关系。但如果您正在寻找其他选择,那么值得尝试。