【发布时间】:2009-09-22 08:42:16
【问题描述】:
我有一个项目,我希望在 16 平方英里的景观上渲染大量网格。虽然网格并不都是唯一的,但其中有很多(可能只有 1000 个网格,但有几百万次使用)
我想知道是否有任何论文或(好的)资源涵盖该主题。我找到了大量关于地形/景观渲染的论文,但不知何故未能找到任何关于渲染大量网格的论文。
编辑 我所说的网格是指景观上的物体、建筑物树木等
【问题讨论】:
我有一个项目,我希望在 16 平方英里的景观上渲染大量网格。虽然网格并不都是唯一的,但其中有很多(可能只有 1000 个网格,但有几百万次使用)
我想知道是否有任何论文或(好的)资源涵盖该主题。我找到了大量关于地形/景观渲染的论文,但不知何故未能找到任何关于渲染大量网格的论文。
编辑 我所说的网格是指景观上的物体、建筑物树木等
【问题讨论】:
要高效渲染包含大量对象的大型景观,需要考虑两个重要方面。一种是通过仅绘制从当前摄像机角度可见的内容来最小化冗余工作,另一种是最大化渲染可见内容的效率。
有两种主要方法可以最大限度地减少冗余渲染工作。首先,您要避免绘制相机视野之外的任何内容。这种可见性剔除可以使用多种数据结构来加速:八叉树、四叉树、球体树、bsp 树(通常更适合不太开放的环境而不是景观)等。某种层次的场景安排也可用于加速这种类型的剔除。相同的数据结构也可用于跳过屏幕上低于特定大小阈值的对象的渲染。
其次,您要避免渲染被较近对象遮挡的对象。遮挡剔除有许多不同的技术,一些通过遮挡查询使用 GPU 加速,而另一些则完全在 CPU 上运行。遮挡剔除的值在一定程度上取决于您的典型摄像机角度、地形粗糙度和地形上物体的大小。一个相对平坦、开放的地形,只有小物体,或者摄像机主要向下看地面而不是向外看地平线,这将减少遮挡剔除的机会。场景的一些层次结构将再次有助于遮挡剔除,就像父对象被遮挡一样,您可以跳过对其子对象的测试。
将需要渲染的对象集最小化后,您可以将注意力转向最大化可见对象的渲染效率。细节层次技术在这里很有用(远处物体的低多边形网格)。另一个答案中提到的冒名顶替技术是另一种有用的方法,用简单的广告牌代替复杂的几何图形。各种实例化几何的方法也值得追求——现代图形硬件可以通过一次调用图形 API 来渲染具有不同位置和其他变化的相同几何的多个副本。最后,所有有效使用图形硬件的标准技术都适用于此处:排序以获得最大渲染效率(在某种程度上取决于硬件)、最小化每帧的冗余工作、有效地打包几何图形、优化顶点和像素着色器等。
提到的每个领域本身都非常复杂,并且有许多论文、书籍和文章详细阐述了细节。希望这里提到的技术足以为您指明一些谷歌研究的正确方向。
【讨论】:
解决方案称为octree。 Google image search 会让你一眼就明白这个概念:)
基本上,八叉树可以让您快速消除在渲染期间不可见的网格(因为它们在您身后或太远)。
对于距离较远的网格,您可以预先计算一个分辨率较低的类似网格,这样您仍然可以拥有一个地平线并将其附加到树的节点上。如果树的一部分有一定的距离,你只需使用缩小的网格而不是高细节的网格。
【讨论】:
我不确定这是否是您的情况,但是冒名顶替者呢?据我记得,可以使用 3D 纹理或类似的东西来伪造大量的几何数据。这可能只是您的情况。
它用于渲染森林之类的东西。
【讨论】:
您所说的“网格”是指景观中的物体,例如建筑物、车辆、树木、灌木丛等等?也就是说,您不是在谈论构成地面的网格吗?
如果是这样,我认为您需要研究一般的可见性检查,以便在进行地形渲染时,您可以查询给定的网格是否可见,或者隐藏在山/谷墙后面。
此外,您当然需要研究“实例化”,因此您只需为每个唯一网格保留一个数据集,并通过将其转换为它出现的每个位置来重新使用该数据集,一旦确定该位置可见当然。
查看论文like this 也可能是有益的,如果你错过了。
【讨论】: