Platform SDK: DirectX

頂点フォグの使用

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

[C++]

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

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

次に、以上の手順を C++ コードで示す。

// 簡単にするために、この例では、呼び出しの後で
// エラー値をチェックしない。実際のアプリケーションでは、
// エラー値を正しくチェックすること。
//
// この例では、g_lpDevice は IDirect3DDevice7 インターフェイスへの
// 有効なポインタである。
void SetupVertexFog(DWORD dwColor, DWORD dwMode, BOOL fUseRange, FLOAT fDensity)
{
    float fStart = 0.5f,    // 線形フォグ距離。
          fEnd   = 0.8f;
 
    // フォグ ブレンディングを有効にする。
    g_lpDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, TRUE);
 
    // フォグ カラーを設定する。
    g_lpDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR, dwColor);
    
    // フォグ パラメータを設定する。
    if(D3DFOG_LINEAR == dwMode)
    {
        g_lpDevice->SetRenderState(D3DRENDERSTATE_FOGVERTEXMODE, dwMode);
        g_lpDevice->SetRenderState(D3DRENDERSTATE_FOGSTART, *(DWORD *)(&fStart));
        g_lpDevice->SetRenderState(D3DRENDERSTATE_FOGEND,   *(DWORD *)(&fEnd));
    }
    else
    {
        g_lpDevice->SetRenderState(D3DRENDERSTATE_FOGVERTEXMODE, dwMode);
        g_lpDevice->SetRenderState(D3DRENDERSTATE_FOGDENSITY, *(DWORD *)(&fDensity));
    }

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

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

[Visual Basic]

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

  1. D3DRENDERSTATE_FOGENABLE を True に設定して、フォグ ブレンディングを有効にする。
  2. 希望のフォグ カラーを D3DRENDERSTATE_FOGCOLOR レンダリング ステートに設定する。
  3. D3DRENDERSTATE_FOGVERTEXMODE レンダリング ステートを CONST_D3DFOGMODE 列挙のメンバに設定して、希望のフォグ公式を選択する。
  4. 選択したフォグ公式で必要なフォグ パラメータをレンダリング ステートに設定する。

次に、以上の手順を Visual Basic コードで示す。

' 簡単にするために、この例では、呼び出しの後で
' エラー値をチェックしない。実際のアプリケーションでは、
' エラー値を正しくチェックすること。
'
' この例では、g_d3dDevice は Direct3DDevice7 オブジェクトへの
' 有効な参照を示す。
Sub SetupVertexFog(lColor As Long, Mode As CONST_D3DFOGMODE, _
bUseRange As Boolean, Optional Density As Single)

Dim StartFog As Single, _
EndFog As Single
    
' 線形フォグの距離を設定する。
StartFog = 0.5:EndFog = 0.8
 
' フォグ ブレンディングを有効にする。
Call g_d3dDevice.SetRenderState(D3DRENDERSTATE_FOGENABLE, True)
 
' フォグ カラーを設定する。
Call g_d3dDevice.SetRenderState(D3DRENDERSTATE_FOGCOLOR, lColor)
    
' フォグ パラメータを設定する。
If Mode = D3DFOG_LINEAR Then
Call g_d3dDevice.SetRenderState(D3DRENDERSTATE_FOGVERTEXMODE, Mode)
Call g_d3dDevice.SetRenderStateSingle(D3DRENDERSTATE_FOGSTART, StartFog)
Call g_d3dDevice.SetRenderStateSingle(D3DRENDERSTATE_FOGEND, EndFog)
Else
Call g_d3dDevice.SetRenderState(D3DRENDERSTATE_FOGVERTEXMODE, Mode)
Call g_d3dDevice.SetRenderStateSingle(D3DRENDERSTATE_FOGDENSITY, Density)
End If

' 必要に応じて、範囲ベースのフォグを有効にする (頂点フォグでのみサポートされる)。
' この例では、ドライバが D3DPRASTERCAPS_FOGRANGE 能力を公開する場合にのみ、
' bUseRange は True に設定されるとする。
    '
' 注 :  この方が、範囲に基づかないフォグよりも
'       若干パフォーマンスがよい。
If bUseRange = True Then
Call g_d3dDevice.SetRenderState( _
D3DRENDERSTATE_RANGEFOGENABLE, True)
End If
End Sub