threejs 中细节级别 (LOD) 网格的 3D 渲染性能/管道

3D rendering performance / pipeline for level of detail (LOD) meshes in threejs

只是在寻找一些一般性的指导,我已经有很长时间没有摆弄过任何 3D 的东西了,如果你原谅这个可怕的双关语,景观已经发生了很大的变化。

我有许多非常详细的 3d 模型(每个模型超过 300 万张面孔)是根据需要在浏览器中渲染的真实地形扫描生成的。它们是 'irregular' 并且不能从 grid/DEM 或任何东西呈现。

我已将模型划分为较小的对象并为每个对象生成 LOD(3 个级别),这会生成一组公共顶点和三个索引缓冲区,这些索引缓冲区引用了我逐渐流式传输到 JS 客户端的部分或全部顶点。

我打算通过根据距相机的距离为每个对象指定 LOD,渲染一帧 500k - 1M 多边形之间的某处。

所以我的问题是,如何在这些级别之间高效切换?

我已经尝试过这种天真的方法,当数据被发送到 GPU 时,这种方法自然会在帧速率中产生颠簸和故障。但我正在寻找一种方法将所有数据(顶点和三个索引缓冲区)发送到 GPU 内存,然后告诉它使用特定的索引缓冲区进行渲染,比如低分辨率缓冲区,然后切换到中或高res 缓冲区随着相机越来越近。

Three.LOD() 解决方案对我来说似乎没有任何用处,因为它只会产生与我天真的解决方案相同的 fps 故障。

希望得到一些指导,无论多么笼统。干杯!

您想根据与相机的距离高效、平滑地改变对象的细节层次 (LOD)。

根据您的用例,一种解决方案是为每个对象创建一个 BufferGeometry,其中包含所有三个级别的详细信息。换句话说,您将使用 "indexed" 缓冲区几何,指定共享顶点数组,并将三个索引数组连接成一个。

然后,设置 BufferGeometrydrawRange 属性 以渲染您想要的 LOD 面孔。

geometry.setDrawRange( startIndex, count );

几何图形会被推送到GPU一次,改变LOD只是简单的改变drawRange,一个统一的,应该是丝般光滑的。

three.js r.75