【发布时间】:2020-06-01 01:57:21
【问题描述】:
我正在做一个项目,我必须在 C++/OpenGL 中实现间接光的体素锥跟踪。我已经有一个延迟渲染器设置,但我能找到的大多数 VCT 示例通常绘制一次场景用于体素化,一次使用锥形跟踪着色器。是否可以在全屏四边形上运行锥形跟踪着色器并从 GBuffer 中采样顶点数据,或者这通常是一个愚蠢的想法?是否因为我只有每个像素的顶点数据而失去准确性?
【问题讨论】:
我正在做一个项目,我必须在 C++/OpenGL 中实现间接光的体素锥跟踪。我已经有一个延迟渲染器设置,但我能找到的大多数 VCT 示例通常绘制一次场景用于体素化,一次使用锥形跟踪着色器。是否可以在全屏四边形上运行锥形跟踪着色器并从 GBuffer 中采样顶点数据,或者这通常是一个愚蠢的想法?是否因为我只有每个像素的顶点数据而失去准确性?
【问题讨论】:
是否可以在全屏四边形上运行锥形跟踪着色器并从 GBuffer 中采样顶点数据,或者这通常是一个愚蠢的想法?
是的,但这不再是体素锥追踪。那是Screen-Space Global Illumination (SSGI)。您可以将 VCT 中的体素化场景视为 3D GBuffer,它决定了“屏幕空间”和“全场景”之间的所有区别。
是否会因为我只有每个像素的顶点数据而失去准确性?
当然。所有屏幕空间近似值都受到相同的伪像集的影响。它们不考虑在屏幕上不直接可见的表面(超出框架或被可见几何图形遮挡)。最值得注意的是,当相机移动并且物体进入或退出框架时,可见表面上的反射也会发生不切实际的变化。
【讨论】:
一个问题可能是,您尝试两者兼有的动机是什么。
当您进行体素锥体跟踪时,您正在尝试解决与延迟渲染相同的问题,如果您已经愿意处理体素锥体跟踪的开销,那么现在这两种技术都会产生开销那么最好完全致力于该技术。
原因很简单,如果你在做体素锥体追踪,那么你就有了某种 3D 纹理(可能是体素 oct 树,以及实际的 3D 纹理或其他一些结构)。这本质上是一个 3D Gbuffer。
如果您的想法只是消除对这种结构的需求并改用现有的平面 GBuffer,那么您将引入传统 SSRT 技术不会出现的工件。
本质上,同时尝试这两种方法可能会给你带来两全其美的结果,而不是最好的。
【讨论】: