2

私は Direct3d 11 を使用していますが、奇妙なことに遭遇しました。法線マップを取得し、それを DDS ファイルに 2 回エンコードしました。1 回はR8G8B8A8_SNORMエンコーディングで、もう 1 回はBC5_SNORMで。

次に、 D3DX11GetImageInfoFromFileと組み合わせてD3DX11CreateShaderResourceViewFromFileを使用して、各テクスチャを読み込みます。ピクセル シェーダーでこれらのテクスチャをサンプリングすると、R8G8B8A8_SNORMテクスチャが [-1,1] の範囲の値を返していることがわかりました。これは、SNORM テクスチャに期待する値です。ただし、BC5_SNORMテクスチャは [0,1] の範囲の値を返しますが、これは私には意味がありません。

デバッガーと PIX でチェックしたトリプルを 2 倍にします。テクスチャの形式は正しい ( BC5_*S*NORM ) ため、符号付きの値が返されない理由がわかりません。

4

1 に答える 1

1

私はあなたと同じ問題を再現することができました。また、 D3Dx11LoadTextureFromTexture を介して変換を行うときに、 R8G8B8A8_SNORM テクスチャ (-1 から +1 の値) から BC5_SNORM (0 から 1 の値のみを生成) に変換すると、同じ動作が得られまし。D3DX11 には、少なくとも BC5_SNORM に関しては、すべての種類の入力形式に関係なく、(BC5)SNORM 出力が常に 0 ~ 1 の範囲にあるという欠点があるようです。

@chuckwalbourn が提案したように、現在廃止されている D3DX11 に取って代わるDirectXTexユーティリティが、BC5_SNORM 出力の符号付き値を尊重し、正しく処理することを確認できます。

プログラムに一時的な .dds を書き出させ ( R8G8B8A8_SNORM テクスチャでD3DX11SaveTextureToFileを使用)、スタンドアロンの DirectXTex 'texconv.exe' ユーティリティを呼び出して BC5_SNORM に変換するか、DirectXTex ライブラリをプログラムに取り込んで 'Convert (...)' が適切に機能します。

于 2014-07-22T13:19:58.657 に答える