【问题标题】:Early stencil culling早期模板剔除
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的建议。不幸的是,这并没有改变任何事情。我目前正在使用 PACKED_DEPTH_STENCIL 纹理。在我的设置中,将代码修改为具有单独的 DEPTH/STENCIL 纹理要复杂得多,尽管并非绝对不可能。根据您的经验,问题可能来自那里吗?
  • 您的目标是什么版本的 OpenGL?如果您的驱动程序支持 OpenGL 4.2 或具有扩展名:ARB_shader_image_load_store,那么您可以在片段着色器中使用布局限定符来强制早期片段测试:layout (early_fragment_tests) in;。至于使用打包深度/模板,这应该无关紧要......绝大多数软件都使用打包深度/模板,如果它不适用于这些用例,早期的模板测试将毫无用处。
  • layout(early_fragment_tests) 即使在使用丢弃时也会屏蔽掉被遮挡的片段,例如。片段深度被写入。如果片段 A 的深度为 0.1,但在片段着色器中调用了丢弃,并且稍后,如果具有 Z = 0.2 的片段 B 在相同的像素位置渲染(并且不调用丢弃),它将被剔除,例如.不会发生颜色写入。 layout(early_fragment_tests) 强制 A 的 Z 值,即使 A 调用丢弃。有人告诉我这是正确的行为 - 这不适合我的情况。编辑:看看这里:tinyurl.com/nncfsd6
  • 你能发布你的实际片段着色器吗?在片段着色器中使用 discard 指令是让 OpenGL 进行早期片段测试的可靠方法。
  • 好的,我试过不用discard,突然间,它起作用了。为什么现在这个工作完全超出了我的理解,因为这是一个实现细节,我感到有点难过。谢谢你的帮助,安东。
猜你喜欢
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多