模板早期剔除,不进行早期Z剔除

时间:2019-07-11 13:58:41

标签: opengl stencil-buffer culling

我已经有了答案的想法,但是我需要确定。

我分两步渲染一个场景。 在第一遍中,如果深度测试成功,我将模板位标记为1:

glEnable(GL_STENCIL_TEST);
glStencilMask(GL_TRUE);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glStencilFunc(GL_ALWAYS, 1, GL_TRUE);

第二遍只在模板为1的地方写入:

glStencilFunc(GL_EQUAL, 1, GL_TRUE); // Pass test if stencil value is 1
glStencilMask(GL_FALSE); // Don't write anything to stencil buffer

实际上,这可以正常工作,但是我希望性能会大大提高。 在第二遍中使用的着色器是特别的:它使用discardgl_FragDepth的影响。 这使得不可能进行早Z淘汰。幸运的是,我只对模板早期剔除感兴趣。

所以我有一个问题:是否有办法利用模板早期剔除而不进行z早期剔除


该线程与此one非常相关,但是我真的需要在第二个着色器中使用discardgl_FragDepth情感...

1 个答案:

答案 0 :(得分:4)

没有早期的模板测试之类的东西。或对此事进行早期Z /深度测试。只有early fragment tests,其中碰巧包括模板测试和深度测试,还包括其他操作。它们不能零星地进行。都是早或晚。