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

WebGLRenderingContext.getShaderParameter()

Methode

Liefert Informationen über einen WebGL-Shader, z. B. ob er erfolgreich kompiliert wurde, welchen Typ er hat oder ob er zum Löschen markiert ist.

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

Signatur

WebGLRenderingContext.prototype.getShaderParameter(shader, pname)

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 mit deleteShader() zum Löschen markiert wurde.
  • gl.SHADER_TYPE: GLenum, entweder gl.VERTEX_SHADER oder gl.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

Typ
boolean | GLenum | null
Beschreibung
Bei 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);
Vertex-Shader kompiliert: true

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));
Erfolgreich: false ERROR: 0:1: '}' : syntax error (Text je nach Treiber verschieden)

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);
Fragment-Shader Zum Löschen markiert: false

// Wichtig · Fallstricke

  • Keine Ausnahme bei Kompilierfehlern: compileShader() schlägt stillschweigend fehl. Prüfe deshalb immer COMPILE_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_compile bietet dafür COMPLETION_STATUS_KHR an, 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 Methode null zurück. Eine Prüfung mit ! würde das fälschlich als Kompilierfehler deuten.
  • Ein ungültiger pname erzeugt den Fehler gl.INVALID_ENUM. Du kannst ihn mit getError() abfragen.
  • Die Methode wird von allen modernen Browsern unterstützt, auch in WebGL2RenderingContext.