2

アップデート:

皆様、ご回答誠にありがとうございました。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 でした)。他にどのようなフラグ/レンダリング ステートを確認する必要がありますか?

ご助力ありがとうございます!

4

2 に答える 2

3

1 つの可能性は、線形からガンマへの変換を 2 回適用していることです。D3DRS_SRGBWRITEENABLE でレンダー ターゲットに書き込むときに 1 回。次に、D3DPRESENT_LINEAR_CONTENT を使用してフレーム バッファーを提示するとき (そのフラグを指定した場合)。D3DRS_SRGBWRITEENABLE で既に RGB 空間に変換されているため、D3DPRESENT_LINEAR_CONTENT は必要ありません。

もう 1 つの可能性は、ピクセル シェーダーの線形空間に変換する前に、グラフィック ハードウェアがテクスチャをフィルタリングしている可能性があります。これをテストするには、D3DSAMP_SRGBTEXTURE とフィルタリングを無効にしてから、線形空間への変換とピクセル シェーダーでのフィルタリングを行います。または、フィルタリングが問題にならないようにテクスチャを十分に大きく描画します。GeForce 8 以降のカードがフィルタリング前に線形空間に正しく変換されることにも言及しているガンマ補正に関する優れた記事は、次の場所にあります。

直線的であることの重要性

D3DPRESENT_LINEAR_CONTENT を使用していない場合、次の推測では、使用しているガンマ変換がグラフィック カードでサポートされていない可能性があります。プログラムまたは DirectX Caps Viewer Tool などのツールを使用して、デバイスの機能を確認します。

DirectX Caps Viewer ツール

于 2011-07-01T00:08:57.073 に答える
2

これは質問に関連していますが、正確ではありませんが、知っておく価値があります。

Vista/Win7のD3D9ランタイムにバグがあります。このランタイムは、D3D10の上に記述された種類のエミュレーションレイヤーです。D3D10では、SRGB状態はテクスチャ形式のプロパティであり、D3D9では、サンプラーベースのレンダリング状態です。D3D9テクスチャを設定する場合、テクスチャの形式が使用されている可能性があり、D3D9にはSRGBテクスチャ形式がないため、SRGB状態は常に「オフ」に設定されます。これは、正しく表示するには、テクスチャがバインドされた後にD3DSAMP_SRGBTEXTURE状態を設定する必要があることを意味します。

于 2011-07-06T08:21:54.090 に答える