早期的模板剔除

时间:2013-09-11 12:11:11

标签: opengl stencil-buffer culling

我正在尝试根据模板测试进行早期碎片剔除工作。 我的场景如下:我有一个片段着色器,它做了很多工作,但是当我渲染场景时,只需要在非常少的片段上运行。这些片段几乎可以放在屏幕上的任何位置(我不能使用剪刀快速过滤掉这些片段)。

在渲染传递1时,我生成一个带有两个可能值的模板缓冲区。第2遍的值具有以下含义:

  • 0:什么都不做
  • 1:确定继续,(例如,输入片段着色器,然后渲染)

传递2使场景正确地说话。模板缓冲区以这种方式配置:

glStencilMask(1);
glStencilFunc(GL_EQUAL, 1, 1); // if the value is NOT 1, please early cull!
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // never write to stencil buffer

现在我运行我的应用程序。所选像素的颜色根据模板值改变,这意味着模板测试工作正常。

然而,我应该看到早期模板剔除会带来巨大而壮观的性能提升......但没有任何反应。我的猜测是模板测试要么在深度测试之后发生,要么甚至在调用片段着色器之后发生。为什么呢?

nVidia显然拥有早期模板剔除的专利: http://www.freepatentsonline.com/7184040.html 这是启用它的权利吗?

我正在使用nVidia GeForce GTS 450显卡。 早期的模板剔除是否适用于此卡? 使用最新驱动程序运行Windows 7。

1 个答案:

答案 0 :(得分:1)

与早期Z一样,早期的模板通常使用分层模板缓冲来完成。

有许多因素可以阻止分层拼贴正常工作,包括渲染旧硬件上的FBO。但是,在您的示例中进行早期模板测试的最大障碍是您在第二次传递中已将模板写入启用为1 /(8)位。

我建议在第二遍开始时使用glStencilMask (0x00)让GPU知道你不会向模板缓冲区写任何内容。

有关早期片段测试的有趣读物,因为它是在当前一代硬件here中实现的。如果你有时间,整篇博客都值得一读。