2

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

我有许多高度详细的 3d 模型(每个 3M+ 面),这些模型是从需要在浏览器中渲染的真实地形扫描生成的。它们是“不规则的”,不能从网格/DEM 或任何东西渲染。

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

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

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

我尝试了一种简单的方法,当数据发送到 GPU 时,它自然会在帧速率中产生颠簸和毛刺。但我正在寻找一种将所有数据(顶点和三个索引缓冲区)发送到 GPU 内存的方法,然后告诉它使用特定的索引缓冲区进行渲染,比如低分辨率缓冲区,然后切换到 med 或 high res 缓冲区,因为相机越来越近。

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

将不胜感激一些指导,但一般。干杯!

4

1 回答 1

5

您希望根据与相机的距离有效且平稳地改变对象的细节层次 (LOD)。

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

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

geometry.setDrawRange( startIndex, count );

几何图形将被推送到 GPU 一次,更改 LOD 只需更改drawRange制服,它应该是丝般光滑的。

三.js r.75

于 2016-04-14T05:00:19.167 回答