2 つの float 値を 1 つの 32 ビット float 変数に格納したいと思います。エンコードは C# で行われ、デコードは HLSL シェーダーで行われます。
これまでに見つけた最善の解決策は、エンコードされた値の小数のオフセットを配線し、それらを「キャリア」浮動小数点数の整数と小数として格納することです。
123.456 -> 12.3 and 45.6
負の値は処理できませんが、問題ありません。
しかし、これを行うためのより良い方法があるかどうか疑問に思っていました。
編集:タスクに関するいくつかの詳細:
頂点データが float として格納される Unity の固定データ構造を使用しています。(UV の場合は Float2、法線の場合は float3 など。)どうやら余分なデータを適切に追加する方法がないため、これらの制限内で作業する必要があります。そのため、データのエンコードに関するより一般的な問題が原因であると考えました。 . たとえば、2x2 の余分なデータ チャネルを転送するために、セカンダリ UV データを犠牲にすることができます。
ターゲットはシェーダーモデル 3.0 ですが、SM2.0 でもデコードが適切に機能していれば問題ありません。
「合理的」である限り、データの損失は問題ありません。期待される値の範囲は 0..64 ですが、考えてみると 0..1 でも問題ないでしょう。重要なことは、精度をできるだけ高く保つことです。負の値は重要ではありません。