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

WebGLRenderingContext.isShader()

Methode

Prüft, ob das übergebene Objekt ein gültiges, nicht gelöschtes <code>WebGLShader</code>-Objekt dieses Kontexts ist, und gibt <code>true</code> oder <code>false</code> zurück.

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

Signatur

WebGLRenderingContext.prototype.isShader(shader)

Beschreibung

Die Methode isShader() des WebGLRenderingContext gibt true zurück, wenn das übergebene Objekt ein WebGLShader ist, der mit createShader() in demselben Kontext erzeugt wurde und noch gültig ist. Sonst gibt sie false zurück.

Typische Einsatzfälle sind Aufräumroutinen, Debugging und Ressourcenverwaltung. Bevor ein Shader erneut angehängt, gelöscht oder abgefragt wird, lässt sich damit prüfen, ob das Objekt noch benutzbar ist, etwa nach einem deleteShader() oder nach einem Verlust des Kontexts.

Wichtig: isShader() sagt nichts darüber, ob der Shader erfolgreich kompiliert wurde. Dafür brauchst du gl.getShaderParameter(shader, gl.COMPILE_STATUS). Die Methode gibt es genauso in WebGL2RenderingContext.

Parameter

Name Typ Default Beschreibung
$shader Pflicht WebGLShader | null Das zu prüfende Shader-Objekt. Bei null wird false zurückgegeben.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn shader ein gültiger WebGLShader dieses Kontexts ist, sonst false.

Beispiele

Gültigkeit vor und nach dem Löschen prüfen

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

const shader = gl.createShader(gl.VERTEX_SHADER);
console.log(gl.isShader(shader));

gl.deleteShader(shader);
console.log(gl.isShader(shader));
console.log(gl.isShader(null));
true false false

Gültig heißt nicht kompiliert

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

const fs = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fs, 'das ist kein GLSL');
gl.compileShader(fs);

console.log('isShader:', gl.isShader(fs));
console.log('kompiliert:', gl.getShaderParameter(fs, gl.COMPILE_STATUS));
console.log(gl.getShaderInfoLog(fs));
isShader: true kompiliert: false (Fehlermeldung des Compilers, je nach Browser verschieden)

Sichere Aufräumfunktion für ein Programm

const disposeProgram = (gl, program) => {
  if (!gl.isProgram(program)) return;
  const shaders = gl.getAttachedShaders(program) ?? [];
  for (const shader of shaders) {
    gl.detachShader(program, shader);
    if (gl.isShader(shader)) {
      gl.deleteShader(shader);
    }
  }
  gl.deleteProgram(program);
};

// Aufruf, z. B. beim Entfernen einer Szene:
// disposeProgram(gl, myProgram);

// Wichtig · Fallstricke

  • Kein Kompilierungstest: Ein Shader mit Syntaxfehlern ist trotzdem ein gültiges Objekt. Den Kompilierstatus prüfst du mit getShaderParameter(shader, gl.COMPILE_STATUS).
  • Nach deleteShader(): In WebGL gibt isShader() nach dem Löschen false zurück. Das gilt auch dann, wenn der Shader noch an ein Programm angehängt ist und intern erst später freigegeben wird. Genau hier weicht WebGL von OpenGL ES ab.
  • Anderer Kontext: Stammt der Shader aus einem anderen WebGL-Kontext, ist das Ergebnis false. Je nach Implementierung kann zusätzlich der Fehler INVALID_OPERATION gesetzt werden.
  • Kontextverlust: Nach einem webglcontextlost-Ereignis gibt die Methode immer false zurück. Alle Shader musst du nach webglcontextrestored neu erzeugen.
  • Leistung: Wie viele gl-Abfragen kann der Aufruf die Grafik-Pipeline ausbremsen. Rufe ihn deshalb nicht in jedem Frame auf, sondern verwalte den Zustand besser selbst.
  • Die Methode wird von allen modernen Browsern mit WebGL-Unterstützung unterstützt, auch in WebGL2RenderingContext.