我已经有了答案,但我需要确定。
我分两次渲染一个场景。在第一遍中,如果深度测试成功,我将模板位标记为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剔除?
这个线程与这个one非常相关,但我真的需要在第二个着色器中使用discard
和gl_FragDepth
影响…
1条答案
按热度按时间z8dt9xmd1#
没有早期模板测试这回事。或这方面的早期Z/深度测试。只有early fragment tests,恰好包括模板和深度测试,但也有其他操作。它们不能在早期零敲碎打地进行;这都是早的或晚的。