如果要进行光线跟踪的场景无法存储在内存中,则在不向机器添加更多RAM的情况下,在实际的时间范围内渲染场景似乎是不现实的,因为需要从磁盘上加载场景的不同部分,每个像素可能需要多次加载。

可以解决这个问题吗?我正在尝试一种某种方式来一次执行涉及场景的特定子集的大量计算,以减少需要将其加载到内存中的次数。在这种情况下还有其他提高速度的方法吗?

#1 楼

如果场景不完全适合内存,则您正在输入核心外渲染字段。这里本质上有两种方法:a)按需生成场景b)按需加载场景

前一种方法与大多数动画工作流程非常吻合,在这些工作流程中,模型使用(例如)大量细分。 Catmull-Clark可能会占用大量内存,但基础网格物体本身很容易装入内存。皮克斯(Pixar)对此有几篇论文(例如,“射线微分和多分辨率几何缓存
用于复杂场景中的分布射线跟踪”),但要点是,仅当模型被射线照射时才对其进行细分,并且只能对其进行细分。尽可能多地使用这种射线(例如,漫反射比镜面反射的精度要低)。其余的由几何高速缓存处理,该高速缓存将细分的模型保留在内存中,并希望通过良好的逐出策略使该过程高效。轻松地移出核心并在细分级别渲染网格,而这些细分永远无法容纳到内存中。几何缓存还可以根据您拥有的内存量很好地扩展,从而可以权衡RAM与渲染时间。我相信这也用在了汽车上。

第二种方法更通用,不依赖大量使用细分。取而代之的是,它依赖于这样一个事实,即您的场景很可能是由艺术家制作的,并且已经被划分为合理的小物体,可以分别放入内存中。然后,想法是保留两个层次结构(kD树或边界体积层次结构):顶层层次结构仅存储场景中对象的边界框,而底层层次结构则存储实际的几何图形。每个对象都有一个这样的低级层次结构。

在这种方法中,理想情况下,您已经将边界框与每个对象一起存储在磁盘上。加载场景时,最初只构建顶层层次结构,这意味着您只需要查看边界框而不是几何体。然后,您开始跟踪射线并遍历层次结构。每当射线击中顶层层次结构中的叶节点(即它击中对象的边界框)时,该对象就会被加载到内存中并构建其低层层次结构。然后,射线继续向下跟踪该对象。与可以在内存中保留尽可能多的低级层次结构的对象高速缓存相结合,可以很好地执行此操作。已加载,表示它会自动适应场景中的可见性。第二个好处是,如果要跟踪很多射线,则不必立即加载对象,因为它会被射线击中。取而代之的是,您可以握住该射线并等待,直到有足够的射线照射到该对象上,从而分摊多次射线照射上的负载。跟踪生产路径,以免由于不相干的光线造成抖动。上面提到的纸张描述了迪士尼的Hyperion渲染器的体系结构,我相信它用于Big Hero 6,因此它很可能可以处理生产规模的场景。

评论


$ \ begingroup $
这很有趣!您链接的迪士尼论文也是如此。
$ \ endgroup $
– John Calsbeek
2015年8月9日23:41

$ \ begingroup $
+1对我一直想知道的事情的答案!
$ \ endgroup $
– Rottem
15年10月22日在20:53

#2 楼

如果您以空间结构组织场景(通常的方法是“边界体积层次结构”),则可以使用一种虚拟场景(我指的是这个术语,指的是虚拟纹理)。

内存管理器一次只能加载有限数量的边界框,并抽象出检索一个边界框的操作。

这样,只有在需要时才加载框:命中一个边界框,该框将被加载以解决碰撞。稍后,当需要加载另一个盒子时,未使用的盒子将被删除以为新盒子腾出空间。

所有这些盒子都被加载和删除后,射线相干性将成为速度的主要因素。我想进一步的改进可以是通过重新排序射线以首先处理已经加载的盒子来推迟加载。

评论


$ \ begingroup $
是这样的。
$ \ endgroup $
– joojaa
15年8月9日,11:40

#3 楼

您要做的是根据先前遇到的情况将三角形从磁盘加载到内存中。您可以先从紧邻的三角形开始。原因是在一个区域中,射线很可能会反复打到相同的三角形。最终您会有所效率。 (由于这个原因,在遮挡跟踪中缓存不需要命中的最后一个击中的三角形是一个好主意)

其次,您将三角形存储在空间树中,从而可以从磁盘进行快速搜索,以按距离更新内存中的剩余部分。因此,仅加载会阻碍光线的分支。如果它像某种八叉树那样的体素树,您甚至可以对次要射线进行分类并通过相干来解决它们。 BSP树在修剪区域上也有些不错。

在某些情况下,它会失败,但是如果您不产生噪音,它在大多数场景存储桶中都相当有效...

#4 楼

到目前为止(2020年5月)这3个答案所提及的方法涉及:


细分表面
每个对象跟踪/逐出的BVH +射线缓存+内存管理

还有其他正交技术可以自己添加或使用。那是基于OpenSubdiv之外的东西进行抽取。像:


距离场
八面体冒口者https://www.shaderbits.com/blog/octahedral-impostors

图像网格(几何形状是在地图中烘焙)
相机映射
体素化

以不同的角度思考:如果您的场景不适合存储,则存在熵问题。您只有4k分辨率(约800万像素?),因此,在Shannon的意义上,“超出内存”无法合理地映射到比可以投影到这8Mp更少的数据。这意味着使用“多于记忆”的场景很可能是一种过度杀伤力。因此,再次简化方法可能不仅会加快处理速度,而且可能有助于混淆。

评论


$ \ begingroup $
我非常不同意您对信息论的解释。确实,最后您将需要#pixels * #channels * #bits_per_channel,但您不想猜测该数据,而是希望通过评估渲染方程式进行计算。请注意,您有许多自由变量,例如摄影机和灯光参数等。您不想为每种可能的摄影机位置或灯光设置预先烘焙最佳场景!例如,这意味着要针对所有可能的视角预先计算所有纹理。
$ \ endgroup $
–伊索林
20 May 25'9:37

$ \ begingroup $
您的另一个错误假设是,只有可见的物体才能构成最终图像。但是,周围可能有阴影投射器,透明对象的层堆积在一起,镜面高光和焦散从相机后面反射到相机前面的对象,并可能再反射回来。为了正确计算所有的光反射,您将很容易以比生成的图像更多的信息内容(更多数量级)结束场景。
$ \ endgroup $
–伊索林
20 May 25'9:41



$ \ begingroup $
您需要考虑的最后一点附加信息是,如果您使用光谱渲染器,则将尝试获取不仅是RGB数据的材质,但是在大多数情况下,渲染输出将是RGB 。
$ \ endgroup $
–伊索林
20 May 25'9:50

$ \ begingroup $
@Isolin我要说的第一句话是,是的。那就是我们对mipmap所做的。当我们准备任何种类的地图时,尤其是冒名顶替者,我们都会针对任何摄像机距离或角度进行预烘焙。任何类型的网格LOD都是这样,它是针对每个可能的相机位置的预烘焙优化。现在您的第二句话很有趣。它使我思考宇宙。可以说,由星系引起的微弱的GI有助于最终成像。虽然我怀疑这很混乱;意味着它们可以减少为几个参数。但是苛刻是。接得好
$ \ endgroup $
–v.oddou
20 May 25'10:44