0

以下を使用して、精度をあまり損なうことなく、[0,1]の値でfloatを正常にパックしました。

byte packedVal = floatVal * 255.0f ; // [0,1] -> [0,255]

次に、packedValをフロートに戻したいときは、単純に次のようにします。

float unpacked = packedVal / 255.0f ; // [0,255] -> [0,1]

フロートが0から1の間にある限り、これは問題なく機能します。

これが本物の取引です。float3D空間ベクトル(3つのコンポーネントを含む)を4バイトに変換しようとしています。これを行う理由は、ベクトルごとに1ピクセルで、これらのベクトルを格納するためにテクスチャを使用しているためです。これは「法線マップ」のようなものである必要があります(ただし、正確にはこれではありません。ジャンプ後に理由がわかります)。

法線マップ

したがって、各ピクセルは3D空間ベクトルを表します。値が非常に赤い場合、法線ベクトルの方向はほとんど+ x(右側)です。

したがって、もちろん、法線は正規化されます。したがって、マグニチュード(スケーリング)ベクトルは必要ありません。しかし、私は任意の大きさのベクトルを格納しようとしています。ピクセルごとに1つのベクトルです。

テクスチャには4つのコンポーネント(rgba)があるため、wコンポーネントにスケーリングベクトルを格納することを考えています。

任意のサイズの3空間ベクトル(たとえば、x、y、zのそれぞれの大きさの上限が200程度)を4バイトのピクセルカラー値にパックするための他の提案はありますか?

4

2 に答える 2

0

マグニチュードを 4 番目のコンポーネントに格納することは非常に理にかなっているように思えます。マグニチュードが合理的で完全に恣意的ではないものに制限されている限り。

より柔軟な大きさの範囲が必要な場合は、正規化された方向ベクトルを格納するときに (0.5, 1.0] を事前に乗算し、展開するときに pow(2, w) を乗算することができます。

于 2012-07-09T13:13:35.057 に答える
0

このような方法は、ハイ ダイナミック レンジ イメージを保存するために使用されます - RGBM エンコーディング (M はマグニチュードを表します)。欠点の 1 つは、補間の結果が正しくないため、テクスチャにバイリニア フィルタリングを使用できないことです。

HDR エンコーディングから他のオプションを探すことができます:最も人気のあるいくつかの小さなリストを次に示します。

于 2014-07-15T18:57:48.740 に答える