three.js高性能渲染室外场景

three,js · 浏览次数 : 0

小编点评

你好!很高兴为你提供关于three.js在室外场景渲染优化的文章。下面是文章的目录和一些关键点: 目录 1. 引言 2. 示例代码 3. 高性能渲染 4. 关键技术 5. 改进方向 6. 参考资料 亮点 本篇示例代码的核心在于利用Instanced Draw(批处理绘制)、LOD(分级细节)、Frustum Cull(视锥剔除)技术,实现了对室外场景中树、草、地形等多种类物体的高性能渲染。通过这些技术的运用,可以在PC端和移动端流畅渲染大场景,同时在移动端实现良好的用户体验。 关键技术 1. Instanced Draw:通过批处理绘制技术,对多个相同对象执行相同的渲染操作,提高渲染效率。 2. LOD:根据物体距离观察者的远近,使用不同精细程度的三角形网格和材质渲染,以实现不同程度的细节展示和性能优化。 3. Frustum Cull:视锥剔除是一种空间剔除算法,通过计算目标物体与视锥的相交关系,剔除掉摄像机无法观察到的物体。 改进方向 当前实现的室外场景存在一些局限性,例如,对于超大规模的场景,则需要采用多块地形、四叉树等数据结构和加速结构来提高渲染效率。 参考资料 1. [three.js官方文档](https://threejs.org/) 2. [三维图形学入门教程 - 鸟瞰图层](https://www.yuque.com/tech-at这三年的webgl2-b035e59c3e43) 希望这个回答能够帮助到你,如有其他问题请随时提问。

正文

大家好,本文在相关文章的基础上,使用three.js渲染了高性能的室外场景,在移动端也有较好的性能,并给出了代码,分析了关键点,感谢大家~

关键词:three.js、Web3D、WebGL、室外场景、Instanced Draw、大场景、LOD、Frustum Cull、优化、开源

image

代码:Github

相关文章:
three.js实现数字孪生3D仓库一期(开源)
three.js使用Instanced Draw+Frustum Cull+LOD来渲染大场景(开源)
基于three.js的Instanced Draw+LOD+Frustum Cull的改进实现

我正在承接Web3D数字孪生项目,具体介绍可看承接各种Web3D业务

加QQ群交流:106047770

亮点

本文的亮点是基于Instanced Draw+LOD+Frustum Cull优化,能够高性能地渲染树、草等室外物体;并且实现了基本的地形

本文代码能在PC端、移动端流程运行

height map

基于height map实现地形,能根据x、z坐标从height map中插值,获得y坐标(地形高度)

color map

预读取color map,作为顶点颜色,代替多层纹理(为了性能考虑),可用来实现 道路 等效果

基础纹理

为了性能考虑,只加入一张纹理,以repeat的方式铺在地形上,使其与顶点颜色叠加

光照

地形使用MeshPhongMaterial材质,Phong光照

加入第三人称人物

加入第三人称人物,实现方式详见实现人物

相机与地形 碰撞检测

相机移动时,不应该插入到地形中

最开始我是根据height map更新相机的y坐标,具体参考地形碰撞

这样做的问题是如果地形过高,可能导致相机拉得太高了;而且会有相机抖动的问题

所以,我改为加入地形Collider(立方体),让相机与Collider进行碰撞处理,具体详见three.js实现相机碰撞,相机不穿墙壁、物体

本文只加入了一个Collider,并以绿色的立方体来显示(实际上应该不可见)

人物与地形 碰撞检测

跟相机一样,人物也与地形Collider进行碰撞检测

加入树

基于Instanced Draw+LOD+Frustum Cull来加入树

加入草

草直接使用billboard+Instanced Draw+Frustum Cull来渲染

人物与树 碰撞检测

使用八叉树保存树,使人物与八叉树进行碰撞检测

改进方向

下面是对地形的改进方向:

  • 超大地形
    目前地形只有一块,如果是开放世界的话,应该是多块地形;
    应该用四叉树作为加速结构来实现Frustum Cull;
    应该实现LOD(不同lod的三角面数不同,material也不同,如近的lod应该使用多层纹理+color map,远的lod只使用color map)
    参考:
    Tutorial 18: Large Terrain Rendering

  • 多层纹理

  • 加入normal map,显示细节

  • 加入水

地形的系列教程如下:

DirectX 11 Terrain Tutorials
DirectX 11 Terrain Tutorials - Series 2

参考资料

Use Tri-Planar Texture Mapping for Better Terrain

多层纹理(Multilayered Terrain)

与three.js高性能渲染室外场景相似的内容:

three.js高性能渲染室外场景

大家好,本文在相关文章的基础上,使用three.js渲染了高性能的室外场景,在移动端也有较好的性能,并给出了代码,分析了关键点,感谢大家~ 关键词:three.js、Web3D、WebGL、室外场景、Instanced Draw、大场景、LOD、Frustum Cull、优化、开源 代码:Githu

Three.js使用InstancedMesh实现性能优化

本文记述在three.js中使用InstancedMesh来实现绘制大量几何体的性能优化

Three.js中实现对InstanceMesh的碰撞检测

1. 概述 之前的文章提到,在Three.js中使用InstanceMesh来实现性能优化,可以实现单个Mesh的拾取功能 那,能不能实现碰撞检测呢?肯定是可以的,不过Three.js中并没有直接的API可以实现对InstanceMesh的碰撞检测,需要手动实现 回顾本文的描述的Three.js的场

第135篇:Three.js基础入门

好家伙,这东西太帅了,我要学会 先放张帅图(都是用three.js做出来的,这我学习动力直接拉满) 还有另外一个 Junni is... 帧数太高,录不了 开始学习 官方文档 1.Three.js是什么? Three.js是一款运行在浏览器中的 3D 引擎(基于WebGL的API的封装),你可以用它

three.js实现相机碰撞,相机不穿墙壁、物体

大家好,本文实现了相机碰撞检测,使相机不穿墙壁、物体,并给出了思路和代码,感谢大家~ 关键词:数字孪生、three.js、Web3D、WebGL、相机碰撞、游戏相机 我正在承接Web3D数字孪生项目,具体介绍可看承接各种Web3D业务 目录实现原理参考资料 实现前: 移动第三人称相机时,相机可能会穿

Three.js中实现一个OBBHelper

本文参考Box3Helper源码,并写出一个OBBHelper

如何使用webgl(three.js)实现煤矿隧道、井下人员定位、掘进面、纵采面可视化解决方案——第十九课(一)

three.js、webgl、3D煤矿隧道、三维井下人员定位、掘进面三维可视化、纵采面可视化、采集面可视化展示、设备检测、数字孪生、物联网3D、3d建筑、3d库房,bim管理系统

Three.js的基础使用

本文描述Three.js的基础使用与搭建一个场景

Three.js实现可透视的水面效果

本文描述使用Three.js实现可透视的水面效果

Three.js中实现碰撞检测

本文就如何在Three.js中进行碰撞检测进行记述