WebGL drawElements 不绘制任何东西
WebGL drawElements not drawing anything
考虑以下代码示例。
Float32List positions = Float32List.fromList([
0.0, 1.0,
-1.0, -1.0,
1.0, -1.0
]);
gl.bindBuffer(WebGL.ARRAY_BUFFER, gl.createBuffer());
gl.bufferData(WebGL.ARRAY_BUFFER, positions, WebGL.STATIC_DRAW);
Uint32List indices = Uint32List.fromList([
0, 1, 2
]);
gl.bindBuffer(WebGL.ELEMENT_ARRAY_BUFFER, gl.createBuffer());
gl.bufferData(WebGL.ELEMENT_ARRAY_BUFFER, indices);
var a_pos = gl.getAttribLocation(shaderProgram, "a_pos");
gl.vertexAttribPointer(a_pos, 3, WebGL.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(a_pos);
gl.clearColor(0.5, 0.5, 0.5, 1.0);
gl.clear(WebGL.COLOR_BUFFER_BIT);
gl.drawElements(WebGL.TRIANGLES, indices.length, WebGL.UNSIGNED_SHORT, 0);
放弃 canvas、上下文、着色器等的常规设置。方法 drawElements
不起作用。屏幕上没有任何显示。
为了完整性检查,我还编写了没有元素数组缓冲区的代码,而是用 drawArrays
绘制了三角形。使用 drawArrays
时,三角形会按预期显示。这告诉我我的着色器代码应该没有问题。
我可能在这里遗漏了什么?
如果元素数组的类型为Uint32List
,则绘制命令必须使用UNSIGNED_INT
类型。请注意,UNSIGNED_SHORT
表示 16 位无符号整数的元素数组,而 UNSIGNED_INT
表示 32 位无符号整数的数组。
gl.drawElements(WebGL.TRIANGLES, indices.length, WebGL.UNSIGNED_INT, 0);
考虑以下代码示例。
Float32List positions = Float32List.fromList([
0.0, 1.0,
-1.0, -1.0,
1.0, -1.0
]);
gl.bindBuffer(WebGL.ARRAY_BUFFER, gl.createBuffer());
gl.bufferData(WebGL.ARRAY_BUFFER, positions, WebGL.STATIC_DRAW);
Uint32List indices = Uint32List.fromList([
0, 1, 2
]);
gl.bindBuffer(WebGL.ELEMENT_ARRAY_BUFFER, gl.createBuffer());
gl.bufferData(WebGL.ELEMENT_ARRAY_BUFFER, indices);
var a_pos = gl.getAttribLocation(shaderProgram, "a_pos");
gl.vertexAttribPointer(a_pos, 3, WebGL.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(a_pos);
gl.clearColor(0.5, 0.5, 0.5, 1.0);
gl.clear(WebGL.COLOR_BUFFER_BIT);
gl.drawElements(WebGL.TRIANGLES, indices.length, WebGL.UNSIGNED_SHORT, 0);
放弃 canvas、上下文、着色器等的常规设置。方法 drawElements
不起作用。屏幕上没有任何显示。
为了完整性检查,我还编写了没有元素数组缓冲区的代码,而是用 drawArrays
绘制了三角形。使用 drawArrays
时,三角形会按预期显示。这告诉我我的着色器代码应该没有问题。
我可能在这里遗漏了什么?
如果元素数组的类型为Uint32List
,则绘制命令必须使用UNSIGNED_INT
类型。请注意,UNSIGNED_SHORT
表示 16 位无符号整数的元素数组,而 UNSIGNED_INT
表示 32 位无符号整数的数组。
gl.drawElements(WebGL.TRIANGLES, indices.length, WebGL.UNSIGNED_INT, 0);