霧化效果

首先來看看我們可以設置哪些參數
1、D3DFOGSTART、D3DFOGEND表示霧的起始和結束距離
2、D3DFOGDENSITY 霧的濃度
3、D3DFOGCOLOR 霧的顏色
4、D3DFOGTABLEMODE、D3DFOGVERTEXMODE 霧的模式,第一個為像素霧化,第二個為頂點霧化
首先看看霧化的方程
Color = f * Color(scene) + (1-f) * color(fog)
Color(scene):背景色
Color(fog): 霧色
f:霧化參數,隨觀察點的距離的增大而減小,從而可知最后得到的顏色,當觀察點越遠時,霧色占的比例越大。
霧有四種方式
D3DFOG_NONE 禁用霧化效果
D3DFOG_EXP 霧化效果隨指數增加 f = 1/(e^density)
D3DFOG_EXP2 同上,不過公式變為 f = 1/(e^(density^2))
D3DFOG_LINEAR 線性霧 f = (end-d)/(end-start) d 為當前計算點與觀察點距離
現在我們來看如何實現霧化
首先開啟霧化效果
Device->SetRenderState(D3DRS_FOGENABLE,true);
然后我們要設置霧化的模式和公式
Device->SetRenderState(DEDRS_FOGTABLEMODE,D3DFOG_LINEAR);
這里我將其設置成了像素霧和線性,同樣可以將其換成上面介紹的其它模式和公式
接下來我們就要設置霧化參數了
Device->SetRenderState(D3DRS_FOGCOLOR,oxffffffff);//設置成白色
設置start end
float start= 50,end = 400;
Device->SetRenderState(D3DRS_FOGSTART,*(DWORD*)&start);
Device->SetRenderState(D3DRS_FOGEND,*(DWORD*)&end);
設置濃度
float density = 0.001f;//0.0 -- 1.0
Device->SetRenderState(D3DRS_FOGDENSITY,*(DWORD*)&density);
這樣,我們的設置就完了,只要將霧化設置放入我們渲染場景中,就可以看到霧化效果了.
但應該注意以下幾點
-----------------------------------------line
A B C
\ | /
\ /
\ | /
\ /
\ d /
\ /
\ | /
\ /
P
------------------------------------------
霧化效果是以剛剛上面講的 d 作為計算標準,所以,我們從P點看到A ,B ,C三點的霧化效果是一樣的,而按常理,A ,C的霧應該更濃才對.
很顯然,這讓我們想到,D3D會有對應的處理辦法.
D3D提供了基于發散的霧化效果,霧化隨觀察點的距離增大而增大,就像點光源,不過,這要求我們的硬件支持,所以在設置前應該檢查
D3DCAPS9 caps;
Device->GetDeviceCaps(&caps);
if(caps.RasterCaps&D3DPRASTERCAPS_FOGRANGE)
Device->SetRenderState(D3DRS_RANGEFOGENABLE,true);
把這個增加到霧化設置中即可~~~
已經12點了,估計人有點暈,也講不明白些什么東西了,到此為止