5

DXGI_FORMAT の公式ドキュメントでは、_SRGB 列挙接尾辞を持つ形式のみが sRGB 色空間にあることがわかります。この接尾辞のない他の形式はすべて線形空間にあると思いました。しかし、DirectXTex ライブラリのフォーマット変換関数の非常に奇妙な動作を見つけました。( http://directxtex.codeplex.com/からダウンロードできます)

まず、NVIDIA Photoshop DDS Plugin を使用して、テクスチャ ファイルを DXGI_FORMAT_R32G32B32A32_FLOAT としてエクスポートしました。次に、このファイルを LoadFromDDSFile() 関数で読み込み、Convert() 関数でその形式を DXGI_FORMAT_R16G16B16A16_UNORM に変換します。(これら 2 つの関数はどちらも DirectXTex ライブラリによって提供されます。)

何だと思いますか?画像を DXGI_FORMAT_R16G16B16A16_UNORM に変換した後、すべてのピクセルの明るさも変更され、画像全体が以前よりも明るくなりました。

画像を DXGI_FORMAT_R16G16B16A16_UNORM 形式に変換した後で、ピクセル値を sRGB 空間から線形空間に手動で変換すると、結果のピクセル値は入力と同じになります。したがって、DirectXTex ライブラリは DXGI_FORMAT_R32G32B32A32_FLOAT をリニア色空間のフォーマットとして扱い、DXGI_FORMAT_R16G16B16A16_UNORM を sRGB 色空間のフォーマットとして扱い、リニア空間から sRGB 空間への色空間変換を行ったのだと思います。( Convert() 関数も色空間を変換する理由を調べようとしましたが、WIC によって実装されており、そのソース コードはありません。)

では、DirectXTex ライブラリにバグはありますか? それとも、DXGI_FORMAT の本当の標準ですか? いくつかの特別な DXGI_FORMAT に異なるカラー スペースがあった場合は、その仕様をどこで確認できるか教えてください。

どんな助けでも感謝します。ありがとう!

4

1 に答える 1

4

慣例により、float RGB 値は線形であり、整数 RGB 値はガンマ圧縮されます。ガンマの理由は、知覚的に必要な場合により多くのビットを使用するためであり、浮動小数点数には十分な (おそらく過剰な) ビット数があり、(指数を使用して) 既に疑似対数エンコードされているため、浮動小数点数をガンマ圧縮することに特に利点はありません。. (ソース

特に *_SRGB ではない DXGI の整数 RGB テクスチャの色空間は sRGB ではなく、ドライバーに依存し、通常は 0.5 の固定ガンマを持つことに注意してください。

DirectXTex ライブラリは正しく動作しているようです。ただし、DDS ファイルのキャプチャと表示の両方に使用するソフトウェアの動作にも依存していることに注意してください。DirectXTex だけのより良いテストは、単純にライブラリ内で float->int->float の往復変換を行い、結果を視覚的ではなく数値的に比較することです。

于 2012-11-21T11:44:53.270 に答える