Microsoft DirectX 8.0 (C++) |
アプリケーションで頂点フォグを有効にするには、次の手順を実行する。
C++ アプリケーションで頂点フォグを有効にするには
次の 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 ポインタとしてキャストし、次にそれを参照から解除している。