opengl 优化昂贵的片段着色器

eaf3rand  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(190)

我正在片段着色器中使用光线追踪器渲染多层平面三角形。上层有洞,我正在寻找一种方法来避免对已经被上层填充的像素运行着色器,也就是说,我只想渲染位于上层洞中的下层部分。当然,除非片段着色器对层进行了处理,否则不知道是否存在孔。
据我所知,我不能使用早期的深度测试,因为在那里,深度值是在顶点之间插入的,而不是来自片段着色器。有没有办法“模拟”这种行为?

wlp8pajw

wlp8pajw1#

解决这个问题的最好方法是不要使用图层。你之所以使用图层是因为使用3D纹理来存储场景数据的限制。所以...不要这样做。
SSBO和缓冲区纹理(如果你的硬件对于SSBO来说太旧了)可以比3D纹理访问更多的内存。如果可行的话,你甚至可以使用employ manual swizzling of the data来提高缓存的局部性。
据我所知,我不能使用早期的深度测试,因为在那里,深度值是在顶点之间插值的,而不是来自片段着色器。
这是正确的,因为你不能使用早期的深度测试,但它是不正确的 * 为什么 *。
VS提供的“深度”不需要是实际片段的深度。你是在层中渲染你的场景,假设每一层都是一个全屏的四边形。根据定义,一个渲染层中的 * 所有 * 都在下一层中的所有之下。所以绝对深度值并不重要;重要的是在该片段上是否存在来自更高层的“某物”。
因此,每一层都可以得到自己的深度值,较低的层得到较低的深度值。重要的是越高的层具有越高的值。
这不起作用的原因是:如果你的光线跟踪算法检测到一个层中的缺失(一个“洞”),你必须discard那个片段。并且使用discardat all 关闭了大多数硬件中的早期深度测试,因为深度测试逻辑通常与深度 * 写入 * 逻辑相联系(它是一个原子读/条件修改/条件写入)。

相关问题