我已经知道答案,但我需要确定。
我分两次渲染场景。 在第一遍中,如果深度测试成功,我将模板位标记为 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
事实上,这工作正常,但我预计性能会有巨大的提高。
第二遍中使用的着色器很特殊:它使用 discard
和 gl_FragDepth
效果。
这使得早期 z 剔除变得不可能。幸运的是,我只对早期模板剔除感兴趣。
所以我的问题是:有没有办法在不进行早期 z 剔除的情况下利用早期模板剔除的优势?
此线程与此非常相关one ,但我确实需要在第二个着色器中使用 discard
和 gl_FragDepth
效果...
最佳答案
不存在早期模板测试这样的事情。或者早期的 Z/深度测试。只有early fragment tests ,其中恰好包括模板和深度测试,还包括其他操作。它们不能在早期零碎地进行;要么早要么晚。
关于opengl - 早期模板剔除,无需早期 z 剔除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56990966/