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

WebGLRenderingContext.isBuffer()

Methode

Prüft, ob das übergebene <code>WebGLBuffer</code>-Objekt ein gültiger, bereits gebundener und noch nicht gelöschter Buffer ist, und liefert <code>true</code> oder <code>false</code>.

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

Signatur

WebGLRenderingContext.prototype.isBuffer(buffer)

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));
nach createBuffer: false nach bindBuffer: true nach deleteBuffer: false

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();
dreieck gelöscht quad war bereits ungültig

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();
Buffer (neu) angelegt

// Wichtig · Fallstricke

  • Erst gebunden, dann gültig: Direkt nach createBuffer() liefert isBuffer() false. Der Buffer gilt erst nach dem ersten bindBuffer() als gültig.
  • Falscher Typ: Wenn du etwas anderes als WebGLBuffer oder null übergibst (etwa eine Zahl oder eine WebGLTexture), wird ein TypeError ausgelöst.
  • Fremde Kontexte: Ein Buffer aus einem anderen WebGL-Kontext gilt nicht als gültig. Es kann zusätzlich der Fehler INVALID_OPERATION gesetzt werden.
  • Kontextverlust: Nach webglcontextlost liefert die Methode für alle Buffer false. 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 WebGL2RenderingContext und in Web Workern über OffscreenCanvas.