Using Vertex Fog

Use the following steps to enable vertex fog in your application:

To enable vertex fog

  1. Enable fog blending by setting D3DRENDERSTATE_FOGENABLE to TRUE.
  2. Set the fog color in the D3DRENDERSTATE_FOGCOLOR render state.
  3. Choose the desired fog formula by setting the D3DLIGHTSTATE_FOGMODE lighting state to a member of the D3DFOGMODE enumerated type. (Currently, only D3DFOG_LINEAR is supported for vertex fog.)
  4. Set the fog parameters as desired for the selected fog formula in the associated lighting states. Do not use the fog parameter related render states—those are used only for pixel fog.

The following example shows what these steps might look like in code:

// For brevity, error values in this example are not checked 
// after each call. A real-world application should check 
// these values appropriately.
//
// For the purposes of this example, g_lpDevice is a valid
// pointer to an IDirect3DDevice3 interface.
void SetupVertexFog(DWORD dwColor, BOOL fUseRange)
{
    float fStart = 0.5f,    // linear fog distances
          fEnd   = 0.8f;
 
    // Enable fog blending.
    g_lpDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, TRUE);
 
    // Set the fog color.
    g_lpDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR, dwColor);
    
    // Set fog parameters.
    //
    // REMEMBER: Vertex fog formula parameters are connected
    // to the lighting states, not render states.
    g_lpDevice->SetLightState(D3DLIGHTSTATE_FOGMODE, D3DFOG_LINEAR);
    g_lpDevice->SetLightState(D3DLIGHTSTATE_FOGSTART, *(DWORD *)(&fStart));
    g_lpDevice->SetLightState(D3DLIGHTSTATE_FOGEND,   *(DWORD *)(&fEnd));
 
    // Enable range-based fog if desired (only supported for vertex fog).
    // For this example, it is assumed that fUseRange is set to non-zero 
    // only if the driver exposes the D3DPRASTERCAPS_FOGRANGE capability.
    // 
    // Note: this is slightly more performance intensive
    //       than non-range-based fog.
    if(fUseRange)
        g_lpDevice->SetRenderState(
                       D3DRENDERSTATE_RANGEFOGENABLE,
                       TRUE);
}
 

Note  Some fog parameters are required as floating-point values, even though the IDirect3DDevice3::SetRenderState and IDirect3DDevice3::SetLightState methods only accept DWORD values in the second parameter. The preceding example successfully provides the floating-point values to these methods without data translation by casting the addresses of the floating-point variables as DWORD pointers, then dereferencing them.