Signatur
Beschreibung
Die Methode deleteProgram() des WebGLRenderingContext (und entsprechend des WebGL2RenderingContext) löscht ein Shader-Programm, das zuvor mit createProgram() erzeugt wurde. Damit wird der Speicher auf der Grafikkarte freigegeben, den das gelinkte Programm belegt.
Wichtig: Ist das Programm gerade über useProgram() aktiv, wird es nur zum Löschen markiert. Die tatsächliche Freigabe erfolgt erst, wenn es nicht mehr Teil des aktuellen Renderzustands ist, also nach einem Wechsel zu einem anderen Programm oder useProgram(null). Angehängte Shader werden beim Löschen automatisch abgehängt; sie selbst werden aber nur gelöscht, wenn auch für sie deleteShader() aufgerufen wurde.
Man verwendet deleteProgram() vor allem beim Aufräumen: wenn eine Szene oder ein Material verworfen wird, wenn das Linken fehlschlägt, oder beim Hot-Reload von Shadern während der Entwicklung. Der Garbage Collector von JavaScript gibt GPU-Ressourcen nicht verlässlich zeitnah frei – explizites Löschen ist daher gute Praxis.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $program Pflicht | WebGLProgram | null | Das zu löschende Programmobjekt. Bei null oder einem bereits gelöschten Programm passiert nichts. |
Rückgabewert
undefined).Beispiele
Programm nach fehlgeschlagenem Linken aufräumen
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');
const compile = (type, source) => {
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
return shader;
};
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);
gl.linkProgram(program);
// Shader werden nach dem Linken nicht mehr gebraucht
gl.deleteShader(vs);
gl.deleteShader(fs);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
console.error(gl.getProgramInfoLog(program));
gl.deleteProgram(program);
} else {
console.log('Programm gelinkt');
}
Löschstatus eines aktiven Programms prüfen
// program ist ein gültiges, gelinktes WebGLProgram
gl.useProgram(program);
gl.deleteProgram(program);
// Noch aktiv -> nur zum Löschen markiert
console.log(gl.getProgramParameter(program, gl.DELETE_STATUS));
// Erst jetzt wird es tatsächlich freigegeben
gl.useProgram(null);
console.log(gl.isProgram(program));
Shader-Hot-Reload mit Aufräumen
let currentProgram = null;
const replaceProgram = (gl, newProgram) => {
if (currentProgram) {
gl.deleteProgram(currentProgram);
}
currentProgram = newProgram;
gl.useProgram(currentProgram);
};
// Beim Neuladen der Shader-Quelltexte:
// replaceProgram(gl, buildProgram(gl, vsSource, fsSource));
// Wichtig · Fallstricke
- Ein gelöschtes
WebGLProgramdarf nicht mehr verwendet werden – Aufrufe wieuseProgram()odergetUniformLocation()erzeugen dann den FehlerINVALID_VALUEbzw.INVALID_OPERATION. Die JavaScript-Referenz sollte man danach aufnullsetzen. - Ein aktives Programm wird nur markiert (
DELETE_STATUSisttrue), aber erst nach dem Wechsel des Programms freigegeben. deleteProgram()löscht die angehängten Shader nicht – dafür istdeleteShader()nötig.- Nach einem Kontextverlust (
webglcontextlost) sind alle Programme ohnehin ungültig; ein Aufruf ist dann wirkungslos. - In allen modernen Browsern mit WebGL-Unterstützung verfügbar, ebenso in
WebGL2RenderingContext.