Signatur
Beschreibung
Mit getShaderParameter() fragst du den Zustand eines WebGLShader-Objekts ab. Am häufigsten brauchst du die Methode direkt nach compileShader(). Mit gl.COMPILE_STATUS prüfst du, ob der GLSL-Quelltext fehlerfrei übersetzt wurde. Ist das nicht der Fall, holst du dir mit getShaderInfoLog() die Fehlermeldung des Treibers.
Welcher Wert zurückkommt, hängt vom Parameter pname ab:
gl.COMPILE_STATUS:boolean, gibt an, ob die letzte Kompilierung erfolgreich war.gl.DELETE_STATUS:boolean, gibt an, ob der Shader mitdeleteShader()zum Löschen markiert wurde.gl.SHADER_TYPE:GLenum, entwedergl.VERTEX_SHADERodergl.FRAGMENT_SHADER.
Die Methode gibt es genauso auf WebGL2RenderingContext. Beachte, dass ein fehlgeschlagener Aufruf nicht automatisch eine Ausnahme wirft. WebGL meldet Kompilierfehler nur über diese Abfrage. Deshalb gehört die Prüfung in jede robuste Hilfsfunktion zum Erstellen von Shadern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $shader Pflicht | WebGLShader | Der Shader, dessen Zustand du abfragen willst. | |
| $pname Pflicht | GLenum | Der gewünschte Parameter: gl.COMPILE_STATUS, gl.DELETE_STATUS oder gl.SHADER_TYPE. |
Rückgabewert
COMPILE_STATUS und DELETE_STATUS ein boolean, bei SHADER_TYPE ein GLenum. Bei einem ungültigen pname oder verlorenem Kontext kommt null zurück.Beispiele
Kompilierstatus nach compileShader() prüfen
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');
const createShader = (gl, type, source) => {
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
const log = gl.getShaderInfoLog(shader);
gl.deleteShader(shader);
throw new Error(`Shader-Fehler: ${log}`);
}
return shader;
};
const vsSource = `
attribute vec4 aPosition;
void main() { gl_Position = aPosition; }
`;
const vs = createShader(gl, gl.VERTEX_SHADER, vsSource);
console.log('Vertex-Shader kompiliert:', vs instanceof WebGLShader);
Fehlerhaften Shader erkennen
const gl = document.createElement('canvas').getContext('webgl');
const shader = gl.createShader(gl.FRAGMENT_SHADER);
// Absichtlich fehlerhaft: Semikolon fehlt
gl.shaderSource(shader, 'void main() { gl_FragColor = vec4(1.0) }');
gl.compileShader(shader);
const ok = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
console.log('Erfolgreich:', ok);
if (!ok) console.warn(gl.getShaderInfoLog(shader));
Shader-Typ und Löschstatus abfragen
const gl = document.createElement('canvas').getContext('webgl');
const shader = gl.createShader(gl.FRAGMENT_SHADER);
const type = gl.getShaderParameter(shader, gl.SHADER_TYPE);
console.log(type === gl.FRAGMENT_SHADER ? 'Fragment-Shader' : 'Vertex-Shader');
console.log('Zum Löschen markiert:', gl.getShaderParameter(shader, gl.DELETE_STATUS));
gl.deleteShader(shader);
// Wichtig · Fallstricke
- Keine Ausnahme bei Kompilierfehlern:
compileShader()schlägt stillschweigend fehl. Prüfe deshalb immerCOMPILE_STATUS. Sonst zeigt sich der Fehler erst später beim Linken oder als leerer Canvas. - Performance: Die Abfrage kann die GPU-Pipeline synchronisieren und so blockieren. Prüfe den Status möglichst erst, nachdem alle Shader und Programme erstellt sind. Die Erweiterung
KHR_parallel_shader_compilebietet dafürCOMPLETION_STATUS_KHRan, das du abfragen kannst, ohne zu blockieren. - Die Fehlermeldungen aus
getShaderInfoLog()sind treiberabhängig. Werte ihren Text deshalb nicht maschinell aus. - Ist der Kontext verloren (
webglcontextlost), gibt die Methodenullzurück. Eine Prüfung mit!würde das fälschlich als Kompilierfehler deuten. - Ein ungültiger
pnameerzeugt den Fehlergl.INVALID_ENUM. Du kannst ihn mitgetError()abfragen. - Die Methode wird von allen modernen Browsern unterstützt, auch in
WebGL2RenderingContext.