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

WebGLRenderingContext.isFramebuffer()

Methode

Prüft, ob das übergebene <code>WebGLFramebuffer</code> ein gültiges, bereits gebundenes und nicht gelöschtes Framebuffer-Objekt ist.

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

Signatur

WebGLRenderingContext.prototype.isFramebuffer(framebuffer)

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

Typ
boolean
Beschreibung
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));
nach create: false nach bind: true nach delete: false

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
Framebuffer gelöscht

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
{ exists: true, complete: false }

// Wichtig · Fallstricke

  • Häufige Falle: Direkt nach createFramebuffer() ist das Ergebnis false. Erst bindFramebuffer() legt das Objekt wirklich an.
  • isFramebuffer() sagt nichts darüber, ob der Framebuffer vollständig ist. Vor dem Rendern immer checkFramebufferStatus() verwenden.
  • Nach einem Kontextverlust (webglcontextlost) gibt die Methode immer false zurück. Alle WebGL-Objekte müssen nach webglcontextrestored neu erzeugt werden.
  • Kommt das Objekt aus einem anderen WebGL-Kontext, ist das Ergebnis false. Je nach Implementierung wird zusätzlich der Fehler INVALID_OPERATION gesetzt.
  • 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.