我的片段着色器中有多个纹理读取,我应该做坏事,比如在着色器中使用discard
命令和条件。
问题是,我正在渲染一个纹理,我希望在以下使用其他着色器的过程中重复使用它,这些着色器不必对以前“丢弃”的像素进行操作。这是为了表现。问题是,如果制服超出某些范围(我从另一个纹理中读取),我还需要丢弃计算:想象一个循环,这些着色器始终在相同的纹理上运行,这些纹理不会被清除。
所以我现在所拥有的是一种糟糕的表现。我想到的一个想法是将glFragDepth
与深度缓冲区一起使用,并使用它来触发深度测试以丢弃一些像素。但这与我想要的范围无关。
还有其他选择吗?
答案 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);
这是否比丢弃像素更好,可能与系统有很大关系。但如果您正在寻找其他选择,那么值得尝试。