2014-09-13 117 views
3

我正在研发适合非常大型场景显示的3D引擎。 渲染本身(截锥体剔除,遮挡剔除等)的公寓,我想知道什么是场景管理的最佳解决方案。大型3D场景流式传输

数据作为一个巨大的3D meshs的名单,与他们没有关系,所以我不能生成的门户网站,我想......

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

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

重要信息:许多场景由于其构造而无法有效遮挡。例如:一个非常巨大的管道网络,所以没有太多的遮挡,但有很多元素。

回答

0

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

  • 如果未使用的级别未加载,详细程度(LOD)级别可以减少内存占用量。通过在旧的和新的细节之间使用alpha混合,它可以或多或少地被无缝地改变。最简单的控制器将使用相机的网格距离。
  • 当对象上传到GPU(设备)时释放主机内存(RAM),并且显然释放所有未使用的内存(OpenGL资源)。 Valgrind可以帮助你做到这一点。
  • 使用低质量的网格并使用曲面细分来增加视觉质量。
  • 使用VBO索引,这应该会减少VRAM的使用并提高性能
  • 如果可能,不要使用网格,地形可以使用heightmaps进行渲染。有些东西可以通过程序生成。
  • 使用凹凸或/和正常图。这会提高质量,然后你可以减少顶点数。
  • 将这些“管道”分成不同的网格。与2D图像
  • 假3D网:骗子,skydomes ...
0

如果RAM的大量将是由纹理使用,还有诸如GraniteSDK,提供无缝LOD-可用的商业软件包基于纹理的纹理流式传输使用虚拟纹理缓存请参阅http://graphinesoftware.com/granite。或者你可以看看http://ir-ltd.net/

事实上,你可以使用相同的技术从着色器中的纹理数据实时地构建poly,但它会更复杂一些。

对于体素而言,有一种技术可以完全在GPU内存中构建八叉树,并且可以页/出你真正需要的部分。然后可以使用光线投射完成渲染。看到这篇文章:Use octree to organize 3D volume data in GPU,http://www.icare3d.org/research/GTC2012_Voxelization_public.pdfhttp://www.cse.chalmers.se/~kampe/highResolutionSparseVoxelDAGs.pdf

它涉及到如何静态场景将是如何,并从中,你可以根据你的vizualization需要预烘烤数据。如果您可以事先确定可见性限制(例如,Google潜在可见性集),并对其进行组织,以便您可以根据请求进行流式传输,它已经有所帮助。由于可视化工具会有限制,因此您总是最终采取一种策略,尽可能快速准确地将一部分数据放入GPU内存。

+0

感谢您的回答,没有在场景中没有纹理。体素引擎是一个真正的解决方案,牢记我的场景只是多边形集合,我不知道对象的体积。场景完全是静态的,没有任何物体会移动。但我必须能够按需隐藏一些对象(不是什么大问题) – ingham 2014-10-13 07:42:49

+0

它取决于对象的类型。如果渲染多边形并且您期望某些或所有对象具有非常高的细节,那么基于对象的基于LOD的解决方案可能更合适。如果除了变换矩阵或着色器参数外,很多对象在几何上都是相同的,请查看实例化渲染(即管道示例)。 – StarShine 2014-10-13 11:26:59

+0

那么一个包含大量不同小物体的场景(例如〜500 000个〜100-300个三角形物体)呢? – ingham 2014-10-13 14:20:20