Signatur
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
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);
}
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));
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());
}
// 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 perbindAttribLocation()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äfixgl_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 Methodenullzurück. - Verfügbar in allen modernen Browsern, ebenso in
WebGL2RenderingContext.