Start · Sprachen · JavaScript · Referenz · WebGLRenderingContext.getActiveAttrib()

WebGLRenderingContext.getActiveAttrib()

Methode

Liefert ein <code>WebGLActiveInfo</code>-Objekt mit Name, Typ und Größe des aktiven Vertex-Attributs an Position <code>index</code> eines gelinkten Shader-Programms.

seit JavaScript WebGL 1.0 – Baseline: alle Browser Kategorie: webapi

Signatur

WebGLRenderingContext.prototype.getActiveAttrib(program, index)

Beschreibung

getActiveAttrib() fragt ein bereits gelinktes WebGLProgram nach seinen aktiven Vertex-Attributen (attribute in GLSL ES 1.0 bzw. in im Vertex-Shader bei GLSL ES 3.0). Als Rückgabewert kommt ein WebGLActiveInfo-Objekt mit den schreibgeschützten Eigenschaften name, type (z. B. gl.FLOAT_VEC3) und size (Anzahl der Elemente, bei Nicht-Arrays 1).

Die Methode eignet sich vor allem für Shader-Reflexion: Statt Attributnamen fest im JavaScript-Code einzutragen, liest eine Engine alle aktiven Attribute aus, ermittelt per getAttribLocation() ihre Positionen und richtet die Vertex-Puffer automatisch passend ein. Auch beim Debuggen hilft sie, etwa um herauszufinden, welche Attribute der Compiler wegoptimiert hat.

Die gültigen Indizes reichen von 0 bis gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES) - 1. Wichtig: Der Index ist nicht identisch mit der Attribut-Position (Location) – dafür gibt es getAttribLocation().

Parameter

Name Typ Default Beschreibung
$program Pflicht WebGLProgram Das gelinkte Shader-Programm, dessen Attribute abgefragt werden.
$index Pflicht GLuint (number) Index des aktiven Attributs, von 0 bis ACTIVE_ATTRIBUTES - 1.

Rückgabewert

Typ
WebGLActiveInfo | null
Beschreibung
Ein WebGLActiveInfo-Objekt mit name, type und size, oder null bei ungültigem Index bzw. Fehler (dann ist über gl.getError() z. B. INVALID_VALUE abrufbar).

Beispiele

Alle aktiven Attribute eines Programms auflisten

const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');

const vsSource = `
  attribute vec3 aPosition;
  attribute vec2 aTexCoord;
  varying vec2 vUv;
  void main() {
    vUv = aTexCoord;
    gl_Position = vec4(aPosition, 1.0);
  }`;
const fsSource = `
  precision mediump float;
  varying vec2 vUv;
  void main() { gl_FragColor = vec4(vUv, 0.0, 1.0); }`;

const compile = (type, src) => {
  const shader = gl.createShader(type);
  gl.shaderSource(shader, src);
  gl.compileShader(shader);
  return shader;
};

const program = gl.createProgram();
gl.attachShader(program, compile(gl.VERTEX_SHADER, vsSource));
gl.attachShader(program, compile(gl.FRAGMENT_SHADER, fsSource));
gl.linkProgram(program);

const count = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
for (let i = 0; i < count; i++) {
  const info = gl.getActiveAttrib(program, i);
  console.log(info.name, info.type, info.size);
}
aPosition 35665 1 aTexCoord 35664 1 (Reihenfolge kann je nach Treiber variieren; 35665 = FLOAT_VEC3, 35664 = FLOAT_VEC2)

Typ-Konstanten lesbar machen und Locations ermitteln

const typeNames = {
  [gl.FLOAT]: 'float',
  [gl.FLOAT_VEC2]: 'vec2',
  [gl.FLOAT_VEC3]: 'vec3',
  [gl.FLOAT_VEC4]: 'vec4',
  [gl.FLOAT_MAT4]: 'mat4'
};

const getAttributes = (gl, program) => {
  const attributes = {};
  const count = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
  for (let i = 0; i < count; i++) {
    const { name, type, size } = gl.getActiveAttrib(program, i);
    attributes[name] = {
      type: typeNames[type] ?? type,
      size,
      location: gl.getAttribLocation(program, name)
    };
  }
  return attributes;
};

console.log(getAttributes(gl, program));
{ aPosition: { type: 'vec3', size: 1, location: 0 }, aTexCoord: { type: 'vec2', size: 1, location: 1 } }

Ungültigen Index abfangen

const info = gl.getActiveAttrib(program, 99);
if (info === null) {
  console.warn('Kein Attribut an diesem Index, Fehler:', gl.getError() === gl.INVALID_VALUE ? 'INVALID_VALUE' : gl.getError());
}
Kein Attribut an diesem Index, Fehler: INVALID_VALUE

// Wichtig · Fallstricke

  • Nur aktive Attribute: Attribute, die im Shader deklariert, aber nicht verwendet werden, entfernt der GLSL-Compiler häufig – sie tauchen dann nicht auf, und getAttribLocation() liefert -1.
  • Index ≠ Location: Der Aufzählungsindex sagt nichts über die Location aus; immer getAttribLocation() verwenden oder die Location vor dem Linken per bindAttribLocation() festlegen.
  • Das Programm muss vorher erfolgreich gelinkt sein (gl.getProgramParameter(program, gl.LINK_STATUS) prüfen), sonst sind die Ergebnisse nicht aussagekräftig.
  • Eingebaute Variablen wie gl_VertexID (WebGL 2) können mit Präfix gl_ in der Liste erscheinen – bei automatischer Puffer-Zuordnung herausfiltern.
  • Die Reihenfolge der Attribute ist treiberabhängig und nicht garantiert.
  • Nach einem Kontextverlust (webglcontextlost) gibt die Methode null zurück.
  • Verfügbar in allen modernen Browsern, ebenso in WebGL2RenderingContext.