Signatur
Beschreibung
isBuffer() ist eine Prüfmethode des WebGL-Kontexts. Sie gibt an, ob ein WebGLBuffer gerade als echter Buffer auf der GPU-Seite existiert. Das ist nützlich zum Debuggen, für Aufräumroutinen und für Ressourcenverwaltungen, die feststellen sollen, ob ein Buffer schon gelöscht wurde oder nach einem Kontextverlust neu angelegt werden muss.
Wichtig: Ein mit createBuffer() erzeugtes Objekt gilt erst dann als Buffer, wenn es mindestens einmal per bindBuffer() gebunden wurde. Vorher gibt isBuffer() false zurück. Nach deleteBuffer() liefert die Methode ebenfalls wieder false.
Die Methode steht in gleicher Form auch in WebGL2RenderingContext zur Verfügung. Weil sie eine Anfrage an den Treiber auslösen kann, gehört sie nicht in die Render-Schleife. Nutze sie nur in Debug- oder Verwaltungscode.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $buffer Pflicht | WebGLBuffer | null | Das zu prüfende Buffer-Objekt. Bei null ist das Ergebnis false. |
Beispiele
Lebenszyklus eines Buffers prüfen
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');
const buffer = gl.createBuffer();
console.log('nach createBuffer:', gl.isBuffer(buffer));
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
console.log('nach bindBuffer:', gl.isBuffer(buffer));
gl.deleteBuffer(buffer);
console.log('nach deleteBuffer:', gl.isBuffer(buffer));
Sicheres Aufräumen in einer Ressourcenverwaltung
const gl = document.createElement('canvas').getContext('webgl');
const buffers = new Map();
const createVertexBuffer = (name, data) => {
const buf = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);
buffers.set(name, buf);
return buf;
};
const disposeAll = () => {
for (const [name, buf] of buffers) {
if (gl.isBuffer(buf)) {
gl.deleteBuffer(buf);
console.log(`${name} gelöscht`);
} else {
console.log(`${name} war bereits ungültig`);
}
}
buffers.clear();
};
createVertexBuffer('dreieck', [0, 1, -1, -1, 1, -1]);
createVertexBuffer('quad', [-1, -1, 1, -1, 1, 1, -1, 1]);
gl.deleteBuffer(buffers.get('quad'));
disposeAll();
Buffer nach Kontextverlust neu anlegen
const canvas = document.querySelector('canvas') ?? document.createElement('canvas');
const gl = canvas.getContext('webgl');
let vbo = null;
const ensureBuffer = () => {
if (!gl.isBuffer(vbo)) {
vbo = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, 1, 0, 0, 1]), gl.STATIC_DRAW);
console.log('Buffer (neu) angelegt');
}
};
canvas.addEventListener('webglcontextlost', (e) => e.preventDefault());
canvas.addEventListener('webglcontextrestored', ensureBuffer);
ensureBuffer();
// Wichtig · Fallstricke
- Erst gebunden, dann gültig: Direkt nach
createBuffer()liefertisBuffer()false. Der Buffer gilt erst nach dem erstenbindBuffer()als gültig. - Falscher Typ: Wenn du etwas anderes als
WebGLBufferodernullübergibst (etwa eine Zahl oder eineWebGLTexture), wird einTypeErrorausgelöst. - Fremde Kontexte: Ein Buffer aus einem anderen WebGL-Kontext gilt nicht als gültig. Es kann zusätzlich der Fehler
INVALID_OPERATIONgesetzt werden. - Kontextverlust: Nach
webglcontextlostliefert die Methode für alle Bufferfalse. Nach der Wiederherstellung musst du alle Ressourcen neu anlegen. - Leistung: Rufe die Methode nicht in jedem Frame auf, denn sie kann die GPU-Pipeline synchronisieren. Verwalte den Zustand besser selbst im JavaScript-Code.
- Kompatibilität: Wird von allen modernen Browsern unterstützt, auch in
WebGL2RenderingContextund in Web Workern überOffscreenCanvas.