立方体
使用drawArrays绘制立方体
一个立方体一共8个顶点,6个面,12个三角形。
Mode | Vertex Number | Draw Time |
---|---|---|
TRIANGLES | 36 | 1 |
TRIANGLE_FAN | 24 | 6 |
TRIANGLE_STRIP | 14 | 1 |
通过顶点索引绘制物体
drawElements
drawArrays和drawElements区别
最重要的区别就在于drawElements需要指定顶点的索引值,
因此使用的是 gl.ELEMENT_ARRAY_BUFFER 而不是gl.ARRAY_BUFFER。
- drawArrays就像班级里老师直接叫名字给同学安排座位
- drawElements更像学校里通过学号安排考场
关于第三个参数type的注意点
需要注意的是type参数和gl.ELEMENT_ARRAY_BUFFER的数据类型不一致,也不会报错,
但是可能会绘制出一些不可名状之物。
HelloCubes Code
1 | let VSHADER_SOURCE = ` |
1 | function main() { |
1 | function initVertexBuffers(gl) { |
顶点索引的写入
顶点索引数组的类型是怎么确定的?
1 | let indices = new Int8Array([ |
答: 需要顶点个数来确定,Int8Array类型可以用来绘制256个顶点。
gl.ELEMENT_ARRAY_BUFFER和gl.ARRAY_BUFFER的内容是如何产生联系的?
gl.drawElements的n参数表示的是什么的个数?
1 | gl.drawElements(gl.TRIANGLES,n,gl.UNSIGNED_BYTE,0); |
答: n表示顶点索引数组的长度。
通过索引来访问顶点数据的优缺点是什么?
优点
能够循环利用顶点信息,控制内存的开销。
缺点
需要通过索引来间接地访问,某种程度上使程序复杂化了。
为立方体的每个表面指定颜色
需要创建多个坐标相同,颜色不同的顶点
立方体的一个顶点同时在三个平面的交点处,因此需要设置3个坐标相同,颜色不同的顶点。
这样一共就需要创建3*8=24个顶点。
ColoredCube
1 | let VSHADER_SOURCE = ` |
1 | function main() { |
1 | function initVertexBuffers(gl) { |
1 | function initArrayBuffer(gl, data, num, type, attribute) { |
纯白盒子
1 | let colors = new Float32Array([ |