opengl - 早期模板剔除,无需早期 z 剔除

标签 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 效果...

最佳答案

不存在早期模板测试这样的事情。或者早期的 Z/深度测试。只有early fragment tests ,其中恰好包括模板和深度测试,还包括其他操作。它们不能在早期零碎地进行;要么早要么晚。

关于opengl - 早期模板剔除,无需早期 z 剔除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56990966/

相关文章:

c++ - Opengl:视口(viewport)、裁剪、矩阵模式困惑

opengl - gluTess 函数背后的算法是什么?

c++ - 影响片段着色器内部的深度或模板缓冲区?

ios - OpenGL ES 2.0 - GL_POINTS 和模板缓冲区

python - 模板测试不裁剪纹理

opengl - 旧游戏渲染的最佳 OpenGL 剔除方法?

java - Libgdx 视锥体剔除 actor.draw() 内

c - 调用 glBindBuffer 后具有奇怪顶点位置的简单 openGL 应用程序

c++ - 如何修复依赖于模板参数的 'there are no arguments to ' glGenVertexArrays ...' C++ 中的错误