drawArray
仅使用一个或多个
ARRAY_BUFFER
从按顶点在缓冲区中的顺序绘制顶点的位置,从
first
的参数
count
参数
drawElements
使用一个或多个
ARRAY\u缓冲区
和
一
ELEMENT_ARRAY_BUFFER
其中包含指向
ARRAY\u缓冲区
要绘制的顶点。在里面
抽屉元件
这个
计数
参数指定要在
元素数组缓冲区
虽然
offset
元素数组缓冲区
(通常
FirstIndex*sizeof(type)
哪里
type
UNSIGNED_BYTE
(1字节),
UNSIGNED_SHORT
(2字节)或
UNSIGNED_INT
(4字节)。
元素数组缓冲区
:
[0][1][2][1][2][0][1][2][3][3][1][2][3][4][5][...
ARRAY\u缓冲区
:
| 0 | 1 | 2 | 3 | 4 | ...
[x][y][z][x][y][z][x][y][z][x][y][z][x][y][z][...
为了正常工作
+
count*sizeof(type)
不应大于
元素数组缓冲区
大小(字节)。此外,元素索引
元素数组缓冲区
应小于中包含的顶点数
ARRAY\u缓冲区
.
喜欢
绘图阵列
这个
抽屉元件
将当前绑定的缓冲区(配置了属性指针)作为数据源。与的区别
您必须使用
元素数组缓冲区
目标,就像这样:
gl.bindBuffer(gl.ARRAY_BUFFER, myVerticesA);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, myIndicesA);
// configure attributes pointers here
gl.drawElements(gl.TRIANGLES, 12345, gl.UNSIGNED_SHORT, 0);
“如何”
抽屉元件
将在
ARRAY\u缓冲区
元素数组缓冲区
取决于您如何配置属性指针。
假设具有交错位置、法线和纹理坐标的以下顶点缓冲区:
| p0 || n0 || t0 || p1 || n1 || t1 |
[px][py][pz][nx][ny][nz][tu][tv][px][py][pz][nx][ny][nz][tu][tv][...
我们将属性指针定义如下:
let stride = 8*4; // 8*float (8 * 4 bytes)
let offp = 0; // positions at beginning
let offn = 3*4; // normals after 3*float position.
let offt = 6*4; // tex coords after 3*float position + 3*float normal
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, stride, offp);
gl.vertexAttribPointer(1, 3, gl.FLOAT, false, stride, offn);
gl.vertexAttribPointer(2, 2, gl.FLOAT, false, stride, offt);
使用元素(索引)缓冲区,GL将根据存储在
元素数组缓冲区
缓冲区:
// pseudo-code
for(let i = start_elem; i < start_elem+count_elem; i++) {
let index = ELEMENT_ARRAY_BUFFER[i];
attrib[0] = ARRAY_BUFFER[(index*stride)+offp];
attrib[1] = ARRAY_BUFFER[(index*stride)+offn];
attrib[2] = ARRAY_BUFFER[(index*stride)+offt];
}