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

WebGLRenderingContext.isTexture()

Methode

Prüft, ob ein <code>WebGLTexture</code>-Objekt eine gültige, bereits gebundene und nicht gelöschte Textur des aktuellen Kontexts ist.

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

Signatur

WebGLRenderingContext.prototype.isTexture(texture)

Beschreibung

Die Methode isTexture() gibt true zurück, wenn das übergebene Objekt eine gültige Textur des aktuellen WebGL-Kontexts ist. Sie eignet sich vor allem für Diagnose, Debugging und Aufräumlogik, etwa um zu prüfen, ob eine Textur bereits mit deleteTexture() freigegeben wurde oder nach einem Kontextverlust noch nutzbar ist.

Wichtig: Eine Textur gilt erst dann als „Textur“, wenn sie mindestens einmal mit bindTexture() gebunden wurde. Ein Objekt, das nur mit createTexture() erzeugt, aber noch nie gebunden wurde, liefert daher false. Erst beim ersten Binden legt die Grafikkarte das eigentliche Texturobjekt samt Ziel (TEXTURE_2D, TEXTURE_CUBE_MAP usw.) an.

Außerdem liefert die Methode false, wenn null übergeben wird, wenn die Textur gelöscht wurde, wenn sie aus einem anderen Kontext stammt oder wenn der Kontext verloren gegangen ist (webglcontextlost). Die Methode ist auch in WebGL2RenderingContext verfügbar.

Parameter

Name Typ Default Beschreibung
$texture Pflicht WebGLTexture | null Das zu prüfende Texturobjekt, typischerweise zuvor mit gl.createTexture() erzeugt.

Beispiele

Lebenszyklus einer Textur prüfen

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

const texture = gl.createTexture();
console.log(gl.isTexture(texture)); // noch nie gebunden

gl.bindTexture(gl.TEXTURE_2D, texture);
console.log(gl.isTexture(texture)); // jetzt gültig

gl.deleteTexture(texture);
console.log(gl.isTexture(texture)); // gelöscht
false true false

Sicheres Aufräumen in einem Textur-Cache

const gl = document.querySelector('canvas').getContext('webgl');
const textureCache = new Map();

const loadTexture = (name, image) => {
  const tex = gl.createTexture();
  gl.bindTexture(gl.TEXTURE_2D, tex);
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
  textureCache.set(name, tex);
  return tex;
};

const disposeAll = () => {
  for (const [name, tex] of textureCache) {
    if (gl.isTexture(tex)) {
      gl.deleteTexture(tex);
      console.log(`Textur "${name}" freigegeben`);
    }
  }
  textureCache.clear();
};

const pixel = new ImageData(new Uint8ClampedArray([255, 0, 0, 255]), 1, 1);
loadTexture('rot', pixel);
disposeAll();
Textur "rot" freigegeben

Verhalten bei null und Kontextverlust

const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');
const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);

console.log(gl.isTexture(null));

const ext = gl.getExtension('WEBGL_lose_context');
canvas.addEventListener('webglcontextlost', () => {
  console.log('Nach Kontextverlust:', gl.isTexture(tex));
});
ext?.loseContext();
false Nach Kontextverlust: false

// Wichtig · Fallstricke

  • Häufiger Fallstrick: createTexture() allein reicht nicht – ohne vorheriges bindTexture() liefert isTexture() false. Als reiner „Existiert das JS-Objekt?“-Test ist die Methode daher ungeeignet.
  • Nach einem Kontextverlust sind alle Texturen ungültig und müssen nach webglcontextrestored neu erzeugt werden; alte Objekte werden nie wieder gültig.
  • Performance: Abfragen wie isTexture() können eine Synchronisierung mit dem GPU-Prozess erzwingen. Nicht in jedem Frame im Render-Loop aufrufen, sondern besser den Zustand selbst verwalten.
  • Texturen aus einem anderen WebGL-Kontext ergeben false.
  • Kompatibilität: in allen modernen Browsern verfügbar, sowohl in WebGL 1 als auch in WebGL 2.