Start · Sprachen · JavaScript · Referenz · WebGL2RenderingContext.getIndexedParameter()

WebGL2RenderingContext.getIndexedParameter()

Methode

Liefert den Zustand eines indizierten Bindungspunkts, z. B. den Puffer, Offset oder die Größe eines Transform-Feedback- oder Uniform-Buffer-Bindungspunkts.

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

Signatur

WebGL2RenderingContext.prototype.getIndexedParameter(target, index)

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:
  • gl.TRANSFORM_FEEDBACK_BUFFER_BINDING – gibt WebGLBuffer zurück
  • gl.TRANSFORM_FEEDBACK_BUFFER_SIZE – gibt number zurück
  • gl.TRANSFORM_FEEDBACK_BUFFER_START – gibt number zurück
  • gl.UNIFORM_BUFFER_BINDING – gibt WebGLBuffer zurück
  • gl.UNIFORM_BUFFER_SIZE – gibt number zurück
  • gl.UNIFORM_BUFFER_START – gibt number zurück
$index Pflicht GLuint (number) Index des Bindungspunkts. Er muss kleiner sein als MAX_UNIFORM_BUFFER_BINDINGS bzw. MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS.

Rückgabewert

Typ
WebGLBuffer | number | null
Beschreibung
Bei *_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);
true

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}`);
Start: 256, Größe: 64 (Start abhängig von der Hardware-Ausrichtung)

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);
{ buffer: null, start: 0, size: 0 }

// Wichtig · Fallstricke

  • Nur WebGL 2: In einem WebGL-1-Kontext (getContext('webgl')) gibt es die Methode nicht. Vorher prüfen, ob getContext('webgl2') nicht null liefert.
  • 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_VALUE gesetzt, bei unbekanntem target gl.INVALID_ENUM; der Rückgabewert ist dann null. Mit gl.getError() lässt sich das prüfen.
  • Nach bindBufferBase() liefern *_START und *_SIZE den Wert 0 und nicht die tatsächliche Puffergröße.
  • Die in OpenGL ES 3.0 vorhandenen GL_*-Ziele wie MAX_COMPUTE_WORK_GROUP_COUNT gibt es in WebGL 2 nicht.
  • Browser-Unterstützung: Chrome 56+, Firefox 51+, Safari 15+, Edge 79+.