Start · Sprachen · JavaScript · Referenz · WebGL2RenderingContext.deleteSampler()

WebGL2RenderingContext.deleteSampler()

Methode

Löscht ein <code>WebGLSampler</code>-Objekt und gibt die zugehörigen GPU-Ressourcen frei.

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

Signatur

WebGL2RenderingContext.prototype.deleteSampler(sampler)

Beschreibung

Mit deleteSampler() markierst du ein zuvor mit createSampler() erzeugtes WebGLSampler-Objekt zum Löschen. Sampler-Objekte speichern Einstellungen zum Abtasten von Texturen, z. B. Filterung (TEXTURE_MIN_FILTER, TEXTURE_MAG_FILTER) und Wrap-Modus (TEXTURE_WRAP_S/T/R). Diese Einstellungen gelten dann unabhängig von der Textur selbst.

Rufe die Methode auf, sobald du einen Sampler nicht mehr brauchst, etwa beim Aufräumen einer Szene, beim Wechsel von Materialien oder bevor die Anwendung beendet wird. So vermeidest du Ressourcenlecks auf der GPU. Der Garbage Collector gibt WebGL-Objekte zwar irgendwann frei, aber wann das passiert, lässt sich nicht vorhersagen.

Ist der Sampler beim Löschen noch an eine Textureinheit gebunden (über bindSampler()), wird diese Bindung automatisch aufgehoben. Die Einheit verwendet danach wieder die Parameter der Textur selbst. Ein gelöschtes Objekt darf nicht mehr verwendet werden, und isSampler() liefert für es false.

Parameter

Name Typ Default Beschreibung
$sampler Pflicht WebGLSampler | null Das WebGLSampler-Objekt, das gelöscht werden soll. Bei null passiert nichts.

Rückgabewert

Typ
void
Beschreibung
Kein Rückgabewert (undefined).

Beispiele

Sampler erzeugen, verwenden und löschen

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

const sampler = gl.createSampler();
gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);
gl.samplerParameteri(sampler, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_S, gl.REPEAT);

// An Textureinheit 0 binden
gl.bindSampler(0, sampler);

// ... zeichnen ...

// Aufräumen
gl.bindSampler(0, null);
gl.deleteSampler(sampler);
console.log(gl.isSampler(sampler));
false

Mehrere Sampler in einem Material-Cache freigeben

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

const samplerCache = new Map([
  ['nearest', gl.createSampler()],
  ['linear', gl.createSampler()]
]);

samplerCache.get('nearest').__label = 'nearest';
gl.samplerParameteri(samplerCache.get('nearest'), gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.samplerParameteri(samplerCache.get('linear'), gl.TEXTURE_MAG_FILTER, gl.LINEAR);

const disposeSamplers = () => {
  for (const [name, sampler] of samplerCache) {
    gl.deleteSampler(sampler);
    console.log(`Sampler "${name}" gelöscht`);
  }
  samplerCache.clear();
};

disposeSamplers();
Sampler "nearest" gelöscht Sampler "linear" gelöscht

Aufräumen bei Kontextverlust

const canvas = document.querySelector('canvas') ?? document.createElement('canvas');
const gl = canvas.getContext('webgl2');
let sampler = gl.createSampler();

canvas.addEventListener('webglcontextlost', (event) => {
  event.preventDefault();
  // Nach einem Kontextverlust sind alle Objekte ungültig: nur die Referenz verwerfen
  sampler = null;
});

const cleanup = () => {
  if (sampler && !gl.isContextLost()) {
    gl.deleteSampler(sampler);
  }
  sampler = null;
};

cleanup();
console.log(sampler);
null

// Wichtig · Fallstricke

  • Nur in einem WebGL-2-Kontext verfügbar (getContext('webgl2')). In WebGL 1 gibt es keine Sampler-Objekte. Alle modernen Browser unterstützen WebGL 2, Safari erst ab Version 15.
  • Ein Sampler, der aus einem anderen WebGL-Kontext stammt, führt zum Fehler INVALID_OPERATION. Diesen fragst du über gl.getError() ab.
  • Einen bereits gelöschten Sampler erneut zu löschen, ist wirkungslos und erzeugt keinen Fehler. Wird er dagegen weiter benutzt, etwa mit samplerParameteri(), kommt es zu INVALID_OPERATION.
  • Setze die JavaScript-Referenz nach dem Löschen auf null. So verhinderst du, dass das ungültige Objekt versehentlich wiederverwendet wird.
  • Nach einem Kontextverlust (webglcontextlost) sind alle Sampler automatisch ungültig. Ein Aufruf von deleteSampler() ist dann überflüssig.