当我设置glStencilFunc( GL_NEVER, . . . )
有效地禁用所有绘图,然后运行我的[着色器绑定]程序时,我不会让片段着色器运行时性能提升。我认为模板测试发生在片段程序之前。是不是这种情况,或者至少不能保证?将片段着色器替换为仅将常量写入gl_FragColor的片段着色器会导致更高的FPS。
答案 0 :(得分:3)
实际上两者都有。每个片段操作应该在片段程序之后发生,正如您在OpenGL ES 2.0 pipeline diagram中看到的那样。但是,许多现代图形卡都有早期z测试,只要您不在片段着色器中写入深度,就会先丢弃片段。
这是paper from AMD/ATI that talks about such tests。我记得读过规则允许早期测试,只要在着色器产生与之后的结果相同的结果之前执行它们,这就是为什么你不想修改着色器中的深度或丢弃片段的原因。这个thread on OpenGL forums有一些有趣的讨论。
答案 1 :(得分:2)
除了片段深度修改之外,还有一些其他因素可以阻止深度/模板测试在片段着色器之前发生。如果启用了z-writes,则任何在着色器中中止片段的方法都会执行此操作,例如alpha-test或discard
着色器指令。
如果GPU想要在与z /模板写入相同的操作中进行模板/ z测试,则必须等到片段着色器执行后才能知道片段被允许写入z缓冲区。不过,这可能因不同的卡而异。至少应该很容易判断这是你当前的问题。
答案 2 :(得分:0)
看一下DX10管道的以下大纲,它说模板测试在像素着色器之前运行:
在DX11中也是如此:
http://4.bp.blogspot.com/_2YU3pmPHKN4/S1KhDSPmotI/AAAAAAAAAcw/d38b4oA_DxM/s1600-h/DX11.JPG
我不知道OpenGL规范中是否强制要求这样做,但是在运行片段程序之前不执行模板测试会对实现不利。
答案 3 :(得分:0)
正如你在这里看到的: http://www.opengl.org/wiki/Stencil_Test 模板测试在fragmentShader之后运行。 我知道这对表现不利。