Signatur
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
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));
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));
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 gibtisShader()nach dem Löschenfalsezurü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 FehlerINVALID_OPERATIONgesetzt werden. - Kontextverlust: Nach einem
webglcontextlost-Ereignis gibt die Methode immerfalsezurück. Alle Shader musst du nachwebglcontextrestoredneu 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.