Signatur
Beschreibung
isFramebuffer() fragt den WebGL-Kontext, ob ein WebGLFramebuffer ein gültiges Framebuffer-Objekt ist. Der Rückgabewert ist true, wenn das Objekt mit createFramebuffer() erzeugt wurde, schon mindestens einmal mit bindFramebuffer() gebunden wurde und noch nicht mit deleteFramebuffer() gelöscht ist.
Wichtig ist das Binden: Ein Framebuffer, der nur erzeugt, aber nie gebunden wurde, gilt nach der OpenGL-ES-Semantik noch nicht als Framebuffer-Objekt. Dann gibt isFramebuffer() false zurück. Erst beim ersten bindFramebuffer() wird das Objekt tatsächlich angelegt.
Typische Einsatzfälle sind Debugging, Validierung in Hilfsbibliotheken (etwa vor dem Aufräumen von Render-Targets) und Prüfungen nach einem Kontextverlust. Ob ein Framebuffer vollständig und damit zum Rendern bereit ist, sagt isFramebuffer() nicht aus. Dafür gibt es checkFramebufferStatus().
Die Methode gibt es auch in WebGL2RenderingContext, dort mit identischem Verhalten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $framebuffer Pflicht | WebGLFramebuffer | null | Das zu prüfende Framebuffer-Objekt. Bei null ist das Ergebnis false. |
Rückgabewert
true, wenn das Objekt ein gültiger, bereits gebundener und nicht gelöschter Framebuffer ist, sonst false.Beispiele
Lebenszyklus eines Framebuffers prüfen
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');
const fb = gl.createFramebuffer();
console.log('nach create:', gl.isFramebuffer(fb));
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
console.log('nach bind:', gl.isFramebuffer(fb));
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
gl.deleteFramebuffer(fb);
console.log('nach delete:', gl.isFramebuffer(fb));
Render-Target sicher aufräumen
const gl = document.createElement('canvas').getContext('webgl');
const createRenderTarget = (width, height) => {
const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
const framebuffer = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
return { framebuffer, texture };
};
const disposeRenderTarget = ({ framebuffer, texture }) => {
if (gl.isFramebuffer(framebuffer)) {
gl.deleteFramebuffer(framebuffer);
console.log('Framebuffer gelöscht');
}
if (gl.isTexture(texture)) gl.deleteTexture(texture);
};
const target = createRenderTarget(256, 256);
disposeRenderTarget(target);
disposeRenderTarget(target); // zweiter Aufruf löscht nichts mehr
Existenz und Vollständigkeit auseinanderhalten
const gl = document.createElement('canvas').getContext('webgl');
const fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
const exists = gl.isFramebuffer(fb);
const complete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;
console.log({ exists, complete }); // noch kein Attachment
// Wichtig · Fallstricke
- Häufige Falle: Direkt nach
createFramebuffer()ist das Ergebnisfalse. ErstbindFramebuffer()legt das Objekt wirklich an. isFramebuffer()sagt nichts darüber, ob der Framebuffer vollständig ist. Vor dem Rendern immercheckFramebufferStatus()verwenden.- Nach einem Kontextverlust (
webglcontextlost) gibt die Methode immerfalsezurück. Alle WebGL-Objekte müssen nachwebglcontextrestoredneu erzeugt werden. - Kommt das Objekt aus einem anderen WebGL-Kontext, ist das Ergebnis
false. Je nach Implementierung wird zusätzlich der FehlerINVALID_OPERATIONgesetzt. - Wie alle
is*()-Abfragen kann der Aufruf die GPU-Pipeline synchronisieren. In der Render-Schleife sollte man ihn deshalb nicht bei jedem Frame aufrufen. - Kompatibilität: in allen modernen Browsern mit WebGL-Unterstützung verfügbar, auch in
WebGL2RenderingContext.