アップデート:
皆様、ご回答誠にありがとうございました。Jesse Hall が示唆したように、ドライバー (またはハードウェア) の問題のようです。他の構成で同じアプリを試したところ、期待どおりに機能しました。
同じ GPU (ATI 4800 HD) を共有しているがドライバーのバージョンが異なる他のコンピューターでアプリをテストしたところ、それらはすべて同じ誤った動作を示しました (書き込み時の二重ガンマ補正のようです)。これらのコンピューターでは、D3DRS_SRGBWRITEENABLE を false に設定して表示を修正する必要がある場合。これがこのハードウェアの既知のバグかどうかは誰にもわかりませんか?
さらに奇妙なのは、これら 2 つの構成で同じ最終結果が得られることです。
- D3DRS_SRGBWRITEENABLE = FALSE および D3DSAMP_SRGBTEXTURE を TRUE に設定
- D3DRS_SRGBWRITEENABLE = FALSE および D3DSAMP_SRGBTEXTURE を FALSE に設定
ピクセル デバッガーでは、ケース 1 で線形化が適切に適用されていることがわかりますが、(自動) 書き込み時の修正により、ケース 2 と同じ出力が得られます (変換はまったく実行されません)...
// -- 更新の終わり
DirectX9 アプリケーションのガンマ補正を修正するのに問題があります。
サンプラー (D3DSAMP_SRGBTEXTURE) でテクスチャの線形化を有効にし、出力用の sRGB 書き込み (D3DRS_SRGBWRITEENABLE) を有効にすると、ガンマ補正が 2 回適用されているように見えます。
これが私のセットアップです。次のテクスチャ (ここから) を使用して、フルスクリーンのクワッドを描画しました。
結果は、写真の右側で視覚的に明るすぎました。PIX を使用してこれらの灰色のピクセルの 1 つをデバッグしました。すべてが適切に設定されていれば、出力値は 0.73 (=0.5^(1.0/2.2)) になると予想していました。残念ながら、ピクセル シェーダーの出力は 0.871 でした (ガンマ補正が 2 回適用されたように見えますか?)。デバッガーを使用してピクセル シェーダーに足を踏み入れたところ、テクスチャ フェッチで (0.491, 0.491, 0.491) の値が返されました。これは、読み取り時の線形化が正しく機能していることを意味します。
D3DRS_SRGBWRITEENABLE を無効にすると、ピクセル シェーダーの出力は 0.729 になり、より正確に見えます。
この変換はどこから来たのですか (デバッガーでは、ピクセル シェーダーの出力は 0.491 でした)。他にどのようなフラグ/レンダリング ステートを確認する必要がありますか?
ご助力ありがとうございます!