2017-02-22 214 views
2

我想提高我的webgl技能,并认为最好的学习方法是通过查看three.js Three.js。我知道如何创建和绑定缓存,着色器etc.But什么是我寻找的是如何做three.js所管理的例如结合缓冲过程Three.js缓冲区管理

gl.createBuffer 
gl.bindBuffer 
gl.bufferData 

有人能解释three.js所如何做下的工作油烟机?

+0

Three.js用于在[WebGLRenderer.js](https://github.com/mrdoob/three.js/blob/dev/src/renderers/WebGLRenderer.js)中创建大部分内容。你建立所有的数据(几何体,材质,网格,场景,灯光),然后three.js查看并创建缓冲区,着色器等等。你可以搜索['createBuffer'](https://github.com) /mrdoob/three.js/search?utf8=%E2%9C%93&q=createBuffer)来查找创建缓冲区的地方。搜索'bindBuffer'和/或'bufferData'。 – gman

回答

2

此答案适用于Three.js r84。

three.js所使用3种类型的几何形状:

Geometry存储几何参数(顶点,法线,色彩,.. )以一种用户友好的方式。 BufferGeometryBufferAttribute中的几何存储起来,它们只是缓冲区的包装(或typed arrays),其中包含通常使用gl.bufferData()发送的数据。
DirectGeometry仅用于转换从GeometryBufferGeometry

基本上,公共three.js所渲染器,WebGLRenderer,与BufferGeometry而用Geometry用户的交易的交易。

但是,只要您不渲染场景,就不会执行几何转换,也不会向GPU发送任何内容。 (没有创建缓冲区)。

为了防止引擎使用WebGL特定的东西(如缓冲区)污染用户空间,Three.js实现了一些包含在渲染器中的包装。其中两种包装是:

用户对象和这些包装内的对象之间的映射通过uuid属性完成。

当请求渲染时,渲染器浏览场景的所有对象。如果一个对象uuid不存在于其中一个包装中,则会执行一些处理并存储转换后的对象。

这就是事情变得有趣,因为这是一个对象的Geometry转换为BufferGeometryWebGLGeometries包装内部与BufferGeometry使用您列出的功能转化为一个或多个WebGLBufferWebGLAttributes包装内:

gl.createBuffer(); 
gl.bindBuffer(); 
gl.bufferData(); 

查询此file找到实际的电话。

此外,当像Geometry这样的对象更新时,其version计数器会增加,以致它不再匹配在包装器中编写的version。渲染器然后知道它应该更新包装的对象。

最后,当一个对象被添加到一个包装,一个监听器,使得当一个对象被删除的呈示得到通知,从而可以配置被包装的对象连接到它。