我正在尝试在 WebGL 2 中进行实例化。我想使用内置变量gl_InstanceID
来索引到统一的浮点数组中。
我收到以下错误:
glDrawElementsInstancedANGLE: attempt to draw with all attributes having non-zero divisors
WebGL 2 实例化中唯一允许使用顶点属性的实例化(实例化数组)吗?
另外,规范是了解这些功能的唯一明确的地方吗?
根据下面的错误报告,这个问题似乎已得到解决。这是一个小工作示例
function main() {
const gl = document.querySelector('canvas').getContext('webgl2');
if (!gl) {
return alert('need webgl2');
}
const vs = `#version 300 es
void main() {
float angle = float(gl_InstanceID) / 10.0 * 2.0 * radians(180.0);
float radius = float(gl_VertexID + 1) / 4.0 * 0.8;
gl_Position = vec4(vec2(sin(angle), cos(angle)) * radius, 0, 1);
gl_PointSize = mix(5.0, 20.0, float(gl_VertexID) / 3.0);
}
`;
const fs = `#version 300 es
precision highp float;
out vec4 foo;
void main() {
foo = vec4(1, 0, 0, 1);
}
`;
const prg = twgl.createProgram(gl, [vs, fs]);
gl.useProgram(prg);
gl.drawArraysInstanced(gl.POINTS, 0, 4, 10);
}
main();
Run Code Online (Sandbox Code Playgroud)
<canvas></canvas>
<script src="https://twgljs.org/dist/4.x/twgl.min.js"></script>
Run Code Online (Sandbox Code Playgroud)
该规范说它是基于OpenGL ES 3.0 spec
本文档的其余部分旨在结合 OpenGL ES 3.0 规范(撰写本文时为 3.0.4,可从Khronos OpenGL ES API 注册表获取)来阅读。除非另有说明,否则每个方法的行为均由 OpenGL ES 3.0 规范定义。为了确保互操作性或安全性,该规范可能与 OpenGL ES 3.0 有所不同,通常定义 OpenGL ES 3.0 保留实现定义的区域。WebGL 和 OpenGL ES 3.0 之间的差异部分总结了这些差异。
不幸的是,他们似乎忘记指定至少一个属性必须具有非零除数,这与 OpenGL ES 3.0 不同。我提交了一个错误
需要添加的部分是
如果不存在至少一个启用的顶点属性数组,其 a
divisor
为零且绑定到用于绘制命令的程序中的活动通用属性值,则由 DrawArraysInstanced 或 DrawElementsInstanced 生成 INVALID_OPERATION。