【发布时间】:2013-09-15 10:58:17
【问题描述】:
根据模板测试,我正在尝试让早期片段剔除工作。 我的场景如下:我有一个片段着色器,它做了很多工作,但在渲染场景时只需要在很少的片段上运行。这些片段几乎可以位于屏幕上的任何位置(我无法使用剪刀快速过滤掉这些片段)。
在渲染通道 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。
【问题讨论】:
-
如果您使用早期片段优化,(opengl.org/wiki/Early_Fragment_Test) 深度测试和模板测试都在片段着色器之前执行...这可能意味着一些限制。
-
@AndonM.Coleman 您可以非常安全地假设早期的片段拒绝对我来说将是双赢的。我正在为通过模板测试的片段进行重量级的蛮力光线追踪。知道为什么早期的模板剔除在我的设置中不起作用吗?谢谢。
标签: opengl stencil-buffer culling