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

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

代码: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高性能渲染室外场景的更多相关文章

  1. Seen.js – 使用 SVG 或者 Canvas 渲染 3D 场景

    Seen.js 渲染3D场景为 SVG 或者 HTML5 画布.Seen.js 包含对于 SVG 和 HTML5 Canvas 元素的图形功能的最简单的抽象.所有这个库的其它组件都是不用关心将要渲染的 ...

  2. THREE.JS(如何想场景中添加物体对象)

    这篇主要实现向模型对象中添加头像,并组成一个矩形 一.three.js是什么? 上篇说了点TWEEN这篇又来一根THREE是不是两兄弟啊?还真有点像,当想要做3D动画的时候,可能会考虑用TWEEN的动 ...

  3. CG Kit探索移动端高性能渲染

    内容来源:华为开发者大会2021 HMS Core 6 Graphics技术论坛,主题演讲<CG Kit探索移动端高性能渲染> 演讲嘉宾:华为海思麒麟GPU团队工程师 大家好,我来自华为海 ...

  4. React Canvas:高性能渲染 React 组

    React Canvas 提供了使用 Canvas 渲染移动 Web App 界面的能力,替代传统的 DOM 渲染,具有更接近 Native App 的使用体验.React Canvas 提供了一组标 ...

  5. 原生js快速渲染dom节点

    function renderDom(str){ var _div = document.createElement('div'); _div.innerHTML = str; var dom_tem ...

  6. template.js 数据渲染引擎

    template.js 数据渲染引擎 template.js是一款JavaScript模板引擎,用来渲染页面的. 原理:提前将Html代码放进编写模板 <script id="tpl& ...

  7. 面试题:js如何渲染十万条数据并不卡住界面

    这道题考察了如何在不卡住页面的情况下渲染数据,也就是说不能一次性将几万条都渲染出来,而应该一次渲染部分 DOM,那么就可以通过 requestAnimationFrame 来每 16 ms 刷新一次. ...

  8. jquery jtemplates.js模板渲染引擎的详细用法第三篇

    jquery jtemplates.js模板渲染引擎的详细用法第三篇 <span style="font-family:Microsoft YaHei;font-size:14px;& ...

  9. jquery jtemplates.js模板渲染引擎的详细用法第二篇

    jquery jtemplates.js模板渲染引擎的详细用法第二篇 关于jtemplates.js的用法在第一篇中已经讲过了,这里就直接上代码,不同之处是绑定模板的方式,这里讲模板的数据专门写一个t ...

  10. jquery jtemplates.js模板渲染引擎的详细用法第一篇

    jquery jtemplates.js模板渲染引擎的详细用法第一篇 Author:ching Date:2016-06-29 jTemplates是一个基于JQuery的模板引擎插件,功能强大,有了 ...

随机推荐

  1. SQL SERVER 数据库性能优化与管理从零基础到走两步系列(一)——性能计数器

    前辈大佬资料: 使用性能监视器找出SQLServer硬件瓶颈 在网络上苦苦流浪了近十几个小时,从百度到谷歌,从CSDN到博客园,从知乎到微信读书,看了无数本滥竽充数的书,读了无数篇夹生的技术文章,快下 ...

  2. 使用ollama + AnythingLLM快速且简单的在本地部署llm3

    使用ollama + AnythingLLM快速且简单的在本地部署llm3 不多说,直接开始 一.安装ollama ollama官网:https://ollama.com/ 下载地址:https:// ...

  3. 5G新基建 边缘计算乘风破浪

    作者 | 张羽辰(同昭)阿里云交付专家 导读:如今,几乎所有的事情都离不开软件,当你开车时,脚踩上油门,实际上是车载计算机通过力度感应等计算输出功率,最终来控制油门,你从未想过这会是某个工程师的代码. ...

  4. 网易游戏基于 Flink 的流式 ETL 建设

    简介: 网易游戏流式 ETL 建设实践及调优经验分享- 网易游戏资深开发工程师林小铂为大家带来网易游戏基于 Flink 的流式 ETL 建设的介绍.内容包括: 专用 ETL EntryX 通用 ETL ...

  5. [GPT] 用dogecoin接受付款,如何实现收款回调,不借助中心化的第三方

      要在不借助中心化的第三方的情况下实现Dogecoin的收款回调,您可以按照以下步骤进行操作: 1. 设置一个用于接收收款回调的URL:您需要在您的网站或应用程序中设置一个用于接收收款回调的URL. ...

  6. WPF 加载诡异的字体无法布局

    如果在系统里面存在诡异的字体,同时自己的 WPF 中有一个控件尝试使用这个字体放在界面中,那么将会在界面布局过程炸了,整个控件或者整个界面布局都无法继续 本文本来是由吕水大大发布的,但是他没空写,于是 ...

  7. 2019-10-31-win10-uwp-录制任意应用屏幕

    title author date CreateTime categories win10 uwp 录制任意应用屏幕 lindexi 2019-10-31 09:10:38 +0800 2019-10 ...

  8. C#的基于.net framework的Dll模块编程(四) - 编程手把手系列文章

    这次继续这个系列的介绍: 一.命名空间的起名: 对于C#来说,一般命名空间的建议是:公司名(或个人名称).产品名.分类名,比如我这边是用的这个:Lzhdim.LPF.Helper,意思是个人名Lzhd ...

  9. 使用 Docker 自建一款怀旧游戏之 - 扫雷

    1)扫雷 简介 扫雷 是一种经典的单人电脑游戏,最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中.游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块,而不触发地雷.每个方 ...

  10. 【YoloDeployCsharp】基于.NET Framework的YOLO深度学习模型部署测试平台

    1. 项目介绍    基于.NET Framework 4.8 开发的深度学习模型部署测试平台,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det.Seg.Pose.Obb ...