【发布时间】:2019-11-21 06:38:54
【问题描述】:
我已经知道答案了,但我需要确定一下。
我分两遍渲染一个场景。 在第一遍中,如果深度测试成功,我将模板位标记为 1:
glEnable(GL_STENCIL_TEST);
glStencilMask(GL_TRUE);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glStencilFunc(GL_ALWAYS, 1, GL_TRUE);
第二遍只写 stencil 为 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 做作。
这使得 early-z 剔除变得不可能。幸运的是,我只对早期模板剔除感兴趣。
所以我的问题是:有没有一种方法可以利用早期模板剔除无需早期 Z 剔除?
这个线程和这个one很相关,但是我确实需要在第二个shader中使用discard和gl_FragDepth做作...
【问题讨论】:
标签: opengl stencil-buffer culling