Platform SDK: DirectX

アルファテスティング ステート

[C++]

C++ アプリケーションでは、アルファ テスティングを使用して、いつピクセルをレンダリング ターゲット サーフェスに書き込むかを制御する。D3DRENDERSTATE_ALPHATESTENABLE 列挙値を使用することにより、アプリケーションでは、アルファ テスト関数に基づいて各ピクセルをテストできるように現在の Direct3D デバイスを設定する。テストが成功すると、ピクセルがサーフェスに書き込まれる。テストが失敗すると、ピクセルは無視される。アルファ テスト関数は、D3DRENDERSTATE_ALPHAFUNC 列挙値で選択する。D3DRENDERSTATE_ALPHAREF レンダリング ステートを使用することにより、アプリケーションでは、比較するすべてのピクセルに参照アルファ値を設定する。

アルファ テスティングは、通常、透明に近いオブジェクトをラスタ化する際のパフォーマンスを改善するために使用する。ラスタ化する色データが指定のピクセル (D3DPCMPCAPS_GREATEREQUAL) よりも不透明の場合、ピクセルが書き込まれる。そうでない場合は、ラスタライザはピクセルを無視し、2 色のブレンドに必要な処理を省略する。次のコードは、指定の比較関数がサポートされているかどうかを調べ、サポートされている場合は、レンダリングのパフォーマンス改善に必要な比較関数のパラメータを設定する。

// この例では、pd3dDeviceDesc は、
// 前の IDirect3DDevice7::GetCaps の呼び出しによって格納された
// D3DDEVICEDESC7 構造体であるとする。
if (pd3dDeviceDesc.dpcTriCaps.dwAlphaCmpCaps & D3DPCMPCAPS_GREATEREQUAL)
{
    dev->SetRenderState( D3DRENDERSTATE_ALPHAREF, (DWORD)0x00000001);
    dev->SetRenderState( D3DRENDERSTATE_ALPHATESTENABLE, TRUE ); 
    dev->SetRenderState( D3DRENDERSTATE_ALPHAFUNC, D3DCMP_GREATEREQUAL );
}
 
// 比較関数がサポートされていない場合にもレンダリングを実行する。
// ただし、パフォーマンスは改善されない。

すべてのハードウェアがアルファ テスティング機能をサポートしているわけではない。デバイス機能を調べるには、IDirect3DDevice7::GetCaps メソッドを呼び出す。デバイス機能を取得した後、使用する比較関数の D3DPRIMCAPS 構造体 (関連付けられた D3DDEVICEDESC7 構造体に格納されている) の dwAlphaCmpCaps メンバを調べる。dwAlphaCmpCaps メンバが D3DPCMPCAPS_ALWAYS のみ、または D3DPCMPCAPS_NEVER のみ含んでいる場合、ドライバはアルファ テストをまったくサポートしていない。

[Visual Basic]

Visual Basic で記述されたアプリケーションでは、アルファ テスティングを使用して、いつピクセルをレンダリング ターゲット サーフェスに書き込むかを制御する。D3DRENDERSTATE_ALPHATESTENABLE 列挙値を使用することにより、アプリケーションでは、アルファ テスト関数に基づいて各ピクセルをテストできるように現在の Direct3D デバイスを設定する。テストが成功すると、ピクセルがサーフェスに書き込まれる。テストが失敗すると、ピクセルは無視される。アルファ テスト関数は、D3DRENDERSTATE_ALPHAFUNC 列挙値で選択する。D3DRENDERSTATE_ALPHAREF レンダリング ステートを使用することにより、アプリケーションでは、比較するすべてのピクセルに参照アルファ値を設定する。

アルファ テスティングは、通常、透明に近いオブジェクトをラスタ化する際のパフォーマンスを改善するために使用する。ラスタ化する色データが指定のピクセル (D3DPCMPCAPS_GREATEREQUAL) よりも不透明に近い場合、ピクセルが書き込まれる。そうでない場合は、ラスタライザはピクセルを無視し、2 色のブレンドに必要な処理を省略する。次のコードは、指定の比較関数がサポートされているかどうかを調べ、サポートされている場合は、レンダリングのパフォーマンス改善に必要な比較関数のパラメータを設定する。

' この例では、d3dDeviceDesc は、
' Direct3DDevice7::GetCaps の呼び出しによって格納された
' D3DDEVICEDESC7 型であるとする。
If (d3dDeviceDesc.dpcTriCaps.lAlphaCmpCaps And D3DPCMPCAPS_GREATEREQUAL) Then
        Call dev.SetRenderState(D3DRENDERSTATE_ALPHAREF, &H1)
        Call dev.SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE, True)
        Call dev.SetRenderState(D3DRENDERSTATE_ALPHAFUNC, D3DCMP_GREATEREQUAL)
End If
 
' 比較関数がサポートされていない場合にもレンダリングを実行する。
' ただし、パフォーマンスは改善されない。

すべてのハードウェアがアルファ テスティング機能をサポートしているわけではない。デバイス機能を調べるには、Direct3DDevice7.GetCaps メソッドを呼び出す。デバイスの機能を検索した後、使用する比較関数の D3DPRIMCAPS 型 (関連付けられた D3DDEVICEDESC7 型に格納されている) の lAlphaCmpCaps メンバを調べる。lAlphaCmpCaps メンバが D3DPCMPCAPS_ALWAYS のみ、または D3DPCMPCAPS_NEVER のみ含んでいる場合、ドライバはアルファ テストをまったくサポートしていない。