在Direct3D 中,霧化是通過將景物顏色與霧的顏色,以隨物體到觀察點距離增加而衰減的混合因子混合而實現的。
兩種霧化方法:頂點霧化和像素霧化。
三種霧化公式:線性霧化,指數霧化,指數平方霧化。
兩種霧化處理:基於深度的霧化處理和基於範圍的霧化處理。基於深度是指兩個點之間的深度(Z)差值,基於範圍則是兩點間的直線距離。Direct3D預設的是基於深度的霧化。可設定基於範圍的霧化,但要先檢測裝置是否支援:
g_pd3dDevice->GetDeviceCaps(&staps);
if ( stCaps.RasterCaps & D3DPASTERCAPS_FOGRANGE )
return TRUE;
Direct3D預設禁用霧化效果,可以啟用霧化:g_pd3dDevice->SetRendState( D3DRS_FOGENABLE, true );
設定霧的顏色 g_pd3dDevice->SetRendState( D3DRS_FOGCOLOR, 0xffffffff); //白色
根據按鍵訊息進行多種霧化效果的切換
if (gInputSystem->KeyDown(DIK_V))
{
//禁用霧化
g_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,FALSE );
}
if (gInputSystem->KeyDown(DIK_M))
{
g_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE );
//設定霧化混合因子計算公式 : 指數霧化
g_pd3dDevice->GetDevice()->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_EXP);
//設定霧的濃度
static float fogDensity = 0.005f;
g_pd3dDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD*)&fogDensity);
}
if (gInputSystem->KeyDown(DIK_N))
{
g_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE );
//啟用基於範圍的霧化
g_pd3dDevice->SetRenderState( D3DRS_RANGEFOGENABLE,TRUE );
//設定霧化混合因子計算公式 : 線性霧化
g_pd3dDevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);
//設定線性霧化開始位置和結束位置
static float fogStart = 20;
static float fogEnd = 200;
g_pd3dDevice->SetRenderState(D3DRS_FOGSTART,*(DWORD*)&fogStart);
g_pd3dDevice->SetRenderState(D3DRS_FOGEND,*(DWORD*)&fogEnd);
}
if (gInputSystem->KeyDown(DIK_B))
{
g_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE );
//設定霧化混合因子計算公式 : 指數平方霧化
g_pd3dDevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_EXP2);
//設定霧的濃度
static float fogDensity = 0.01f;
g_pd3dDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD*)&fogDensity);
}
其中設定霧化混合因子計算公式時,SetRenderState的第一個參數可以是:
D3DRS_FOGTABLEMODE(像素霧化) 或 D3DRS_FOGVERTEXMODE(頂點霧化)