もさぷい

ゲーム、3D関連技術ついて

シェーダ(HLSL)内における、整数テクスチャと浮動小数テクスチャの挙動について

DirectXのシェーダ(HLSL)における、整数テクスチャと浮動小数テクスチャの挙動が、

気になったので調査した。忘れないようにまとめる。

 


『整数テクスチャについての調査』

 

結果:

・シェーダー内において、整数テクスチャは、0から1までの値しか扱えなかった。

・シェーダ内で整数テクスチャにtex2D関数でテクスチャのピクセルにアクセスした場合、戻り値として帰ってくるピクセルの値は、0から1.0fの値であった。(整数テクスチャに格納されている0から255の値を0.0fから1.0fの値で扱うということである)

・アプリケーション側からテクスチャの内容にアクセスすると、内容には0から1の値が入っているのではなく、0から255の値の整数値が入っていた。

・[D3DFMT_~~]は、[D3DFMT_上位ビット~下位ビット] という表記になっている。

 

まとめ:

・整数テクスチャは、0から255までの整数値を記憶するものである。

・シェーダー内で見た場合とアプリケーション側で見た場合で扱う値が変わる。ちょこっとややこしいので注意!!

・シェーダー内でピクセルの値を見ると、ピクセルの値は0から1.0fとなる。(シェーダー内では、整数テクスチャのピクセル値0から255の値を0から1.0fの値として扱うことになる)

・アプリケーション側でピクセルの値を見ると、ピクセルの値は0から255となる。

・シェーダー内で、1.0fより大きい値をいれても、1.0fとして扱われる。


浮動小数テクスチャについての調査』

結果:

・シェーダー内において、浮動小数テクスチャは、指定したフォーマットの精度で表せる値が扱えた。D3DFMT_A32B32G32R32Fなら、各色、32bitで表せる値が扱える。

・シェーダ内で浮動小数テクスチャにtex2D関数でテクスチャのピクセルにアクセスした場合、戻り値として帰ってくるピクセルの値は、指定したフォーマットの精度で表せる値であった。

・アプリケーション側からテクスチャの内容にアクセスすると、内容には指定したフォーマットの精度で表せる浮動小数値が入っていた。シェーダー内で格納した値と等しかったということである。

・[D3DFMT_~~]は、[D3DFMT_上位ビット~下位ビット] という表記になっている。

 

まとめ:

浮動小数テクスチャは、指定したフォーマットの精度で表せる浮動小数値を記憶するものである。

・シェーダー内で見た場合とアプリケーション側で見た場合において、扱う値は同じ。(整数テクスチャのような、0から255の値を0から1.0fの値として扱うことはない)

 

まとめからわかること:

浮動小数テクスチャは、シェーダー内、アプリケーション側に関わらず、整数テクスチャのように、値が変換されることはない。そのため、ポリゴンに貼るなどして、浮動小数テクスチャを画面に表示する場合、シェーダー内で浮動小数テクスチャの内容を0から1.0fに直して、色を出力する必要がある。(HDR処理の時とか)

浮動小数テクスチャを使えば、シェーダー内の演算結果を保存して、見ることができる。