次の方法で共有


ガンマ コントロール (Direct3D 9)

ガンマ コントロールでは、サーフェス自身のコンテンツに影響せずにサーフェスのコンテンツが表示される方法を変更できます。これらのコントロールは極めて単純なフィルターとみなすことができます。Direct3D はサーフェスから離れ、画面上でレンダリングされる前に、これをデータに適用します。

ガンマ コントロールは、スワップ チェーンのプロパティです。ガンマ コントロールによって、サーフェスの赤、緑、および青レベルを、システムが表示する実際のレベルにマッピングする方法を動的に変更できます。ガンマ レベルを設定することで、たとえばユーザーのキャラクターが発射するときは赤、キャラクターが新しいアイテムを拾ったときには緑というようにユーザーの画面にカラーをフラッシュさせることができます。エフェクトを達成するために新しいイメージをフレーム バッファーにコピーする必要はありません。または、カラー レベルを調整して、バック バッファーでイメージにカラー バイアスを適用できます。

Direct3D 9 にはデバイスのプロパティとして 1 つのスワップ チェーンがあるため、デバイスごとにスワップ チェーン (暗黙的なスワップ チェーン) が常に 1 つ以上は存在します。ガンマ ランプはスワップ チェーンのプロパティであるため、スワップ チェーンがウィンドウ表示されている場合は、ガンマ ランプを適用できます。ガンマ ランプはすぐに適用されます。垂直同期処理の待機はありません。

IDirect3DDevice9::SetGammaRamp メソッドと IDirect3DDevice9::GetGammaRamp メソッドを使用して、表示のために DAC コンバーターに送信される前に、サーフェスからの赤、緑、青というピクセルのカラー成分に影響するランプ レベルを操作できます。

ガンマ ランプのレベル

Direct3D では、ガンマ ランプという用語は、フレーム バッファー内のピクセルすべての特定のカラー成分 (赤、緑、青) のレベルを、表示のために DAC が受信する新しいレベルにマッピングする一連の値を指します。再マッピングは、カラー成分ごとに 1 つ、合わせて 3 つのルックアップ テーブルを経由して、実行されます。

その仕組みを次に示します。Direct3D はフレーム バッファーからピクセルを取得して、その個々の赤、緑、青のカラー成分を評価します。各成分は、0 から 65535 までの値で表されます。Direct3D は元の値を取得し、これを使用して 256 要素配列 (ランプ) のインデックスを付けます。ここで、各要素は元の値と置き換えられる値を含みます。Direct3D は、このルックアップを実行して、フレーム バッファー内の各ピクセルのカラー成分ごとにプロセスを置き換えます。その結果、画面上のピクセルすべての最終的なカラーが変更されます。

ランプ値のグラフ化は、ランプ値を具体的に表すのに便利です。次の 2 つのグラフの左側のグラフは、カラーをまったく変更しないランプを示します。右のグラフは、適用先のカラー成分に負のバイアスをもたらすランプを示します。

Ramp graph

左側のグラフの配列要素はそれぞれのインデックスとまったく同じ値を含みます。つまり、インデックス 0 の要素に 0、インデックス 255 に 65535 を含みます。入力値は表示前に変更されないため、この種のランプは既定です。右のグラフは、より変化に富んでいます。そのランプは最初の要素の 0 から最後の要素の 32768 までの範囲の値を含み、その間の値は均一に広がっています。このエフェクトでは、このランプを使用するカラー成分はミュートされているように表示されます。線形グラフの使用に制限はありません。必要に応じてアプリケーションで任意のマッピングを割り当てることができます。エントリをすべてゼロに設定して、表示からカラー成分を完全に削除することもできます。

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

ガンマ ランプのレベルとは、Direct3D がフレーム バッファー カラー成分を、表示される新しいレベルにマッピングするために使用する効率的なルックアップ テーブルです。IDirect3DDevice9::SetGammaRamp メソッドと IDirect3DDevice9::GetGammaRamp メソッドを呼び出すことで、プライマリ サーフェスのランプ レベルを設定および取得できます。IDirect3DDevice9::SetGammaRamp はパラメーターを 2 つ、IDirect3DDevice9::GetGammaRampは パラメーターを 1 つ受け入れます。IDirect3DDevice9::SetGammaRamp に関しては、最初のパラメーターは、D3DSGR_CALIBRATE または D3DSGR_NO_CALIBRATION です。2 つめのパラメーター pRamp は、D3DGAMMARAMP 構造体へのポインターです。D3DGAMMARAMP 構造体は、3 つの WORD 256 要素配列を含み、各配列が赤、緑、および青のガンマ ランプを含みます。IDirect3DDevice9::GetGammaRamp は、現在のガンマ ランプが入力される D3DGAMMARAMP タイプへのポインターを取得します。

IDirect3DDevice9::SetGammaRamp の最初のパラメーターに DDSGR_CALIBRATE 値を含めると、新しいガンマ レベルの設定時にキャリブレータを呼び出すことができます。ガンマ ランプのキャリブレーションを行うと、処理上オーバーヘッドが発生するので、頻繁には使用しないでください。キャリブレートされたガンマ ランプを設定すると、ディスプレイ アダプターやモニターに関係なく、ユーザーに対する一貫した絶対的ガンマ値が提供されます。

すべてのシステムがガンマ キャリブレーションをサポートしているとは限りません。ガンマ キャリブレーションがサポートされているかどうかを確認するには、IDirect3DDevice9::GetDeviceCaps を呼び出して、メソッドが返った後で、関連付けられている D3DCAPS9 構造体の Caps2 メンバーを調べてください。D3DCAPS2_CANCALIBRATEGAMMA 機能のフラグが存在する場合は、ガンマ キャリブレーションがサポートされています。

新しいランプ レベルを設定する場合には、アプリケーションが全画面の排他モードにあるときに使用されるのは、配列で設定したレベルのみであることに注意してください。アプリケーションが通常モードに変更されるたびに、ランプ レベルが用意され、アプリケーションが全画面モードに復旧するときに再び適用されます。

デバイスがスワップ チェーンの現在のプレゼンテーション モード (全画面またはウィンドウ表示) でガンマ ランプをサポートしていない場合、エラー値は返されません。アプリケーションは、D3DCAPS2_FULLSCREENGAMMA および D3DCAPS2_CANCALIBRATEGAMMA 能力ビットを D3DCAPS9 タイプの Caps2 メンバーで確認し、デバイスの能力、およびキャリブレータがインストールされているかどうかを判別できます。