Microsoft DirectX 8.0 (C++)

頂点フォグの使い方

アプリケーションで頂点フォグを有効にするには、次の手順を実行する。

C++ アプリケーションで頂点フォグを有効にするには

  1. D3DRS_FOGENABLE を TRUE に設定して、フォグ ブレンディングを有効にする。
  2. D3DRS_FOGCOLOR レンダリング ステートで、必要なフォグ カラーを設定する。
  3. D3DRS_FOGVERTEXMODE レンダリング ステートを D3DFOGMODE 列挙型のメンバに設定して、目的のフォグ公式を選択する。
  4. 選択したフォグ公式で必要なフォグ パラメータをレンダリング ステートに設定する。

次の C++ サンプル コードは、これらの手順を示している。

// 簡単にするために、この例では、呼び出しの後で
// エラー値をチェックしない。実際のアプリケーションでは、
// エラー値を正しくチェックすること。
//
// この例では、g_pDevice は IDirect3DDevice8 インターフェイスへの
// 有効なポインタであると仮定している。
void SetupVertexFog(DWORD Color, DWORD Mode, BOOL UseRange, FLOAT Density)
{
    float Start = 0.5f,    // 線形フォグ距離。
          End   = 0.8f;
 
    // フォグ ブレンディングを有効にする。
    g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
 
    // フォグ カラーを設定する。
    g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color);
    
    // フォグ パラメータを設定する。
    if(D3DFOG_LINEAR == Mode)
    {
        g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
        g_pDevice->SetRenderState(D3DRS_FOGEND,   *(DWORD *)(&End));
    }
    else
    {
        g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
    }

    // 必要に応じて、範囲ベースのフォグを有効にする 
    // (頂点フォグでのみサポートされる)。この例では、ドライバが D3DPRASTERCAPS_FOGRANGE 能力を公開する場合にのみ、
    // UseRange は
    // ゼロ以外の値に設定されるとする。
    // 注  この方が、範囲に基づかないフォグよりも
    //       若干パフォーマンスがよい。
    if(UseRange)
        g_pDevice->SetRenderState(
                       D3DRS_RANGEFOGENABLE,
                       TRUE);
}

IDirect3DDevice8::SetRenderState メソッドは、第 2 パラメータに DWORD 値だけを受け取るが、浮動小数点のフォグ パラメータが要求されることもある。この例では、浮動小数点の値をデータの平行移動なしでメソッドに渡すために、浮動小数点変数のアドレスを DWORD ポインタとしてキャストし、次にそれを参照から解除している。