three.js高性能渲染室外场景
大家好,本文在相关文章的基础上,使用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
three.js高性能渲染室外场景的更多相关文章
- Seen.js – 使用 SVG 或者 Canvas 渲染 3D 场景
Seen.js 渲染3D场景为 SVG 或者 HTML5 画布.Seen.js 包含对于 SVG 和 HTML5 Canvas 元素的图形功能的最简单的抽象.所有这个库的其它组件都是不用关心将要渲染的 ...
- THREE.JS(如何想场景中添加物体对象)
这篇主要实现向模型对象中添加头像,并组成一个矩形 一.three.js是什么? 上篇说了点TWEEN这篇又来一根THREE是不是两兄弟啊?还真有点像,当想要做3D动画的时候,可能会考虑用TWEEN的动 ...
- CG Kit探索移动端高性能渲染
内容来源:华为开发者大会2021 HMS Core 6 Graphics技术论坛,主题演讲<CG Kit探索移动端高性能渲染> 演讲嘉宾:华为海思麒麟GPU团队工程师 大家好,我来自华为海 ...
- React Canvas:高性能渲染 React 组
React Canvas 提供了使用 Canvas 渲染移动 Web App 界面的能力,替代传统的 DOM 渲染,具有更接近 Native App 的使用体验.React Canvas 提供了一组标 ...
- 原生js快速渲染dom节点
function renderDom(str){ var _div = document.createElement('div'); _div.innerHTML = str; var dom_tem ...
- template.js 数据渲染引擎
template.js 数据渲染引擎 template.js是一款JavaScript模板引擎,用来渲染页面的. 原理:提前将Html代码放进编写模板 <script id="tpl& ...
- 面试题:js如何渲染十万条数据并不卡住界面
这道题考察了如何在不卡住页面的情况下渲染数据,也就是说不能一次性将几万条都渲染出来,而应该一次渲染部分 DOM,那么就可以通过 requestAnimationFrame 来每 16 ms 刷新一次. ...
- jquery jtemplates.js模板渲染引擎的详细用法第三篇
jquery jtemplates.js模板渲染引擎的详细用法第三篇 <span style="font-family:Microsoft YaHei;font-size:14px;& ...
- jquery jtemplates.js模板渲染引擎的详细用法第二篇
jquery jtemplates.js模板渲染引擎的详细用法第二篇 关于jtemplates.js的用法在第一篇中已经讲过了,这里就直接上代码,不同之处是绑定模板的方式,这里讲模板的数据专门写一个t ...
- jquery jtemplates.js模板渲染引擎的详细用法第一篇
jquery jtemplates.js模板渲染引擎的详细用法第一篇 Author:ching Date:2016-06-29 jTemplates是一个基于JQuery的模板引擎插件,功能强大,有了 ...
随机推荐
- react中引入css的方式有哪几种?区别?
一.是什么 组件式开发选择合适的css解决方案尤为重要 通常会遵循以下规则: 可以编写局部css,不会随意污染其他组件内的原生: 可以编写动态的css,可以获取当前组件的一些状态,根据状态的变化生成不 ...
- webpack中常见的Plugin?解决了什么问题?
一.是什么 Plugin(Plug-in)是一种计算机应用程序,它和主应用程序互相交互,以提供特定的功能 是一种遵循一定规范的应用程序接口编写出来的程序,只能运行在程序规定的系统下,因为其需要调用原纯 ...
- win11设置笔记本合盖不睡眠
win11设置笔记本合盖不睡眠 直接搜索控制面板,类型选择大图标,找到电源选项 点击进入电源选项,然后点击选择电源按钮的功能 然后就可以看到一个关闭盖子时,设置成不采取任何操作 然后就可以了
- 力扣183(MySQL)-从不订购的客户(简单)
题目: 某网站包含两个表,Customers 表和 Orders 表.编写一个 SQL 查询,找出所有从不订购任何东西的客户. Customers 表: Orders 表: 解题思路: 需要查询出没 ...
- 力扣441(java&python)-排列硬币(简单)
题目: 你总共有 n 枚硬币,并计划将它们按阶梯状排列.对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币.阶梯的最后一行 可能 是不完整的. 给你一个数字 n ,计算并返回可形成 完整 ...
- MyBatis源码之前言—JDBC编码存在的问题和Mybatis的介绍
MyBatis源码之前言-JDBC编码存在的问题和Mybatis的介绍 为了方便操作,我们在sjdwz_test数据库下建立一张表: CREATE TABLE `t_student` ( `id` b ...
- 【全观测系列】Elasticsearch应用性能监控最佳实践
简介:本文介绍了应用性能监控的应用价值以及解决方案等. 1.什么是全观测? 要了解全观测,我们先看看传统运维存在哪些问题. 数据孤岛,分散在不同部门,分析排查故障困难: 多个厂商的多种工具,无法自动 ...
- WPF 列表控件数据源绑定多个数据集合方法
在 WPF 用的多的列表控件如 ListBox 或 ListView 等,本文告诉大家在这些列表控件上进行绑定多个数据集合来源的多个实现方法.如有一个显示动物列表的控件,需要绑定的数据来源是阿猫和阿狗 ...
- SpringMVC学习三(静态资源/AJAX功能/乱码问题)
静态资源的映射 Springmvc完成ajax功能 SpringMVC返回中文到ajax乱码问题解决方式 1.静态资源映射 对于之前web.xml配置文件中的 先做出如下更改,不可写"/*& ...
- 1.13~1.14&&放假寄
1.13 3点就放了,手机在机房就能拿到,我为了给手机充会电又多留了一会(事实证明这挺对的) 因为我们是 化微机的班,老师收手机都放在一个箱子里,要有人负责把剩下的手机搬到教室,我走得晚还被当成免费劳 ...