OpenGL模板测试是在片段程序运行之前还是之后发生的?

时间:2010-05-03 05:27:35

标签: c++ graphics winapi fragment-shader stencil-buffer

当我设置glStencilFunc( GL_NEVER, . . . )有效地禁用所有绘图,然后运行我的[着色器绑定]程序时,我不会让片段着色器运行时性能提升。我认为模板测试发生在片段程序之前。是不是这种情况,或者至少不能保证?将片段着色器替换为仅将常量写入gl_FragColor的片段着色器会导致更高的FPS。

4 个答案:

答案 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管道的以下大纲,它说模板测试在像素着色器之前运行:

http://3.bp.blogspot.com/_2YU3pmPHKN4/Sz_0vqlzrBI/AAAAAAAAAcg/CpDXxOB-r3U/s1600-h/D3D10CheatSheet.jpg

在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之后运行。 我知道这对表现不利。