4

我正在开发适用于非常大的场景显示的 3D 引擎。渲染本身的设备(截头剔除,遮挡剔除等),我想知道场景管理的最佳解决方案是什么。

数据是作为一个巨大的 3D 网格列表给出的,它们之间没有任何关系,所以我无法生成门户,我想......

主要目标是能够在 RAM 较低(500MB-1GB)的系统上运行该引擎,并且加载到其中的场景非常大,可以包含数百万个三角形,这会导致非常密集的内存使用。我现在实际上正在使用一个松散的八叉树,在加载时构建,它在中小型场景上运行良好,但是许多场景太大而无法完全适应内存,所以我的问题来了:

您将如何处理场景以动态(并且理想地无缝地)加载和卸载块,以及您将根据什么来确定是否应该加载/卸载块?如果需要,我可以创建自定义文件格式,因为正在使用已知 3D 创作工具上的自定义导出器导出场景。

重要信息:许多场景无法有效遮挡,因为它们的构造。示例:一个非常大的管网,因此没有太多的遮挡,但元素数量非常多。

4

2 回答 2

0

如果纹理要使用大量 ram,则可以使用诸如 GraniteSDK 之类的商业软件包,它们使用虚拟纹理缓存提供基于 LOD 的无缝纹理流。请参阅http://graphinesoftware.com/granite。或者,您可以查看http://ir-ltd.net/

事实上,您可以使用相同的技术从着色器中的纹理数据动态构建多边形,但它会有点复杂。

对于体素,有一种技术可以完全在 GPU 内存中构建八叉树,并分页输入/输出您真正需要的部分。然后可以使用光线投射完成渲染。请参阅这篇文章:使用八叉树在 GPU 中组织 3D 体积数据http://www.icare3d.org/research/GTC2012_Voxelization_public.pdfhttp://www.cse.chalmers.se/~kampe/highResolutionSparseVoxelDAGs.pdf

这取决于场景的静态程度,以及根据您的可视化需求预烘焙数据的能力。如果您可以预先确定可见性约束(例如谷歌潜在可见性集)并组织它以便您可以根据要求流式传输它,这已经很有帮助。由于可视化工具会有限制,因此您总是会采用一种策略,以尽可能快速准确地将一部分数据放入 GPU 内存中。

于 2014-09-19T09:40:45.923 回答
0

我认为最好的解决方案将是一个“解决方案包”,一组不同的技术。

  • 如果未加载未使用的级别,详细级别 (LOD) 可以减少内存占用。通过在新旧细节之间使用 alpha 混合,可以或多或少地无缝更改它。最简单的控制器将使用到相机的网格距离。
  • 当对象已上传到 GPU(设备)时释放主机内存(RAM),显然释放所有未使用的内存(OpenGL 资源)。Valgrind 可以帮助你解决这个问题。
  • 使用低质量的网格并使用曲面细分来提高视觉质量。
  • 使用 VBO 索引,这应该会减少 VRAM 的使用并提高性能
  • 尽可能不要使用网格,可以使用高度图渲染地形。有些东西可以通过程序生成。
  • 使用凹凸或/和法线贴图。这将提高质量,然后您可以减少顶点数。
  • 将这些“管道”划分为不同的网格。
  • 带有 2D 图像的假 3D 网格:冒名顶替者、天穹……
于 2014-09-18T23:47:27.440 回答