Signatur
Beschreibung
getIndexedParameter() ist das Gegenstück zu getParameter() für indizierte Bindungspunkte. In WebGL 2 lassen sich Puffer nicht nur an ein einzelnes Ziel binden, sondern mit bindBufferBase() bzw. bindBufferRange() an nummerierte Plätze von TRANSFORM_FEEDBACK_BUFFER und UNIFORM_BUFFER. Mit dieser Methode fragt man ab, was an einem bestimmten Index gerade gebunden ist.
Je nach target bekommt man den gebundenen WebGLBuffer zurück (*_BUFFER_BINDING), den Start-Offset (*_BUFFER_START) oder die Länge des gebundenen Bereichs (*_BUFFER_SIZE). Die Offset- und Größenwerte werden als GLintptr/GLsizeiptr, also als number, zurückgegeben.
In der Praxis braucht man die Methode zum Debuggen, für Zustandsprüfungen in Engines und Bibliotheken, oder um den vorherigen Zustand zu sichern und später wiederherzustellen. Wurde ein Puffer mit bindBufferBase() gebunden, liefern START und SIZE den Wert 0.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $target Pflicht | GLenum (number) | Der abzufragende indizierte Zustand. Möglich sind:
|
|
| $index Pflicht | GLuint (number) | Index des Bindungspunkts. Er muss kleiner sein als MAX_UNIFORM_BUFFER_BINDINGS bzw. MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS. |
Rückgabewert
*_BINDING den gebundenen WebGLBuffer (oder null, wenn nichts gebunden ist), bei *_START/*_SIZE eine number. Bei ungültigen Argumenten gibt die Methode null zurück und setzt einen GL-Fehler.Beispiele
Uniform-Buffer-Bindung prüfen
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl2');
const ubo = gl.createBuffer();
gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
gl.bufferData(gl.UNIFORM_BUFFER, 256, gl.DYNAMIC_DRAW);
// An Bindungspunkt 0 binden
gl.bindBufferBase(gl.UNIFORM_BUFFER, 0, ubo);
const bound = gl.getIndexedParameter(gl.UNIFORM_BUFFER_BINDING, 0);
console.log(bound === ubo);
Offset und Größe eines Bereichs abfragen
const gl = document.createElement('canvas').getContext('webgl2');
const buffer = gl.createBuffer();
gl.bindBuffer(gl.UNIFORM_BUFFER, buffer);
gl.bufferData(gl.UNIFORM_BUFFER, 1024, gl.DYNAMIC_DRAW);
// Offset muss ein Vielfaches von UNIFORM_BUFFER_OFFSET_ALIGNMENT sein
const align = gl.getParameter(gl.UNIFORM_BUFFER_OFFSET_ALIGNMENT);
gl.bindBufferRange(gl.UNIFORM_BUFFER, 1, buffer, align, 64);
const start = gl.getIndexedParameter(gl.UNIFORM_BUFFER_START, 1);
const size = gl.getIndexedParameter(gl.UNIFORM_BUFFER_SIZE, 1);
console.log(`Start: ${start}, Größe: ${size}`);
Transform-Feedback-Bindungen sichern und wiederherstellen
const gl = document.createElement('canvas').getContext('webgl2');
const saveTFBinding = (index) => ({
buffer: gl.getIndexedParameter(gl.TRANSFORM_FEEDBACK_BUFFER_BINDING, index),
start: gl.getIndexedParameter(gl.TRANSFORM_FEEDBACK_BUFFER_START, index),
size: gl.getIndexedParameter(gl.TRANSFORM_FEEDBACK_BUFFER_SIZE, index)
});
const restoreTFBinding = (index, { buffer, start, size }) => {
if (buffer && size > 0) {
gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, index, buffer, start, size);
} else {
gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, index, buffer);
}
};
const saved = saveTFBinding(0);
console.log(saved);
// ... eigene Render-Arbeit ...
restoreTFBinding(0, saved);
// Wichtig · Fallstricke
- Nur WebGL 2: In einem WebGL-1-Kontext (
getContext('webgl')) gibt es die Methode nicht. Vorher prüfen, obgetContext('webgl2')nichtnullliefert. - Leistung: Wie alle
get*-Abfragen kann der Aufruf eine Synchronisation mit der GPU bzw. dem GPU-Prozess erzwingen. In der Render-Schleife besser vermeiden und den Zustand lieber selbst in JavaScript mitführen. - Ist der Index zu groß, wird
gl.INVALID_VALUEgesetzt, bei unbekanntemtargetgl.INVALID_ENUM; der Rückgabewert ist dannnull. Mitgl.getError()lässt sich das prüfen. - Nach
bindBufferBase()liefern*_STARTund*_SIZEden Wert0und nicht die tatsächliche Puffergröße. - Die in OpenGL ES 3.0 vorhandenen
GL_*-Ziele wieMAX_COMPUTE_WORK_GROUP_COUNTgibt es in WebGL 2 nicht. - Browser-Unterstützung: Chrome 56+, Firefox 51+, Safari 15+, Edge 79+.