只是寻找一些一般性指导,距离我玩弄3D东西已经很长时间了,如果您原谅这令人讨厌的双关语,情况也发生了很大变化。
我有许多高度真实的3d模型(每个3M +面)是根据实际地形扫描生成的,需要在浏览器中进行渲染。它们是“不规则的”,不能从网格/ DEM或其他任何对象进行渲染。
我已将模型划分为较小的对象,并为每个对象(3个级别)生成了LOD,这将生成一组通用的顶点和三个索引缓冲区,这些索引缓冲区引用了我逐步流向JS客户端的部分或全部顶点。
我打算通过根据与相机的距离为每个对象指定LOD来渲染介于500k-1M多边形之间的某帧。
所以我的问题是,如何有效地在这些级别之间切换?
我尝试过一种幼稚的方法,当将数据发送到GPU时,它自然会在帧速率中产生凹凸。但是我一直在寻找一种方法,将所有数据(顶点和三个索引缓冲区)发送到GPU内存,然后告诉它使用特定的索引缓冲区(例如低分辨率缓冲区)进行渲染,然后切换到med或high随着相机的靠近,res缓冲区开始缓冲。
Three.LOD()解决方案对我似乎没有任何用处,因为它只会产生与我的幼稚解决方案相同的fps毛刺。
将不胜感激一些指导,但一般。干杯!
最佳答案
您想根据与摄像机之间的距离有效而平稳地改变对象的细节水平(LOD)。
给定您的用例,一种解决方案是为每个对象创建一个包含所有三个详细级别的BufferGeometry
。换句话说,您将使用“索引”缓冲区几何体,指定共享顶点的数组,并将三个索引数组归为一个。
然后,设置drawRange
的BufferGeometry
属性以呈现所需的LOD的面。
geometry.setDrawRange( startIndex, count );
几何将被推送到GPU一次,更改LOD只需更改
drawRange
,即均匀的制服,应该如丝般光滑。three.js r.75
关于three.js - threejs中的3D渲染性能/管线以用于细节级别(LOD)网格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36613604/