Signatur
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
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
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));
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
// Wichtig · Fallstricke
- Häufiger Fallstrick: Direkt nach
createRenderbuffer()liefert die Methodefalse. Erst einbindRenderbuffer()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 immerfalsezurü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.