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

WebGL2RenderingContext.pauseTransformFeedback()

Methode

Pausiert die aktive Transform-Feedback-Operation, sodass Draw-Calls vorübergehend keine Vertex-Daten mehr in die Feedback-Puffer schreiben.

seit JavaScript WebGL 2.0 – Baseline: alle modernen Browser (seit Kategorie: webapi

Signatur

WebGL2RenderingContext.prototype.pauseTransformFeedback()

Beschreibung

Mit pauseTransformFeedback() hältst du eine laufende Transform-Feedback-Operation an, die vorher mit beginTransformFeedback() gestartet wurde. Solange sie pausiert ist, schreiben Draw-Calls keine Ausgaben des Vertex-Shaders in die gebundenen TRANSFORM_FEEDBACK_BUFFER-Puffer. Die Schreibposition in den Puffern bleibt erhalten. Nach resumeTransformFeedback() geht es genau an dieser Stelle weiter.

Gebraucht wird das, wenn du zwischen zwei aufgezeichneten Draw-Calls etwas anderes zeichnen willst, das nicht in den Feedback-Puffer soll, zum Beispiel ein Debug-Overlay oder eine Vorschau. Ein weiterer Fall ist das Wechseln des Transform-Feedback-Objekts mit bindTransformFeedback(). Das geht nur, wenn das aktuelle Objekt pausiert oder gar nicht aktiv ist. So kannst du mehrere Feedback-Aufzeichnungen abwechselnd fortführen, etwa in Partikelsystemen mit mehreren Emittern.

Während der Pause darfst du auch ein anderes Shader-Programm mit useProgram() aktivieren. Das ist bei aktivem, nicht pausiertem Transform Feedback verboten. Vor resumeTransformFeedback() muss aber wieder dasselbe Programm aktiv sein, mit dem die Aufzeichnung begonnen wurde.

Rückgabewert

Typ
void
Beschreibung
Kein Rückgabewert (undefined).

Beispiele

Transform Feedback pausieren und fortsetzen

const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl2');

// Annahme: 'program' wurde mit gl.transformFeedbackVaryings(...) gelinkt
// und 'tfBuffer' ist ausreichend groß angelegt.
const tf = gl.createTransformFeedback();
gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, tf);
gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, tfBuffer);

gl.useProgram(program);
gl.beginTransformFeedback(gl.POINTS);
gl.drawArrays(gl.POINTS, 0, 100); // wird aufgezeichnet

gl.pauseTransformFeedback();
console.log(gl.getParameter(gl.TRANSFORM_FEEDBACK_PAUSED));
gl.drawArrays(gl.POINTS, 100, 50); // wird NICHT aufgezeichnet

gl.resumeTransformFeedback();
gl.drawArrays(gl.POINTS, 150, 100); // wird hinter die ersten 100 geschrieben
gl.endTransformFeedback();
true

Während der Pause mit anderem Programm ein Overlay zeichnen

const renderFrame = (gl, simProgram, overlayProgram, tf, count) => {
  gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, tf);
  gl.useProgram(simProgram);
  gl.beginTransformFeedback(gl.POINTS);
  gl.drawArrays(gl.POINTS, 0, count);

  // Programmwechsel ist nur im pausierten Zustand erlaubt
  gl.pauseTransformFeedback();
  gl.useProgram(overlayProgram);
  gl.drawArrays(gl.TRIANGLES, 0, 6); // Overlay, landet nicht im Feedback-Puffer

  // Vor dem Fortsetzen wieder das ursprüngliche Programm aktivieren
  gl.useProgram(simProgram);
  gl.resumeTransformFeedback();
  gl.endTransformFeedback();
};

Zwischen zwei Transform-Feedback-Objekten wechseln

// tfA und tfB sind Transform-Feedback-Objekte mit eigenen Puffern
gl.useProgram(program);

gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, tfA);
gl.beginTransformFeedback(gl.POINTS);
gl.drawArrays(gl.POINTS, 0, 10);
gl.pauseTransformFeedback(); // Pflicht vor dem Wechsel des Objekts

gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, tfB);
gl.beginTransformFeedback(gl.POINTS);
gl.drawArrays(gl.POINTS, 0, 10);
gl.endTransformFeedback();

// Zurück zu tfA und dort weiter aufzeichnen
gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, tfA);
gl.resumeTransformFeedback();
gl.drawArrays(gl.POINTS, 10, 10);
gl.endTransformFeedback();
console.log(gl.getError() === gl.NO_ERROR);
true

// Wichtig · Fallstricke

  • INVALID_OPERATION entsteht, wenn Transform Feedback nicht aktiv ist (kein beginTransformFeedback()) oder schon pausiert ist. Die Methode wirft keine Exception. Fehler musst du mit gl.getError() prüfen.
  • Den Zustand kannst du mit gl.getParameter(gl.TRANSFORM_FEEDBACK_PAUSED) und gl.getParameter(gl.TRANSFORM_FEEDBACK_ACTIVE) abfragen.
  • Vor resumeTransformFeedback() muss wieder dasselbe Programm aktiv sein wie bei beginTransformFeedback(), sonst gibt es INVALID_OPERATION.
  • Auch pausiert gilt Transform Feedback als aktiv. Deshalb darfst du die gebundenen Feedback-Puffer nicht gleichzeitig als Vertex-Attribut oder anderweitig verwenden, und endTransformFeedback() ist trotzdem nötig.
  • Nur in WebGL 2 verfügbar (getContext('webgl2')), nicht in WebGL 1. Wird von allen aktuellen Browsern unterstützt, Safari ab Version 15.