Signatur
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));
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));
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();
// Wichtig · Fallstricke
- Erst binden, dann prüfen: Nach
createTransformFeedback()allein gibt die Methodefalsezurück. Erst nach dem erstenbindTransformFeedback()ist das Ergebnistrue. - Nur für WebGL 2: Im WebGL-1-Kontext (
getContext('webgl')) gibt es diese Methode nicht. Prüfe also vorher, obgetContext('webgl2')überhaupt einen Kontext geliefert hat. - Kontextübergreifend: Ein Objekt aus einem anderen
WebGL2RenderingContextliefertfalse. Übergibst du ein Objekt, das keinWebGLTransformFeedbackist (etwa einen Puffer), wirft der Browser einenTypeError. - 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+.