Start · Sprachen · JavaScript · Referenz · OES_vertex_array_object.isVertexArrayOES()

OES_vertex_array_object.isVertexArrayOES()

Methode

Prüft, ob das übergebene Objekt ein gültiges, noch nicht gelöschtes Vertex Array Object (<code>WebGLVertexArrayObjectOES</code>) ist, und gibt <code>true</code> oder <code>false</code> zurück.

seit JavaScript WebGL 1 Erweiterung – Baseline: alle modernen Brow Kategorie: webapi

Signatur

OES_vertex_array_object.prototype.isVertexArrayOES(arrayObject)

Beschreibung

isVertexArrayOES() gehört zur WebGL-1-Erweiterung OES_vertex_array_object. Die Erweiterung bringt Vertex Array Objects (VAOs) nach WebGL 1. Ein VAO speichert den kompletten Zustand der Vertex-Attribute, also Buffer-Bindungen, vertexAttribPointer-Konfigurationen und den gebundenen ELEMENT_ARRAY_BUFFER. Mit der Methode stellst du fest, ob ein Objekt ein echtes, verwendbares VAO ist.

Wichtig: Ein VAO gilt erst dann als Vertex Array Object, wenn es mindestens einmal mit bindVertexArrayOES() gebunden wurde. Direkt nach createVertexArrayOES() liefert isVertexArrayOES() deshalb false. Nach deleteVertexArrayOES() kommt ebenfalls false zurück, genauso bei null und nach einem Kontextverlust.

In der Praxis nutzt man die Methode vor allem beim Debuggen, in Ressourcen-Managern und in Aufräum-Routinen. Dort prüft sie, ob eine gespeicherte VAO-Referenz noch gültig ist. In WebGL 2 ist die Funktion fest eingebaut und heißt WebGL2RenderingContext.isVertexArray(). Die Erweiterung braucht man dort nicht.

Parameter

Name Typ Default Beschreibung
$arrayObject Pflicht WebGLVertexArrayObjectOES | null Das zu prüfende Objekt, normalerweise ein Rückgabewert von createVertexArrayOES().

Rückgabewert

Typ
boolean
Beschreibung
true, wenn arrayObject ein gültiges, bereits gebundenes und nicht gelöschtes VAO ist, sonst false.

Beispiele

Lebenszyklus eines VAOs prüfen

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

if (!ext) {
  throw new Error('OES_vertex_array_object wird nicht unterstützt');
}

const vao = ext.createVertexArrayOES();
console.log('nach create:', ext.isVertexArrayOES(vao));

ext.bindVertexArrayOES(vao);
console.log('nach bind:', ext.isVertexArrayOES(vao));

ext.bindVertexArrayOES(null);
ext.deleteVertexArrayOES(vao);
console.log('nach delete:', ext.isVertexArrayOES(vao));
nach create: false nach bind: true nach delete: false

VAO einrichten und vor dem Zeichnen validieren

const gl = document.querySelector('canvas').getContext('webgl');
const ext = gl.getExtension('OES_vertex_array_object');

const createTriangleVao = (program) => {
  const vao = ext.createVertexArrayOES();
  ext.bindVertexArrayOES(vao);

  const buffer = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 1, -1, -1, 1, -1]), gl.STATIC_DRAW);

  const loc = gl.getAttribLocation(program, 'aPosition');
  gl.enableVertexAttribArray(loc);
  gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0);

  ext.bindVertexArrayOES(null);
  return vao;
};

const draw = (vao) => {
  if (!ext.isVertexArrayOES(vao)) {
    console.warn('Ungültiges VAO – Zeichnen übersprungen');
    return;
  }
  ext.bindVertexArrayOES(vao);
  gl.drawArrays(gl.TRIANGLES, 0, 3);
  ext.bindVertexArrayOES(null);
};

Aufräumen in einem Ressourcen-Manager

const gl = document.createElement('canvas').getContext('webgl');
const ext = gl.getExtension('OES_vertex_array_object');
const vaos = new Map();

const register = (name) => {
  const vao = ext.createVertexArrayOES();
  ext.bindVertexArrayOES(vao);
  ext.bindVertexArrayOES(null);
  vaos.set(name, vao);
};

const disposeAll = () => {
  for (const [name, vao] of vaos) {
    if (ext.isVertexArrayOES(vao)) {
      ext.deleteVertexArrayOES(vao);
      console.log(`${name} gelöscht`);
    }
  }
  vaos.clear();
};

register('mesh');
register('sprite');
disposeAll();
mesh gelöscht sprite gelöscht

// Wichtig · Fallstricke

  • Ein neues VAO ist noch kein VAO: Ein Objekt aus createVertexArrayOES() liefert erst true, wenn es einmal gebunden wurde. Wer direkt nach dem Erzeugen prüft, bekommt false.
  • Nicht als Typprüfung gedacht: Die Methode prüft den GL-Zustand, nicht den JavaScript-Typ. Ein VAO aus einem anderen WebGL-Kontext führt zu einem Fehler oder zu false. VAOs lassen sich nicht zwischen Kontexten teilen.
  • Kontextverlust: Nach webglcontextlost liefert die Methode für alle bisherigen VAOs false. Du musst sie nach webglcontextrestored neu anlegen.
  • Performance: Wie alle is*-Abfragen kann der Aufruf den Treiber synchronisieren. Nutze die Methode deshalb nicht in jedem Frame in der Render-Schleife, sondern nur beim Debuggen und Aufräumen.
  • Kompatibilität: Die Erweiterung wird von praktisch allen WebGL-1-Implementierungen unterstützt. Prüfe trotzdem vorher, ob gl.getExtension('OES_vertex_array_object') etwas zurückgibt. In WebGL 2 steht die Erweiterung nicht zur Verfügung, dort verwendest du gl.isVertexArray().