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

WebGLRenderingContext.getVertexAttrib()

Methode

Gibt Informationen über das Vertex-Attribut an der Position <code>index</code> zurück, z. B. gebundenen Puffer, Komponentenanzahl, Datentyp oder aktuellen Standardwert.

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

Signatur

WebGLRenderingContext.prototype.getVertexAttrib(index, pname)

Beschreibung

getVertexAttrib() liest den Zustand eines Vertex-Attributs (Attribut-Slot) aus dem WebGL-Kontext aus. Mit dem Parameter pname legst du fest, welche Information du haben willst: ob das Attribut-Array aktiviert ist, welcher WebGLBuffer daran gebunden ist, wie viele Komponenten pro Vertex gelesen werden, welchen Datentyp und welchen Stride es hat, und ob die Werte normalisiert werden. Das sind genau die Werte, die vorher mit vertexAttribPointer(), enableVertexAttribArray() und vertexAttrib[1234]f[v]() gesetzt wurden.

Welcher Typ zurückkommt, hängt von pname ab:

  • gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING – WebGLBuffer oder null
  • gl.VERTEX_ATTRIB_ARRAY_ENABLED – boolean
  • gl.VERTEX_ATTRIB_ARRAY_SIZE – number (1–4, Standard 4)
  • gl.VERTEX_ATTRIB_ARRAY_STRIDE – number (Bytes, Standard 0)
  • gl.VERTEX_ATTRIB_ARRAY_TYPE – number (GLenum, z. B. gl.FLOAT)
  • gl.VERTEX_ATTRIB_ARRAY_NORMALIZED – boolean
  • gl.CURRENT_VERTEX_ATTRIB – Float32Array mit 4 Elementen (konstanter Wert, der genutzt wird, wenn das Array deaktiviert ist; Standard [0, 0, 0, 1])
  • ext.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE (Erweiterung ANGLE_instanced_arrays) – number
  • Nur WebGL 2: gl.VERTEX_ATTRIB_ARRAY_INTEGER (boolean) und gl.VERTEX_ATTRIB_ARRAY_DIVISOR (number)

Typische Einsatzzwecke sind Debugging („Warum sehe ich nichts?“), Zustandsprüfungen in Hilfsbibliotheken und Tests. Den Byte-Offset eines Attributs liefert diese Methode nicht – dafür gibt es getVertexAttribOffset().

Parameter

Name Typ Default Beschreibung
$index Pflicht number (GLuint) Position (Slot) des Vertex-Attributs, z. B. von gl.getAttribLocation(). Muss kleiner als gl.getParameter(gl.MAX_VERTEX_ATTRIBS) sein.
$pname Pflicht number (GLenum) Die abzufragende Information, z. B. gl.VERTEX_ATTRIB_ARRAY_SIZE, gl.VERTEX_ATTRIB_ARRAY_ENABLED oder gl.CURRENT_VERTEX_ATTRIB.

Rückgabewert

Typ
WebGLBuffer | boolean | number | Float32Array | Int32Array | Uint32Array | null
Beschreibung
Der angefragte Wert; Typ hängt von pname ab. Bei ungültigen Argumenten wird null zurückgegeben und ein WebGL-Fehler gesetzt. In WebGL 2 kann CURRENT_VERTEX_ATTRIB je nach zuletzt verwendeter Setter-Funktion (vertexAttribI4i/vertexAttribI4ui) auch ein Int32Array bzw. Uint32Array liefern.

Beispiele

Attribut-Konfiguration nach vertexAttribPointer prüfen

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

const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 1, -1, -1, 1, -1]), gl.STATIC_DRAW);

const loc = 0;
gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 8, 0);
gl.enableVertexAttribArray(loc);

console.log(gl.getVertexAttrib(loc, gl.VERTEX_ATTRIB_ARRAY_ENABLED));
console.log(gl.getVertexAttrib(loc, gl.VERTEX_ATTRIB_ARRAY_SIZE));
console.log(gl.getVertexAttrib(loc, gl.VERTEX_ATTRIB_ARRAY_STRIDE));
console.log(gl.getVertexAttrib(loc, gl.VERTEX_ATTRIB_ARRAY_TYPE) === gl.FLOAT);
console.log(gl.getVertexAttrib(loc, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) === buffer);
true 2 8 true true

Konstanten Attributwert lesen (deaktiviertes Array)

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

// Standardwert eines Slots
console.log(gl.getVertexAttrib(1, gl.CURRENT_VERTEX_ATTRIB));

// Konstante Farbe für alle Vertices setzen
gl.disableVertexAttribArray(1);
gl.vertexAttrib4f(1, 1.0, 0.5, 0.0, 1.0);
console.log(gl.getVertexAttrib(1, gl.CURRENT_VERTEX_ATTRIB));
Float32Array(4) [0, 0, 0, 1] Float32Array(4) [1, 0.5, 0, 1]

Debug-Helfer: alle aktiven Attribute eines Programms ausgeben

const dumpAttributes = (gl, program) => {
  const count = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
  for (let i = 0; i < count; i++) {
    const info = gl.getActiveAttrib(program, i);
    const loc = gl.getAttribLocation(program, info.name);
    console.table({
      name: info.name,
      location: loc,
      enabled: gl.getVertexAttrib(loc, gl.VERTEX_ATTRIB_ARRAY_ENABLED),
      size: gl.getVertexAttrib(loc, gl.VERTEX_ATTRIB_ARRAY_SIZE),
      stride: gl.getVertexAttrib(loc, gl.VERTEX_ATTRIB_ARRAY_STRIDE),
      normalized: gl.getVertexAttrib(loc, gl.VERTEX_ATTRIB_ARRAY_NORMALIZED),
      hasBuffer: gl.getVertexAttrib(loc, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) !== null,
      offset: gl.getVertexAttribOffset(loc, gl.VERTEX_ATTRIB_ARRAY_POINTER)
    });
  }
};

// Aufruf z. B. direkt vor gl.drawArrays(...)
// dumpAttributes(gl, program);