大型3D场景流媒体

时间:2014-09-13 13:32:26

标签: opengl 3d scene octree

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

数据是作为一个巨大的3D网格列表给出的,它们之间没有关系,所以我不能生成门户网站,我认为......

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

如何处理动态加载和卸载块的场景(理想情况下是无缝加载),以及确定是否应加载/卸载块的基础?如果需要,我可以创建自定义文件格式,因为在已知的3D创作工具上使用自定义导出器导出场景。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如果纹理将使用大量的ram,那么可以使用商业软件包,例如GraniteSDK,它使用虚拟纹理缓存提供基于LOD的无缝纹理流。见http://graphinesoftware.com/granite。或者,您可以查看http://ir-ltd.net/

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

对于体素,有一种技术可以完全在GPU内存中构建oct-tree,并将页面输入/输出您真正需要的部分。然后可以使用光线投射完成渲染。请参阅此帖子:Use octree to organize 3D volume data in GPUhttp://www.icare3d.org/research/GTC2012_Voxelization_public.pdfhttp://www.cse.chalmers.se/~kampe/highResolutionSparseVoxelDAGs.pdf

归结为场景的静态程度,以及根据你的视觉需求预先烘焙数据的程度。如果您可以预先确定可见性约束(例如Google潜在可见性集)并对其进行整理以便您可以根据请求对其进行流式处理,这将会有所帮助。由于可视化器具有限制,因此您最终会采用一种策略,尽可能快速准确地将一部分数据放入GPU内存中。