threejs Web端显示引擎介绍
Posted CADGraphics
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了threejs Web端显示引擎介绍相关的知识,希望对你有一定的参考价值。
一、threejs的入门Code。
const canvas = document.querySelector('#c');
const renderer = new THREE.WebGLRenderer({canvas});
const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
const scene = new THREE.Scene();
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({color: 0x44aa88});
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
renderer.render(scene, camera);
canvas:HtmlElement,用于给3D场景提供Context上下文,嵌入到前端的页面中。
camera:相机对象。
scene:场景树,表示整个3D的场景,场景节点由group和mesh组成,group可以理解为一个集合。
geometry:渲染的几何对象,主要是由三角面片组成。
mesh:scene场景树中的节点,mesh由几何和材质组成。
renderer:threejs中的渲染器,执行整个渲染流程。
threejs的API比较简单,很适合初学者去使用,如果对JavaScript不熟悉,还可以使用TypeScript去编写,并且3D部分的代码可以与前端的代码独立分离。我们来看一下threejs显示的一个比较好看的场景。
二、threejs中的材质对象
1. MeshBasicMaterial
2. MeshLambertMaterial
3. MeshPhongMaterial
该材质是对当前模型中的深度进行显示,在做图形后处理时,如果想查看当前场景中的深度渲染是否正确,可以采用该材质来对深度进行可视化。
该材质是自定义shader的实现,如果需要实现一个自定义的shader效果,可以通过继存该材质并写自己编写shader的code来实现。
三、threejs渲染引擎流程
threejs虽然是用JavaScript来实现的,但是很适合初学者去学习。如果想要了解一个图形渲染引擎的实现,建议大家去读一下它的源码。我们接下来看看它渲染的一帧到底做了那些工作。threejs的WebGLRenderer对象的render()函数是对场景的一帧渲染。我挑选一些其关键的Code如下:
if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
if ( camera.parent === null ) camera.updateMatrixWorld();
_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
_frustum.setFromProjectionMatrix( _projScreenMatrix );
currentRenderList.init();
projectObject( scene, camera, 0, _this.sortObjects );
if ( _this.sortObjects === true ) currentRenderList.sort( _opaqueSort, _transparentSort );
currentRenderState.setupLights();
background.render( currentRenderList, scene );
if ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );
if ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );
简单分析下:
Line1:更新场景中的节点的世界坐标系的矩阵。
Line2:更新相机的矩阵。
Line3:相机投影矩阵的更新。
Line4:视锥体的构建用于后续的视锥裁剪。
Line5:RenderList对象初始化,把threejs的树状场景结构转换成平铺的List的结构。
Line6:projectObject会构建最终RenderList对象的渲染集合。
Line7:透明和非透明对象分类并排序。
Line8:灯光的初始化。
Line9:背景的渲染,比如天空盒CubeMap的绘制。
Line10:渲染不透明对象。
Line11:渲染半透明及透明对象。
四、threejs的后处理
上面我们介绍的是一帧的渲染,图形的后处理是指的场景并不是通过一帧就渲染结束,而是通过渲染多帧形成多个帧缓存(FrameBuffer),并组合FrameBuffer来形成最终的场景。比如我们常见的SSAO的实现,SSAO是计算当前像素是否被周围的像素的遮挡程度,从而形成明暗的效果,增加场景的真实性。SSAO的计算则是通过多帧组合形成的,渲染第一帧拿到当前场景深度的FrameBuffer,第二帧拿第一帧的深度信息,结合法线等信息进行SSAO遮蔽因子的计算。
threejs其实并没有提供一个后处理的框架,不过在其example中可以找到EffectComposer对象,该对象可以增加多个Pass,每个Pass可以关联Shader材质,每个Pass可以理解为一帧,下一个Pass可以使用上一个Pass的结果。后处理其实是非常有意思的,逼真的3D场景基本上都是通过后处理形成的,我们看看SSAO的效果吧。
五、总结
以上是关于threejs Web端显示引擎介绍的主要内容,如果未能解决你的问题,请参考以下文章