优化昂贵的片段着色器

Optimize for expensive fragment shader

我正在片段着色器中使用光线追踪器渲染多层平面三角形。上层有洞,我正在寻找一种方法来避免 运行 已经被上层之一填充的像素的着色器,即我只想渲染下层的部分躺在上层的洞里。当然,是否有洞是不知道的,除非片段着色器为图层做了他的事情。

据我所知,我不能使用早期深度测试,因为深度值是在顶点之间插值的,而不是来自片段着色器。有没有办法“模仿”这种行为?

解决这个问题的最好方法是不使用图层。由于使用 3D 纹理存储场景数据的局限性,您仅使用图层。所以...不要那样做。

SSBO 和缓冲区纹理(如果您的硬件对于 SSBO 而言太旧)可以访问比 3D 纹理更多的内存。如果可行,您甚至可以 改进缓存局部性。


As far as I understand, I cannot use early depth testing because there, the depth values are interpolated between the vertices and do not come from the fragment shader.

就不能使用早期深度测试而言,这是正确的,但为什么

是不正确的

VS提供的“深度”不一定是实际片段的深度。您正在分层渲染场景,大概每层都是一个 full-screen 四边形。根据定义,一层渲染中的所有内容 都在较低层中的所有内容之下。所以绝对深度值并不重要;重要的是在这个片段上是否有来自更高层的东西

所以每一层都可以获得自己的深度值,较低的层获得较低的深度值。确切的值是任意的和无关紧要的;重要的是更高的层具有更高的价值。

这不起作用的原因是:如果您的光线追踪算法检测到图层中的缺失(“孔”),您必须 discard 该片段。并且 discard 完全 的使用关闭了大多数硬件中的早期深度测试,因为深度测试逻辑通常与深度 writing逻辑(它是一个原子read/conditional-modify/conditional-write)。