ガンマ コントロール (Direct3D 9)
ガンマ コントロールを使用すると、サーフェス自体の内容に影響を与えずに、サーフェスの内容をシステムで表示する方法を変更できます。 これらのコントロールは、Direct3D がサーフェスを離れる前や画面にレンダリングされる前にデータに適用される非常に単純なフィルターと考えてください。
ガンマ コントロールはスワップ チェーンのプロパティです。 ガンマ コントロールを使用すると、サーフェスの赤、緑、青のレベルをシステムが表示する実際のレベルにマップする方法を動的に変更できます。 ガンマ レベルを設定すると、効果を得るために新しい画像をフレーム バッファーにコピーすることなく、ユーザーのキャラクターが撮影されたときに赤、キャラクターが新しい項目を取得したときに緑などの色がユーザーの画面で点滅する可能性があります。 または、カラー レベルを調整して、バック バッファー内の画像にカラー バイアスを適用することもできます。
Direct3D 9 にはデバイスのプロパティとして 1 つのスワップ チェーンがあるため、デバイスごとに少なくとも 1 つのスワップ チェーン (暗黙的なスワップ チェーン) が常に存在します。 ガンマ ランプはスワップ チェーンのプロパティであるため、スワップ チェーンをウィンドウ化するときにガンマ ランプを適用できます。 ガンマ ランプはすぐに有効になります。 垂直同期操作を待つ必要はありません。
SetGammaRamp メソッドと GetGammaRampメソッドを使用すると、ディスプレイ用のデジタルアナログ コンバーター (DAC) に送信される前に、ピクセルの赤、緑、青の色のコンポーネントに影響を与えるランプ レベルを操作できます。
ガンマ ランプ レベル
Direct3D では、ガンマ ランプという用語は、フレーム バッファー内のすべてのピクセルの特定の色コンポーネント (赤、緑、青) のレベルを、DAC が表示用に受信する新しいレベルにマップする値のセットを表します。 再マッピングは、カラー コンポーネントごとに 1 つずつ、3 つの参照テーブルを使用して実行されます。
そのしくみを次に示します。Direct3D はフレーム バッファーからピクセルを取得し、その個々の赤、緑、青の色コンポーネントを評価します。 各コンポーネントは、0 から 65535 までの値で表されます。 Direct3D は元の値を受け取り、それを使用して 256 要素配列 (ランプ) のインデックスを作成します。各要素には元の要素を置き換える値が含まれています。 Direct3D は、フレーム バッファー内の各ピクセルの各色コンポーネントに対してこの検索と置換のプロセスを実行し、すべての画面上のピクセルの最終的な色を変更します。
次の 2 つのグラフに示すように、ランプ値をグラフ化して視覚化すると便利です。 左側のグラフには、色をまったく変更しないランプが表示されます。 右側のグラフは、適用先の色成分に負のバイアスを課すランプを示しています。
ガンマ ランプ値のグラフを
左側のグラフの配列要素には、インデックスと同じ値が含まれています。インデックス 0 の要素では 0、インデックス 255 では 65535 です。 この種類のランプは、入力値が表示される前に変更されないため、既定値です。 右のグラフは、より多くのバリエーションを提供します。そのランプには、最初の要素の 0 から最後の要素の 32768 までの範囲の値が含まれています。値の範囲は一様です。 このランプを使用するカラー コンポーネントがディスプレイにミュート状態で表示されます。 線形グラフの使用に限定されません。必要に応じて、アプリケーションで任意のマッピングを割り当てることができる場合は >。 エントリをすべてのゼロに設定して、カラー コンポーネントをディスプレイから完全に削除することもできます。
ガンマ ランプ レベルの設定と取得
ガンマ ランプ レベルは、Direct3D がフレーム バッファーのカラー コンポーネントを表示される新しいレベルにマップするために使用するテーブルを効果的に検索します。 SetGammaRamp を呼び出し、GetGammaRampメソッドをすることで、プライマリ サーフェスのランプ レベルを設定および取得できます。 SetGammaRamp は 2 つのパラメーターを受け取り、GetGammaRamp は 1 つのパラメーターを受け取。 SetGammaRamp の場合、最初のパラメーターは D3DSGR_CALIBRATE または D3DSGR_NO_CALIBRATION です。 2 番目のパラメーター pRamp は、D3DGAMMARAMP 構造体へのポインターです。 D3DGAMMARAMP 構造体には、WORD の 256 要素配列が 3 つ含まれており、それぞれ 1 つの配列に赤、緑、青のガンマ ランプが含まれています。 GetGammaRamp には、現在のガンマ ランプで塗りつぶされる D3DGAMMARAMP 型へのポインターを受け取る 1 つのパラメーターがあります。
SetGammaRampの最初のパラメーターのD3DSGR_CALIBRATE値含めて、新しいガンマ レベルを設定するときにキャリブレーターを呼び出すことができます。 ガンマ ランプを調整すると、処理オーバーヘッドが発生し、頻繁に使用しないでください。 校正済みのガンマ ランプを設定すると、ディスプレイ アダプターとモニターに関係なく、一貫性のある絶対ガンマ値がユーザーに提供されます。
すべてのシステムでガンマキャリブレーションがサポートされているわけではありません。 ガンマ調整がサポートされているかどうかを確認するには、GetDeviceCaps呼び出し、メソッドが戻った後、関連付けられている D3DCAPS9 構造体の Caps2 メンバーを調べます。 D3DCAPS2_CANCALIBRATEGAMMA機能フラグが存在する場合は、ガンマ調整がサポートされます。
新しいランプ レベルを設定する場合、配列で設定したレベルは、アプリケーションが全画面表示の排他モードの場合にのみ使用されることに注意してください。 アプリケーションが通常モードに変わるたびにランプ レベルが確保され、アプリケーションが全画面表示モードを復帰したときに再度有効になります。
デバイスがスワップ チェーンの現在のプレゼンテーション モード (全画面表示またはウィンドウ表示) でガンマ ランプをサポートしていない場合、エラー値は返されません。 アプリケーションは、D3DCAPS9タイプの Caps2 メンバーのD3DCAPS2_FULLSCREENGAMMAおよびD3DCAPS2_CANCALIBRATEGAMMA機能ビットを調べて、デバイスの機能とキャリブレーターがインストールされているかどうかを判断できます。
関連トピック
-
Direct3D サーフェス の