Platform SDK: DirectX |
アプリケーションで頂点フォグを有効にするには、次の手順に従う。
C++ アプリケーションで頂点フォグを有効にするには
次に、以上の手順を 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 コードで示す。
' 簡単にするために、この例では、呼び出しの後で ' エラー値をチェックしない。実際のアプリケーションでは、 ' エラー値を正しくチェックすること。 ' ' この例では、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