Ich muss bis zu 8 32-Bit-Werte in jedem WebGL-Fragment-Shader-Aufruf speichern (einschließlich wenn keine OES_texture_float- oder OES_texture_half_float-Erweiterungen verfügbar sind). Es scheint, dass ich nur einen einzigen 32-Bit-Wert speichern kann, indem ich ihn in 4x8bits RGBA gl_FragColor packe. Gibt es eine Möglichkeit, 8 Werte zu speichern?WebGL-Shader speichert mehrere 32-Bit-Werte
Antwort
Die einzige Möglichkeit, mehr als einen vec4-Wert pro Aufruf im Fragment-Shader zu zeichnen, ist WEBGL_draw_buffers
, mit dem Sie mehrere Farbanhänge an einen Framebuffer binden und dann alle in einem einzelnen Fragment-Shader-Aufruf rendern können
gl_FragData[constAttachmentIndex] = result;
Wenn WEBGL_draw_buffers
nicht verfügbar ist die einzige Abhilfen sind ich denken kann, sind
Rendering in mehreren Zeichenaufrufen.
Rufen Sie
gl.drawArrays
, um die erstevec4
, dann wieder mit anderen Parametern oder einem anderen Shader zu rendern, um die zweitevec4
zu rendern.Render basierend auf gl_FragCoord, wo Sie die Ausgabe für jedes Pixel ändern.
In anderen Worten, bekommt erste Pixel das erste vec4, zweite Pixel des zweiten vec4 bekommt, etc. Zum Beispiel
float mode = mod(gl_Fragcoord.x, 2.); gl_FragColor = mix(result1, result2, mode);
Auf diese Weise werden die Ergebnisse wie diese
1212121212 1212121212 1212121212
in einem gespeicherten Textur. Für mehr vec4s könnten Sie dies tun
Dies kann oder nicht schneller als Methode # 1 sein. Ihr Shader ist komplizierter, weil er möglicherweise Berechnungen für result1 und result2 für jedes Pixel durchführt, aber abhängig von der GPU und dem Pipelining erhalten Sie möglicherweise einen Teil davon kostenlos.
Wie für 32-Bit-Werte bekommen, selbst wenn es keine OES_texture_float
ist bist du im Grunde noch mehr 8bit-Wert eine der drei Techniken, die oben mit gehen zu müssen, schreiben.
In WebGL2 zeichnen Puffer ist eine Funktion erforderlich, wie es in WebGL1 optional ist. In WebGL2 gibt es auch ein Transformations-Feedback, das die Ausgaben eines Vertex-Shaders (die Varyings) in Puffer schreibt.
- 1. Spark mehrere Datenrahmen speichert
- 2. Django speichert mehrere Benutzertypen
- 3. mehrere Persistenz speichert mit Kerndaten
- 4. Mehrere speichert mit einem Senden
- 5. Wie speichert man mehrere Formulare?
- 6. carrierwave mehrere Datei lädt und speichert
- 7. Spalte Familie speichert vs Dokument speichert
- 8. Ich möchte, dass mein Programm mehrere Datensätze speichert, aber es speichert nur einen temporären Datensatz
- 9. CakePHP: hasOne verwandte Tabelle speichert mehrere Einträge bei Aktualisierungen
- 10. Ansible - Wie man Befehlsausgabe erfasst und als mehrere Variablen speichert
- 11. Desktop-Anwendung - Wie man Daten für mehrere Stiefel speichert
- 12. Warum speichert ENUM nicht mehrere Werte in MySQL?
- 13. AJAX speichert JSON-Array in mehrere JS-Variablen
- 14. Wie man mehrere UITextFields in einem Dictionary speichert
- 15. Gstreamer streamt mehrere Kameras über RTP und speichert jeden Stream
- 16. Wie speichert man mehrere Elemente in einer Variablen in js?
- 17. Wie speichert man mehrere Objekte in flex sharedlocalobject?
- 18. Laravel - Wie man mehrere Objekte in einer Sitzung speichert
- 19. Wie man mehrere Spalten mit einem Klick in yii2 speichert
- 20. Wo speichert Steam Bibliotheksverzeichnisse?
- 21. Wo speichert Hive Metastore speichert Informationen?
- 22. Wie erhält man mehrere ausgewählte Zeilenwerte aus der uitableview und speichert mehrere ausgewählte Werte im Array?
- 23. Bild speichert
- 24. Speichert Git-Svn Svn Passwörter?
- 25. Weblogic speichert kein LDAP
- 26. Wo speichert Redis die Daten
- 27. ember-data: Wie man eine Flash-Nachricht speichert/speichert
- 28. Wo speichert openwrt die Zeit? Wie speichert es die Zeit?
- 29. Speichert Entity Framework alle oder speichert nur Änderungen?
- 30. Wo speichert Bundler Edelsteine?
Ist Webgl 2 verfügbar? – harold
@harold, webgl 1 muss auch unterstützt werden –
@ gman, danke für den Tipp, aber eine weit verbreitete Lösung wird benötigt –