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