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

WebGLRenderingContext.isRenderbuffer()

Methode

Prüft, ob das übergebene Objekt ein gültiger, noch nicht gelöschter und schon einmal gebundener <code>WebGLRenderbuffer</code> ist, und gibt <code>true</code> oder <code>false</code> zurück.

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

Signatur

WebGLRenderingContext.prototype.isRenderbuffer(renderbuffer)

Beschreibung

Mit isRenderbuffer() fragen Sie beim WebGL-Kontext nach, ob ein WebGLRenderbuffer noch gültig ist. Renderbuffer sind Speicherbereiche für Bilddaten wie Tiefen-, Stencil- oder Farbpuffer. Sie werden meist an ein Framebuffer-Objekt angehängt, zum Beispiel beim Rendern in eine Textur (Offscreen-Rendering) oder bei Multisampling.

Wichtig: Ein mit createRenderbuffer() erzeugtes Objekt gilt erst dann als Renderbuffer, wenn es mindestens einmal mit bindRenderbuffer(gl.RENDERBUFFER, rb) gebunden wurde. Davor gibt die Methode false zurück. Auch nach deleteRenderbuffer() ist das Ergebnis false.

Die Methode eignet sich vor allem für Diagnose, Debugging und Aufräumlogik, etwa um vor einer Freigabe zu prüfen, ob ein Puffer schon gelöscht wurde. Im normalen Render-Loop sollten Sie sie nicht aufrufen, weil jede Abfrage beim Treiber die GPU-Pipeline synchronisieren kann.

Parameter

Name Typ Default Beschreibung
$renderbuffer Pflicht WebGLRenderbuffer | null Das zu prüfende Renderbuffer-Objekt, zum Beispiel aus gl.createRenderbuffer(). Bei null ist das Ergebnis false.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn das Objekt ein gültiger, bereits gebundener und nicht gelöschter Renderbuffer dieses Kontexts ist, sonst false.

Beispiele

Lebenszyklus eines Renderbuffers prüfen

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

const rb = gl.createRenderbuffer();
console.log(gl.isRenderbuffer(rb)); // noch nie gebunden

gl.bindRenderbuffer(gl.RENDERBUFFER, rb);
console.log(gl.isRenderbuffer(rb)); // jetzt gültig

gl.deleteRenderbuffer(rb);
console.log(gl.isRenderbuffer(rb)); // gelöscht
false true false

Tiefenpuffer für Offscreen-Framebuffer anlegen und prüfen

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

const fbo = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);

const depthBuffer = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);
gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthBuffer);

if (!gl.isRenderbuffer(depthBuffer)) {
  throw new Error('Tiefenpuffer konnte nicht angelegt werden');
}
console.log('Tiefenpuffer bereit:', gl.isRenderbuffer(depthBuffer));
Tiefenpuffer bereit: true

Sichere Aufräumfunktion

const disposeRenderbuffer = (gl, rb) => {
  if (rb && gl.isRenderbuffer(rb)) {
    gl.deleteRenderbuffer(rb);
    return true;
  }
  return false;
};

const gl = document.createElement('canvas').getContext('webgl');
const rb = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, rb);

console.log(disposeRenderbuffer(gl, rb)); // gelöscht
console.log(disposeRenderbuffer(gl, rb)); // bereits weg
true false

// Wichtig · Fallstricke

  • Häufiger Fallstrick: Direkt nach createRenderbuffer() liefert die Methode false. Erst ein bindRenderbuffer() macht das Objekt zu einem echten Renderbuffer.
  • Stammt das Objekt aus einem anderen WebGL-Kontext, ist das Ergebnis false. Renderbuffer lassen sich nicht zwischen Kontexten teilen.
  • Nach einem Kontextverlust (webglcontextlost) gibt die Methode immer false zurück. Alle Ressourcen müssen dann neu angelegt werden.
  • Leistung: Die is*()-Abfragen können die GPU synchronisieren. Verwenden Sie sie daher nicht in jedem Frame, sondern nur beim Debuggen oder Aufräumen.
  • Die Methode gibt es auch in WebGL2RenderingContext. Sie wird von allen modernen Browsern unterstützt.