Signatur
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
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));
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();
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);
// 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 übergl.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 zuINVALID_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 vondeleteSampler()ist dann überflüssig.