大型 3D 场景流式传输
Posted
技术标签:
【中文标题】大型 3D 场景流式传输【英文标题】:Large 3D scene streaming 【发布时间】:2014-11-07 13:03:46 【问题描述】:我正在开发适用于超大场景显示的 3D 引擎。 渲染本身的 Appart(平截头体剔除、遮挡剔除等),我想知道场景管理的最佳解决方案是什么。
数据以巨大的 3D 网格列表的形式给出,它们之间没有任何关系,所以我无法生成门户,我想...
主要目标是能够在低 RAM (500MB-1GB) 的系统上运行此引擎,并且加载到其中的场景非常大,可以包含数百万个三角形,这会导致非常密集的内存使用。我现在实际上正在使用一个松散的八叉树,在加载时构建,它在中小型场景上运行良好,但是许多场景太大而无法完全适应内存,所以我的问题来了:
您将如何处理场景以动态加载和卸载块(理想情况下是无缝加载),以及确定是否应该加载/卸载块的依据是什么?如果需要,我可以创建自定义文件格式,因为正在使用已知 3D 创作工具上的自定义导出器导出场景。
重要信息:许多场景无法有效地被遮挡,因为它们的构造。 示例:一个非常庞大的管道网络,因此没有太多的遮挡,但元素数量非常多。
【问题讨论】:
【参考方案1】:我认为最好的解决方案将是一个“解决方案包”,一组不同的技术。
如果未加载未使用的级别,详细级别 (LOD) 可以减少内存占用。通过在新旧细节之间使用 alpha 混合,可以或多或少地无缝更改它。最简单的控制器将使用到相机的网格距离。 当对象上传到 GPU(设备)时释放主机内存(RAM),显然释放所有未使用的内存(OpenGL 资源)。 Valgrind 可以在这方面为您提供帮助。 使用低质量网格并使用细分来提高视觉质量。 使用 VBO 索引,这应该会减少 VRAM 的使用并提高性能 尽可能不要使用网格,可以使用高度图来渲染地形。有些东西可以通过程序生成。 使用凹凸或/和法线贴图。这将提高质量,然后您可以减少顶点数。 将这些“管道”分成不同的网格。 带有 2D 图像的虚假 3D 网格:冒名顶替者、天穹......【讨论】:
【参考方案2】:如果纹理要使用大量内存,可以使用诸如 GraniteSDK 之类的商业软件包,它使用虚拟纹理缓存提供基于 LOD 的无缝纹理流式传输。见http://graphinesoftware.com/granite。或者,您可以查看http://ir-ltd.net/
事实上,您可以使用相同的技术从着色器中的纹理数据动态构建多边形,但它会稍微复杂一些。
对于体素,有一种技术可以完全在 GPU 内存中构建八叉树,并分页输入/输出您真正需要的部分。然后可以使用光线投射完成渲染。看到这个帖子:Use octree to organize 3D volume data in GPU,http://www.icare3d.org/research/GTC2012_Voxelization_public.pdf和http://www.cse.chalmers.se/~kampe/highResolutionSparseVoxelDAGs.pdf
这取决于场景的静态程度,以及根据您的可视化需求预烘焙数据的能力。如果您可以预先确定可见性约束(例如 google 潜在可见性集)并组织它以便您可以根据要求对其进行流式传输,这已经很有帮助。由于可视化器会有限制,因此您最终总是会采用一种策略,以尽可能快速准确地将一部分数据放入 GPU 内存中。
【讨论】:
感谢您的回答,不,场景中没有纹理。体素引擎是一个真正的解决方案吗,请记住我的场景只是多边形集,我不知道对象的体积。场景完全是静态的,任何物体都不会移动。但我必须能够按需隐藏一些对象(没什么大不了的) 这取决于对象的类型。如果您渲染多边形并且您希望部分或所有对象具有非常高的细节,那么基于每个对象的基于 LOD 的解决方案可能更合适。如果除了变换矩阵或着色器参数之外,许多对象在几何上都是相同的,请查看实例化渲染(即管道示例)。 如果场景包含大量不同的小物体(例如:~500 000 个物体,每个物体有 ~100-300 个三角形)呢? 如果场景紧凑,您可以构建潜在的可见性列表,以便您可以查询需要预先渲染的对象。如果场景是动态的,那么您需要 dPVS 树。如果你的场景很宽敞(遮挡物相当小),那么 PVS 的增益将太小,解决方案必须来自广告牌、实例渲染、天空盒、关于裁剪部分空间的假设等。您目前正在考虑的对象是多少?以上是关于大型 3D 场景流式传输的主要内容,如果未能解决你的问题,请参考以下文章
将实时视频从我的 c# 应用程序流式传输到 ASP.NET 网页