Signatur
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
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));
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();
// Wichtig · Fallstricke
- Ein neues VAO ist noch kein VAO: Ein Objekt aus
createVertexArrayOES()liefert ersttrue, wenn es einmal gebunden wurde. Wer direkt nach dem Erzeugen prüft, bekommtfalse. - 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
webglcontextlostliefert die Methode für alle bisherigen VAOsfalse. Du musst sie nachwebglcontextrestoredneu 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 dugl.isVertexArray().