当我设置 glStencilFunc( GL_NEVER, ... )
有效地禁用所有绘图,然后运行我的 [shader-bound] 程序时,与让片段着色器运行相比,我没有得到任何性能提升。我认为模板测试发生在片段程序之前。事实并非如此,或者至少不能保证?用一个简单地将常量写入 gl_FragColor 的片段着色器替换片段着色器确实会导致更高的 FPS。
最佳答案
实际上两者兼而有之。正如您在此 OpenGL ES 2.0 pipeline diagram 中所见,每个片段操作应该在片段程序之后发生.然而,许多现代图形卡都有早期 z 测试,只要您不写入片段着色器的深度,它就会更早地丢弃片段。
这是一个paper from AMD/ATI that talks about such tests .我记得读过规范允许早期测试,只要在着色器产生与之后执行它们相同的结果之前进行测试,这就是为什么您不想修改深度或丢弃着色器中的片段。这thread on OpenGL forums对此有一些有趣的讨论。
关于c++ - OpenGL 模板测试发生在片段程序运行之前还是之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2756273/