优化Three.js性能:提升WebGL渲染效率

LOD技术

废话

当渲染顶点信息时,WebGL 将这些顶点信息发送到 GPU 中,并使用着色器程序来处理这些顶点信息并最终将它们渲染到屏幕上。在渲染过程中,GPU 对每个顶点执行各种操作,如变换、光照计算、纹理映射等,然后将结果输出到屏幕上。这就意味着,顶点信息越多对于GPU的压力越大,threejs官网提供# 多细节层次(LOD,Levels of Detail)用于优化这种情形,主要原理是通过addLevel添加一个层级,每个层级都对应一个几何体或者模型,对应不同的层级显示不同细节的几何体(如图)。随着相机与模型的距离变化,LOD 对象会自动切换到最适合的模型细节级别,以在远处绘制较简单的模型,在近处绘制更详细的模型。

lod需要动态更新相机,可以在每一帧中调用 LOD 对象的 update(camera) 方法,以更新当前相机位置并根据相机距离选择适当的模型细节级别

示意图

image.png

代码

代码中分别创建了一个细分数为8和细分数为32的球几何体,在距离为100以上的时候,加载lowDetailMesh模型,低于100的时候加载highDetailMesh模型

```typescript const initLod = () => { var lowDetailGeometry = new THREE.SphereGeometry(10, 8, 8); var highDetailGeometry = new THREE.SphereGeometry(10, 32, 32); var lowDetailMesh = new THREE.Mesh(lowDetailGeometry, material); var highDetailMesh = new THREE.Mesh(highDetailGeometry, material); // 距离50的时候加载lowDetailMesh模型 lod.addLevel(lowDetailMesh, 100); // 距离10的时候加载highDetailMesh模型 lod.addLevel(highDetailMesh, 50);

} `` render方法中计算出相机距离var distance = camera.position.distanceTo(lod.position);,并更新lodlod.update(camera);`

```ts let render = () => { controls.update() camera.updateProjectionMatrix()

// 获取相机距离
var distance = camera.position.distanceTo(lod.position);
if (cameraDistanceDom) {
    cameraDistanceDom.innerText = `距离:${Math.floor(distance)}`
}
renderer.render(scene, camera)
stats.update()
// 更新lod
lod.update(camera);
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙华鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值