1つの32ビット浮動変数に2つのfloat値を格納したいとします。エンコードはC#で行われ、デコードはHLSLシェーダで行われます。2つのfloat値を1つのfloat変数に格納する
123.456 -> 12.3 and 45.6
それができる」:
私がこれまでに見つけた最高のソリューションは、ハードワイヤリングエンコードされた値の小数点以下のオフセットと「キャリア」フロートの整数と小数としてそれらを格納しています負の値を扱うことはできますが、それは問題ありません。
しかし、私はこれを行うより良い方法があるのだろうかと思っていました。
EDIT:タスクの詳細いくつかの詳細:私は頂点データは、フロートとして格納されているユニティで固定データ構造で働いている
。 (Float2はUV、float3は法線など)明らかに余分なデータを適切に追加する方法はないので、これらの制限内で作業しなければならないので、データをエンコードするというより一般的な問題。たとえば、2x2の余分なデータチャネルを転送するために、2次UVデータを犠牲にすることができます。
ターゲットはシェイダーモデル3.0ですが、デコードがSM2.0でも合理的に機能していたかどうかは気にしません。
「妥当」である限り、データの消失は問題ありません。期待される値の範囲は0..64ですが、シェイダー内の任意の範囲に再マップするのが安いので、私はそれを考えようとすると0..1もうまくいくでしょう。重要なことは、可能な限り高い精度を維持することです。負の値は重要ではありません。
@ ZoltanE:エンコードしようとしている変数の範囲を知っていますか? –
@ ZoltanE:DirectXのどのシェーダモデルとバージョンをターゲットにしていますか?このようにエンコードする理由の詳細を教えてください。最後に、[gamedev](http://gamedev.stackexchange.com/)サイトで質問してみると、より良い回答が得られるかもしれません。 –
多分質問http://stackoverflow.com/questions/4811219/pack-four-bytes-in-a-floatがあなたを助けるかもしれません。 – Gnietschow