次の方法で共有


ガンマ コントロール

ガンマ コントロール

ガンマ コントロールは、サーフェイス自体のコンテンツに影響を与えることなく、システムがサーフェイスのコンテンツを表示する方法を変更できる。これらの制御は、Microsoft® Direct3D® が、データをサーフェイスに残すときとスクリーン上でレンダリングされる前に、データに適用する非常に単純なフィルタと考えられる。

ガンマ コントロールは、スワップ チェーンのプロパティである。ガンマ コントロールは、システムが表示する実際のレベルにサーフェイスの赤・緑・青のレベル マップを動的に変更できる。ガンマ レベルを設定することで、エフェクトを付けるフレーム バッファに新しいイメージをコピーせずに、ユーザーのスクリーンにフラッシュ カラー (ユーザーのキャラクタを出すときの赤、キャラクタが新しいアイテムを取得するときの緑など) を適用できる。または、カラー レベルを調節して、バック バッファのイメージにカラー バイアスを適用できる。

Microsoft DirectX® 9.0 の Direct3D はデバイスのプロパティとして 1 つのスワップ チェーンを持っているため、各デバイスに対して、常に少なくとも 1 つのスワップ チェーン (非明示的なスワップ チェーン) が存在する。ガンマ ランプはスワップ チェーンのプロパティなので、スワップ チェーンをウィンドウにするときはガンマ ランプを適用できる。ガンマ ランプは直ちに有効になる。VSYNC 処理の待機はできない。

IDirect3DDevice9::SetGammaRamp メソッドと IDirect3DDevice9::GetGammaRamp メソッドでは、ディスプレイに対するデジタル アナログ コンバータ (DAC) にピクセルが送られる前に、サーフェイスからピクセルの赤、緑、および青の色成分に影響を与えるランプ レベルを操作できる。

ガンマ ランプ レベル

Direct3D では、ガンマ ランプという用語は一連の値のことを表す。この一連の値は、フレーム バッファのすべてのピクセルに対して、ディスプレイに対するデジタル アナログ コンバータ (DAC) が受け取る新しいレベルに、特定の色成分 (赤・緑・青) のレベルをマッピングする値である。再マッピングは、3 つの参照テーブル (個々の色成分に対して 1 つ) により実行される。

ここではその方法について説明する。Direct3D はフレーム バッファからピクセルを取得し、その固有の赤・緑・青の色成分でピクセルを取得する。各成分は 0 ~ 65535 の値で表される。Direct3D は元の値を取得し、その値を使って 256 要素の配列 (ランプ) にインデックスを付ける。この配列の各要素には、元の値と置き換える値が含まれている。Direct3D は、フレーム バッファ内の各ピクセルの各色成分に対してこの参照と置き換えの処理を行い、スクリーン上のすべてのピクセルに対する最終的な色を変更する。

ランプ値のグラフを作成すると、視覚化されて容易に理解できる。次に、2 つのグラフを示す。左側のグラフは色がまったく変更されないランプを示している。右側のグラフは負のバイアスを適用する色成分に置くランプを示している。

ランプのグラフ

左側のグラフの配列要素には、それらのインデックスと等しい値 (インデックス 0 には要素 0、インデックス 255 には 65535) が含まれる。これらの値が表示される前の入力値は変更できないため、このタイプのランプがデフォルトとなる。右側のグラフは、より大きな変動を示す。このランプには、最初の要素 0 から最後の要素 32768 までの値が入り、中間の部分の値は、その範囲で一様に増加する。この結果、このランプを使う色成分のディスプレイ上の表示が弱められる。線形グラフの利用だけに限らない。つまり、必要に応じて、アプリケーションで任意のマッピングを割り当てることができる。さらに、入力をすべてゼロに設定すると、ディスプレイから色成分を削除できる。

ガンマ ランプ レベルの設定と取得

ガンマ ランプ レベルは、フレーム バッファの色成分を表示される新しいレベルにマップするために Direct3D が使う、効果的な参照テーブルである。IDirect3DDevice9::SetGammaRamp メソッドおよび IDirect3DDevice9::GetGammaRamp メソッドを呼び出すことにより、プライマリ サーフェイスに対するランプ レベルを設定し、取得できる。IDirect3DDevice9::SetGammaRamp は 2 つの引数を受け取り、IDirect3DDevice9::GetGammaRamp は 1 つの引数を受け取る。IDirect3DDevice9::SetGammaRamp の第 1 引数は、D3DSGR_CALIBRATE か D3DSGR_NO_CALIBRATION のいずれかである。第 2 引数 pRamp は、D3DGAMMARAMP 構造体へのポインタである。D3DGAMMARAMP 構造体は、WORD の 256 要素の配列を 3 つ (赤・緑・青のガンマ ランプをそれぞれ含む配列を 1 つずつ) 含む。IDirect3DDevice9::GetGammaRamp は、現在のガンマ ランプを格納する D3DGAMMARAMP 型へのポインタを取る。

IDirect3DDevice9::SetGammaRamp の第 1 引数に DDSGR_CALIBRATE 値を含めると、新しいガンマ レベルを設定するときにキャリブレータを起動できる。ガンマ ランプを補正すると負荷が大きくなるので、頻繁には使えない。補正されたガンマ ランプの設定は、ディスプレイ アダプタおよびモニタにかかわらず、一貫性のある完全なガンマ値を提供する。

すべてのシステムがガンマ補正をサポートするわけではない。ガンマ補正をサポートするかどうかを調べるには、IDirect3DDevice9::GetDeviceCaps を呼び出して、メソッドが戻った後に関連付けられた D3DCAPS9 構造体の Caps2 メンバを調べる。D3DCAPS2_CANCALIBRATEGAMMA 能力フラグが存在すると、ガンマ キャリブレーションはサポートされている。

新しいランプ レベルを設定する場合、その配列に設定したレベルはアプリケーションがフルスクリーン (排他モード) の場合にだけ使われる。アプリケーションがノーマル モードに変更されると、ランプ レベルは無視され、アプリケーションがフルスクリーン モードに復帰するときに再び有効になる。

デバイスがスワップ チェーンの現在のプレゼンテーション モード (フルスクリーンまたはウィンドウ) においてガンマ ランプをサポートしていない場合でも、エラー値が返ることはない。アプリケーションでは、D3DCAPS9 型の Caps2 メンバの D3DCAPS2_FULLSCREENGAMMA 能力ビットおよび D3DCAPS2_CANCALIBRATEGAMMA 能力ビットを調べて、デバイスの能力およびキャリブレータがインストールされているかどうかをチェックできる。