绘制多个点
三维模型的基本单位是什么?
答: 三角形 △
不管三维模型的形状多么复杂,基本组成单位都是三角形。
只不过复杂的模型由更多的三角形构成而已。
MultiPoint
缓冲区对象(buffer object)
如果你要绘制一个图形,你需要一次性的将图形的顶点全部传入Vertex_Shader。
缓冲区对象 支持一次性地向shader传入多个顶点的数据。
它是WebGL系统中的一块内存区域。
MultiPoints Code
1 |
|
1 | // 顶点着色器 |
使用缓冲区对象流程
缓冲区对象是WebGL系统中的一块存储区。
- 创建缓冲区对象
gl.createBuffer()
1 | var vertexBuffer = gl.createBuffer(); |
- 绑定缓冲区对象
gl.bindBuffer()
1 | gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); |
- 将数据写入缓冲区对象
gl.bufferData()
1 | gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW); |
- 将缓冲区对象分配给一个attribute变量
gl.vertexAttribPointer()
1 | var a_Position = gl.getAttribLocation(gl.program,'a_Position'); |
- 开启attribute变量
gl.enableVertexAttribArray()
1 | gl.enableVertexAttribArray(a_Position); |
步骤分解
1. 创建缓冲区对象
gl.createBuffer()
缓冲区对象可以被
创建 和 删除 。
2. 绑定缓冲区对象
gl.bindBuffer()
将 缓冲区对象 绑定到WebGL系统中已经存在的 target 上,
这个 target 表示 缓冲区对象的用途。
3. 写入缓冲区对象
gl.bufferData()
不能直接向缓冲区写入数据,只能向与缓冲区绑定的目标写入数据。
4. 分配attribute变量给缓冲区对象
gl.vertexAttribPointer()
vertexAttribPointer可以将整个缓冲区对象的引用分配给attribute变量
5. 开启attribute对象
gl.enableVertexAttribArray()
通过enableVertexAttribArray,
缓冲区对象和attribute变量之间的连接就真正建立起来了。
enableVertexAttribArray函数名会让很多人误解它是用于处理顶点的,这是由于继承自OpenGL。
缓冲区对象与attribute变量之间的连接可以通过 enableVertexAttribArray 建立,
同时也可以通过 disableVertexAttribArray 关闭。
6. 开始绘制
gl.drawArrays()
shader的执行次数与drawArrays的count参数相一致。
下面是2个对于gl.drawArrays函数的小实验:
drawArrays(gl.POINTS,0,1)
drawArrays(gl.POINTS,1,2)
类型化数组
WebGL中的很多操作都要用到类型化数组。
提示:
- 类型化数组不支持 push 和 pop 。
- 创建类型化数组的唯一方法就是使用 new运算符 。