在 WebGL 2 实例化中访问 gl_InstanceID

Sta*_*tec 3 webgl2

我正在尝试在 WebGL 2 中进行实例化。我想使用内置变量gl_InstanceID来索引到统一的浮点数组中。

我收到以下错误:

glDrawElementsInstancedANGLE: attempt to draw with all attributes having non-zero divisors

WebGL 2 实例化中唯一允许使用顶点属性的实例化(实例化数组)吗?

另外,规范是了解这些功能的唯一明确的地方吗?

gma*_*man 5

根据下面的错误报告,这个问题似乎已得到解决。这是一个小工作示例

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)

--- old answer ---

规范说它是基于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 不同。我提交了一个错误

需要添加的部分是

如果不存在至少一个启用的顶点属性数组,其 adivisor为零且绑定到用于绘制命令的程序中的活动通用属性值,则由 DrawArraysInstanced 或 DrawElementsInstanced 生成 INVALID_OPERATION。