Signatur
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
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();
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);
// Wichtig · Fallstricke
INVALID_OPERATIONentsteht, wenn Transform Feedback nicht aktiv ist (keinbeginTransformFeedback()) oder schon pausiert ist. Die Methode wirft keine Exception. Fehler musst du mitgl.getError()prüfen.- Den Zustand kannst du mit
gl.getParameter(gl.TRANSFORM_FEEDBACK_PAUSED)undgl.getParameter(gl.TRANSFORM_FEEDBACK_ACTIVE)abfragen. - Vor
resumeTransformFeedback()muss wieder dasselbe Programm aktiv sein wie beibeginTransformFeedback(), sonst gibt esINVALID_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.