4

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

在渲染通道 1 中,我生成了一个具有两个可能值的模板缓冲区。通过 2 的值将具有以下含义:

  • 0:什么都不做
  • 1:可以继续,(例如,进入片段着色器,并渲染)

Pass 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。

4

1 回答 1

1

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

有许多因素会阻止分层平铺正常工作,包括在旧硬件上渲染到 FBO。但是,在您的示例中进行早期模板测试的最大障碍是您在第二遍中为 1/(8) 位启用了模板写入。

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

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

于 2013-09-11T14:09:36.597 回答