Signatur
Beschreibung
Mit isProgram() fragst du ab, ob ein WebGLProgram-Objekt aus Sicht des aktuellen WebGL-Kontexts noch ein gültiges Shader-Programm ist. Die Methode liefert true, wenn das Programm mit createProgram() in diesem Kontext erzeugt und noch nicht (endgültig) mit deleteProgram() freigegeben wurde.
In diesen Fällen gibt sie false zurück:
- Du übergibst
null. - Das Programm wurde mit
deleteProgram()gelöscht. - Der WebGL-Kontext ist verloren gegangen (
webglcontextlost). Alle GPU-Ressourcen sind dann ungültig.
Wichtig: isProgram() sagt nichts darüber aus, ob das Programm erfolgreich gelinkt wurde oder benutzbar ist. Das prüfst du mit getProgramParameter(program, gl.LINK_STATUS) bzw. gl.VALIDATE_STATUS. Typische Einsatzgebiete für isProgram() sind Aufräumroutinen, Debugging, Ressourcen-Manager und die Wiederherstellung nach einem Kontextverlust.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $program Pflicht | WebGLProgram | null | Das zu prüfende Programm-Objekt, normalerweise von gl.createProgram() erzeugt. |
Rückgabewert
true, wenn program ein gültiges Programm-Objekt 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 program = gl.createProgram();
console.log(gl.isProgram(program)); // frisch erzeugt
gl.deleteProgram(program);
console.log(gl.isProgram(program)); // nach dem Löschen
console.log(gl.isProgram(null));
isProgram() und LINK_STATUS unterscheiden
const gl = document.createElement('canvas').getContext('webgl');
const compile = (type, src) => {
const s = gl.createShader(type);
gl.shaderSource(s, src);
gl.compileShader(s);
return s;
};
const vs = compile(gl.VERTEX_SHADER, 'attribute vec4 p; void main(){ gl_Position = p; }');
const fs = compile(gl.FRAGMENT_SHADER, 'precision mediump float; void main(){ gl_FragColor = vec4(1.0); }');
const program = gl.createProgram();
gl.attachShader(program, vs);
gl.attachShader(program, fs);
console.log('gültig:', gl.isProgram(program));
console.log('gelinkt:', gl.getProgramParameter(program, gl.LINK_STATUS));
gl.linkProgram(program);
console.log('gelinkt:', gl.getProgramParameter(program, gl.LINK_STATUS));
Sicheres Aufräumen in einem Ressourcen-Manager
class ProgramCache {
constructor(gl) {
this.gl = gl;
this.programs = new Map();
}
add(name, program) {
this.programs.set(name, program);
}
dispose() {
const { gl } = this;
for (const [name, program] of this.programs) {
// Nur löschen, was noch gültig ist
if (gl.isProgram(program)) {
gl.deleteProgram(program);
console.log(`Programm "${name}" gelöscht`);
}
}
this.programs.clear();
}
}
const gl = document.createElement('canvas').getContext('webgl');
const cache = new ProgramCache(gl);
cache.add('basic', gl.createProgram());
cache.dispose();
Nach Kontextverlust neu aufbauen
const canvas = document.querySelector('canvas');
const gl = canvas.getContext('webgl');
let program = gl.createProgram();
canvas.addEventListener('webglcontextlost', (e) => {
e.preventDefault(); // Wiederherstellung erlauben
console.log('Nach Verlust gültig?', gl.isProgram(program));
});
canvas.addEventListener('webglcontextrestored', () => {
program = gl.createProgram(); // alte Objekte sind unbrauchbar
console.log('Neu erzeugt gültig?', gl.isProgram(program));
});
// Wichtig · Fallstricke
- Kein Link-Test:
isProgram()liefert auch für nicht gelinkte oder fehlerhafte Programmetrue. Für den Link-Erfolg prüfst dugetProgramParameter(program, gl.LINK_STATUS)und liest Fehler mitgetProgramInfoLog()aus. - Verzögertes Löschen: Ist ein Programm per
useProgram()noch aktiv, gibt der Treiber es nachdeleteProgram()erst frei, wenn es nicht mehr benutzt wird. Das Objekt gilt trotzdem als gelöscht und darf nicht wiederverwendet werden. - Fremder Kontext: Ein Programm aus einem anderen WebGL-Kontext ist hier nie gültig. Je nach Browser kann zusätzlich ein
INVALID_OPERATION-Fehler gesetzt werden. - Performance: Die Methode kann eine Synchronisierung mit der GPU bzw. dem GPU-Prozess auslösen. Rufe sie daher nicht in jedem Frame der Render-Schleife auf, sondern nur beim Aufräumen oder Debuggen.
- Kompatibilität: Die Methode wird in allen Browsern mit WebGL unterstützt und steht genauso in
WebGL2RenderingContextzur Verfügung.