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

WebGL2RenderingContext.isTransformFeedback()

Methode

Prüft, ob das übergebene Objekt ein gültiges, noch nicht gelöschtes <code>WebGLTransformFeedback</code>-Objekt des aktuellen Kontexts ist, und gibt <code>true</code> oder <code>false</code> zurück.

seit JavaScript WebGL 2 – Baseline: alle modernen Browser (seit 20 Kategorie: webapi

Signatur

WebGL2RenderingContext.prototype.isTransformFeedback(transformFeedback)

Beschreibung

Mit isTransformFeedback() prüfst du, ob ein WebGLTransformFeedback-Objekt im aktuellen WebGL-2-Kontext noch gültig ist. Transform-Feedback-Objekte speichern, in welche Puffer der Vertex-Shader seine Ausgabewerte schreibt. So lassen sich z. B. Partikelsimulationen komplett auf der GPU berechnen, ohne Daten zur CPU zurückzukopieren.

Die Methode gibt nur dann true zurück, wenn das Objekt mit diesem Kontext erstellt wurde, noch nicht mit deleteTransformFeedback() gelöscht wurde und schon mindestens einmal mit bindTransformFeedback() gebunden war. Diese letzte Bedingung kommt aus OpenGL ES 3.0: Ein Objekt, das du mit createTransformFeedback() gerade erst erzeugt, aber noch nie gebunden hast, gilt noch nicht als Transform-Feedback-Objekt.

Im Alltag brauchst du die Methode vor allem beim Debuggen, in Aufräum-Routinen (bevor Ressourcen freigegeben werden) und nach einem Kontextverlust (webglcontextlost). In Render-Schleifen solltest du sie nicht aufrufen, denn sie synchronisiert unter Umständen mit dem GPU-Prozess und kostet dadurch Leistung.

Parameter

Name Typ Default Beschreibung
$transformFeedback Pflicht WebGLTransformFeedback | null Das zu prüfende Objekt, normalerweise der Rückgabewert von gl.createTransformFeedback(). Bei null ist das Ergebnis false.

Beispiele

Lebenszyklus eines Transform-Feedback-Objekts

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

const tf = gl.createTransformFeedback();
console.log('nach create:', gl.isTransformFeedback(tf));

gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, tf);
console.log('nach bind:', gl.isTransformFeedback(tf));

gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);
gl.deleteTransformFeedback(tf);
console.log('nach delete:', gl.isTransformFeedback(tf));
nach create: false nach bind: true nach delete: false

Sichere Aufräum-Funktion für GPU-Ressourcen

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

const tf = gl.createTransformFeedback();
gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, tf);
gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);

const disposeTransformFeedback = (gl, obj) => {
  if (obj && gl.isTransformFeedback(obj)) {
    gl.deleteTransformFeedback(obj);
    return true;
  }
  return false;
};

console.log(disposeTransformFeedback(gl, tf)); // wird gelöscht
console.log(disposeTransformFeedback(gl, tf)); // schon gelöscht
console.log(disposeTransformFeedback(gl, null));
true false false

Objekte nach einem Kontextverlust prüfen

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

const tf = gl.createTransformFeedback();
gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, tf);

canvas.addEventListener('webglcontextlost', (event) => {
  event.preventDefault();
  // Nach dem Verlust ist jedes WebGL-Objekt ungültig
  console.log('gültig?', gl.isTransformFeedback(tf));
});

ext?.loseContext();
gültig? false

// Wichtig · Fallstricke

  • Erst binden, dann prüfen: Nach createTransformFeedback() allein gibt die Methode false zurück. Erst nach dem ersten bindTransformFeedback() ist das Ergebnis true.
  • Nur für WebGL 2: Im WebGL-1-Kontext (getContext('webgl')) gibt es diese Methode nicht. Prüfe also vorher, ob getContext('webgl2') überhaupt einen Kontext geliefert hat.
  • Kontextübergreifend: Ein Objekt aus einem anderen WebGL2RenderingContext liefert false. Übergibst du ein Objekt, das kein WebGLTransformFeedback ist (etwa einen Puffer), wirft der Browser einen TypeError.
  • Leistung: Wie alle is*()-Abfragen kann der Aufruf den Rendering-Ablauf blockieren. Verwende ihn deshalb nicht in jedem Frame.
  • Kompatibilität: Wird in allen aktuellen Browsern mit WebGL-2-Unterstützung unterstützt: Chrome/Edge 56+, Firefox 51+, Safari 15+.