我正在开发一个3D引擎,适用于非常大的场景显示。除了渲染本身(锥体剔除、遮挡剔除等)之外,我想知道场景管理的最佳解决方案是什么。
数据是以3D网格的巨大列表形式给出的,它们之间没有关系,所以我不能生成门户,我认为……
主要目标是能够在低RAM (500MB-1 1GB)的系统上运行此引擎,并且加载到其中的场景非常大,可以包含数百万个三角形,这会导致非常密集的内存使用。实际上,我现在正在使用一个松散的八叉树,在加载时构建,它在中小型场景中工作得很好,但许多场景太大了,无法完全放入内存中,所以我的问题来了:
你将如何处理动态加载和卸载块的场景(理想情况下是无缝的),以及你将基于什么来确定是否应该加载/卸载块?如果需要,我可以创建自定义文件格式,因为场景是使用已知3D创作工具上的自定义导出器导出的。
重要信息:许多场景不能被有效遮挡,因为它们的构造。例如:一个非常大的管网,所以没有太多的遮挡,但有非常多的元素。
发布于 2014-09-19 07:47:27
我认为最好的解决方案将是“解决方案包”,一组不同的技术。
如果未加载未使用的级别,
发布于 2014-09-19 17:40:46
如果纹理要使用大量的ram,则可以使用商业软件包,例如GraniteSDK,它使用虚拟纹理缓存提供无缝的基于详细等级的纹理流。参见http://graphinesoftware.com/granite。或者,您可以查看http://ir-ltd.net/
事实上,你可以使用相同的技术从着色器中的纹理数据中动态构建多边形,但这将会有点复杂。
对于体素,有一种技术可以完全在GPU内存中构建oct树,并对您真正需要的部分进行分页。然后可以使用光线投射来完成渲染。请看这篇文章: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内存中。
https://stackoverflow.com/questions/25823729
复制相似问题