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

WebGLRenderingContext.deleteProgram()

Methode

Markiert ein <code>WebGLProgram</code>-Objekt zum Löschen und gibt die zugehörigen GPU-Ressourcen frei, sobald es nicht mehr verwendet wird.

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

Signatur

WebGLRenderingContext.prototype.deleteProgram(program)

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

Typ
void
Beschreibung
Kein 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');
}
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));
true false

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 WebGLProgram darf nicht mehr verwendet werden – Aufrufe wie useProgram() oder getUniformLocation() erzeugen dann den Fehler INVALID_VALUE bzw. INVALID_OPERATION. Die JavaScript-Referenz sollte man danach auf null setzen.
  • Ein aktives Programm wird nur markiert (DELETE_STATUS ist true), aber erst nach dem Wechsel des Programms freigegeben.
  • deleteProgram() löscht die angehängten Shader nicht – dafür ist deleteShader() 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.