Signatur
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–WebGLBufferodernullgl.VERTEX_ATTRIB_ARRAY_ENABLED–booleangl.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–booleangl.CURRENT_VERTEX_ATTRIB–Float32Arraymit 4 Elementen (konstanter Wert, der genutzt wird, wenn das Array deaktiviert ist; Standard[0, 0, 0, 1])ext.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE(ErweiterungANGLE_instanced_arrays) –number- Nur WebGL 2:
gl.VERTEX_ATTRIB_ARRAY_INTEGER(boolean) undgl.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
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);
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));
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);