没有早期 z 剔除的早期模板剔除

Early-stencil culling without early-z 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 做作。 这使得 early-z 剔除变得不可能。幸运的是,我只对早期模板剔除感兴趣。

所以我的问题是:有没有一种方法可以利用早期模板剔除而无需早期 z 剔除


这个线程与这个one非常相关,但我确实需要在第二个着色器中使用discardgl_FragDepth矫揉造作...

没有早期模板测试这样的东西。或者就此问题进行早期 Z/depth 测试。只有 early fragment tests,恰好包括模板和深度测试,但也包括其他操作。它们不能在早期零碎地执行;要么早要么晚。