Das GLSL-Paket schwebt in einer RGBA-Textur

8

Ich möchte herkömmliche dreieckbasierte Modelle und Partikel mit einer Raytrace-Szene mit einer angemessenen Bildrate zusammenstellen.

Mit webGL können Sie das nicht gl_FragDepthin den Fragment-Shader schreiben . Sie können nicht mehrere Renderziele haben, aber Sie können in eine RGBA-Textur rendern und diese Textur dann als Eingabe für ein anderes Draw-Op verwenden. So kann ich meine Raytrace-Szene rendern und die Tiefe als Eingabe für die nächste Stufe speichern. Dies ist offensichtlich alles andere als ideal, aber praktikabel.

Ich würde gerne falsch liegen, und dies wird eher aus Versuch und Irrtum als aus einer endgültigen Quelle gewonnen. Bitte korrigieren Sie fehlerhafte Annahmen

Wie können Sie einen Float und im Idealfall einige Flag-Bits und dergleichen effizient in eine RGBA-Textur in einem GLSL-Fragment-Shader packen / entpacken?

Wille
quelle
2
Es gibt einen alten Artikel im ersten GPU Gems-Buch über Schattenzuordnung (Sie können ihn hier lesen: http.developer.nvidia.com/GPUGems/gpugems_ch12.html ). Es wird erklärt, wie Floats in einer RGBA-Textur auf zwei verschiedene Arten verpackt werden. Lesen Sie zum Schreiben Abschnitt 12.3.3 und zum Lesen 12.3.6.
Benlitz
1
Eine weitere hilfreiche Ressource ist der Artikel "Compact Normal Storage für kleine G-Puffer" von Aras P aus Unity ( aras-p.info/texts/CompactNormalStorage.html ). Dieser Artikel ist nur auf Normalen beschränkt.
Mortennobel
1
Sie können eine R32F-Textur erstellen und dort einfach Ihre Tiefenwerte schreiben. ohne packen auspacken. Verwenden Sie diese Textur dann während Ihres zweiten "konventionellen dreieckbasierten" Durchgangs als Tiefenpuffer (als Tiefe an FBO angehängt). Fühlen Sie sich frei, mehr zu fragen, wenn dies nicht klar ist.
Alariq
@alariq Ja, die Float-Erweiterung wird jetzt weitgehend unterstützt.
Will
@Will Wenn die float-Erweiterung Ihr Problem gelöst hat, senden Sie sie als Antwort und akzeptieren Sie sie.
Polar

Antworten:

5

Hier finden Sie Funktionen zum Ein- und Auspacken, die unter WebGL und OpenGL ES 2.0 funktionieren. Dies gilt nur für Werte im Bereich von 0 bis 1, daher sollten Sie darauf achten, dass sich Ihre Tiefenberechnung im richtigen Bereich befindet.

Codierung Floats zu RGBA

gbpaul
quelle
Können Sie die Codefragmente zu Ihrer Antwort hinzufügen? Wenn die von Ihnen erwähnte Site ausfällt, ist der Link nicht gut.
Felipe Gutierrez