Three.js WebGL 绘制流程(一)

Three.js 中3D 物体 都继承于 Object3D;

而构造一个3D 物体 需要 提供两个对象 即Gemotry 几何体 和 Material 材质。

Gemotry 中 vertices 决定定点的 列表, face 决定面的构成, faceVertexUv 决定 纹理坐标

而Material 不同类型将会采用不同类型的shader 来绘制, 通过 设定Material 的某些材质来开启默认shader的一些属性:例如map 属性将会开启纹理功能

WebGL 中任何的绘制都需要提供shader, Three 自身提供了一些shader 模板, 这些模板和 Three提供的材质类型 以及3D 对象的类型相关;

例如一个Mesh 类型的3D 对象, 通过PlaneGemotry 和 MeshBasicMaterial 来构造, 则 会采用编号为basic的shader

在WebGlRender 这个文件中汇集了绘制的基本逻辑, 而 在ShaderUtil 文件中集中了shader 模板。

一个场景的构成:

Scene  Camera Object

Scene 中一个数组存储了所有Object , 同时其通过继承 Object3D , 将整个场景也构成了一棵树。

所有任何3d对象在加入到场景中时, 都会将入到最终的Scene对象的 内部数组中。

在WebGLRender 中将会对Scene的这个数组进行遍历用于初始化 Shader 和 GPU 中的vertexBuffer texture.

WebGL Render 中的Render函数, 接受 scene 和 camera 作为参数。

首先初始化scene中的所有3d对象的shader 和 buffer, 

 initWebGLObjects

场景初次初始化WebglObject:

     构建场景的webglObjects, webglObjectsImmediate webglSprites webglFlares

     对场景中所有新添加的物体 进行webgl的初始话 addObject  清空场景的新添加的object

    对于场景中 删除掉的物体, 进行webgl的清理 removeObject 清空场景删除的物体

    更新场景中所有的webglObject   updateObject

更新场景中的世界矩阵:

进行一系列照相机的处理(需要细化)

设定绘制的目标, 默认是屏幕, 也可以是其它的framebuffer

绘制所有webgl Object 包括由shader buffer texture 等 构成的一个对象

绘制场景的排序物体, 涉及到 混合效果的物体

绘制场景的立即物体  调用renderObjects  renderObjectsImmediate

需要了解Three 的 webglObjects, webglObjectsImmediate webglSprites webglFlares 几种对象, 以及 sortedList 中的对象的 分别是什么。

To be continued:

      照相机的处理

      Three的几种webgl对象

       renderObjects renderObjectsImmediate 函数

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang