以下を使用して、精度をあまり損なうことなく、[0,1]の値でfloatを正常にパックしました。
byte packedVal = floatVal * 255.0f ; // [0,1] -> [0,255]
次に、packedValをフロートに戻したいときは、単純に次のようにします。
float unpacked = packedVal / 255.0f ; // [0,255] -> [0,1]
フロートが0から1の間にある限り、これは問題なく機能します。
これが本物の取引です。float
3D空間ベクトル(3つのコンポーネントを含む)を4バイトに変換しようとしています。これを行う理由は、ベクトルごとに1ピクセルで、これらのベクトルを格納するためにテクスチャを使用しているためです。これは「法線マップ」のようなものである必要があります(ただし、正確にはこれではありません。ジャンプ後に理由がわかります)。
したがって、各ピクセルは3D空間ベクトルを表します。値が非常に赤い場合、法線ベクトルの方向はほとんど+ x(右側)です。
したがって、もちろん、法線は正規化されます。したがって、マグニチュード(スケーリング)ベクトルは必要ありません。しかし、私は任意の大きさのベクトルを格納しようとしています。ピクセルごとに1つのベクトルです。
テクスチャには4つのコンポーネント(rgba)があるため、wコンポーネントにスケーリングベクトルを格納することを考えています。
任意のサイズの3空間ベクトル(たとえば、x、y、zのそれぞれの大きさの上限が200程度)を4バイトのピクセルカラー値にパックするための他の提案はありますか?