Ich schreibe einen Shader (HLSL), und ich muss einen Farbwert in das R32-Format packen. Ich habe verschiedene Code-Stücke gefunden, um einen Float in das R8G8B8A8-Format zu packen, aber keiner von ihnen scheint rückwärts zu funktionieren. Ich ziele auf SM3.0, also (afaik) -Bit-Operationen sind keine Option.
Um es zusammenzufassen, ich muss das tun können:
%Vor%Weiß jemand, wie man das macht?
UPDATE
Ich habe einige Fortschritte gemacht ... vielleicht wird das helfen, die Frage zu klären.
Meine vorläufige Lösung ist so:
Ich mache im Grunde ... so, als ob ich ganzzahlige Typen verwende: s
Durch Raten und Prüfen war 64 die höchste Zahl, die ich verwenden konnte, während ich noch einen [0 ... 1] Bereich behielt. Leider bedeutet das auch, dass ich etwas Präzision verliere - 6 statt 8 Bits.
Sehen Sie sich an: Ссылка
Die kurze Antwort ist, dass es nicht möglich ist, ein verlustfreies Packen von 4 Floats in 1 Float zu machen.
Selbst wenn Sie einen Weg finden, 4 Floats zu packen, deren Exponent und Signifikanz gespeichert werden, kann das Packen und Entpacken zu teuer sein.
Mögen Sie Ihren Beispielcode für 3 Komponenten, um sie in s = significand zu packen, und tun Sie exp2 (color.g) (1 + s), um die andere Komponente in den Exponenten zu packen. Du verlierst immer noch die Präzision, aber es wird nicht so schlimm sein, als ob du versuchst alles in den Signifikanten zu packen, so wie du es anscheinend tust.
Leider gibt es keine Möglichkeit, die Genauigkeit zu verlieren, da es eine Reihe von NaN- und Inf-Float-Werten gibt, die nicht voneinander zu unterscheiden sind und mit denen Sie nicht arbeiten können (je nachdem, wie alt sie sind) ist).