在Direct93D中Fog效果 (轉)
在Direct93D中Fog效果
在3D場景中增加FOG效果有利於增加場景的真實感,環境的氛圍,表現作者的心緒狀態,以及模糊的藝術感。 9支援兩種Fog效果:Pixel fog與Vertex fog,他們都有自己的特點與介面。
從本質上說,霧效果的產生是在渲染場景的過程中混合了場景中物體的顏色以及中提供的fog的顏色而成的,fog顏色在渲染過程中所佔的比例是與它在場景中的深度或者說距離視點的距離成正比的,也就是說離視點越遠(在場景中的深度越大)那麼fog的顏色在渲染過程中它所佔的比例也就越大。這樣就造成了現實中霧的效果的產生。
Direct3D提供兩種方式在一個場景中增加霧的效果:pixel fog 和 vertex fog。Pixel fog(也被稱為table fog)是在裝置程式中完成的,而vertex fog在Direct3D的光線處理中完成的。
以上闡述了fog產生的大概原理,接下來我們描述一下pixel fog與vertex fog的程式設計實現:
:namespace prefix = o ns = "urn:schemas-microsoft-com::office" />
一、 使用Pixel Fog
按照下面的步驟可以在程式中增加fog效果:
1、 透過設定D3DRS_FOGENABLE渲染狀態為TRUE來啟動fog效果。
IDirect3Ddevice9::SetRenderState(D3DRS_FOGENABLE,TRUE);
2、 透過設定D3DRS_FOGCOLOR渲染狀態為一整數值來設定我們希望的fog顏色
IDirect3Ddevice9::SetRenderState(D3DRS_FOGCOLOR,lFogColor);
3、 設定D3DRS_FOGTABLEMODE渲染狀態為D3DFOGMODE的列舉值之一來選擇
fog的規則。
IDirect3Ddevice9::tRenderState(D3DRS_FOGTABLEMODE,iMode);
IMode的值為如下之一:
D3DFOG_LINEAR、D3DFOG_NONE、D3DFOG_EXP、D3DFOG_EXP2
4、 根據第三步中選擇的fog的方式的不同而設定fog的相應的引數值,這些引數值包括fog的起始與結束點,fog的濃度等資訊。
如果iMode為D3DFOG_LINEAR則設定fog的起始與終止點:
IDirect3Ddevice9::tRenderState(D3DRS_FOGSTART,nStartPos);
IDirect3Ddevice9::tRenderState(D3DRS_FOGEND,nEndPos);
否則則設定fog的濃度:
IDirect3Ddevice9::tRenderState(D3DRS_FOGDENSITY,nDensity);
下面的例子顯示了這些步驟:
// 為了簡短,所有的錯誤程式碼略去
// 對於這個例子, g_pDevice 是一個可用的指向IDirect3DDevice9介面的指標。
void SetupPixelFog(D Color, DWORD Mode)
{
float Start = 0.5f; // For linear mode
float End = 0.8f;
float Density = 0.66f; // For exponential modes
// Enable fog blending.
g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
// Set the fog color.
g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color);
// Set fog parameters.
if( Mode == D3DFOG_LINEAR )
{
g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
g_pDevice->SetRenderState(D3DRS_FOGEND, *(DWORD *)(&End));
}
else
{
g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
}
}
二、 使用Vertex fog
Vertex fog的使用幾乎與Pixel Fog的使用完全相同,除了將第3步的D3DRS_FOGTABLEMODE變為D3DRS_FOGVERTEXMODE外,其它的完全相同。
IDirect3Ddevice9::tRenderState(D3DRS_FOGVERTEXMODE,iMode);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998826/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在VB中實現窗體的動態效果 (轉)
- div在網頁中垂直居中效果網頁
- [譯] 在 Flutter 中實現微光閃爍效果Flutter
- 在鴻蒙中實現類似瀑布流效果鴻蒙
- 教你在“狼人殺”中實現變聲效果
- 在程式碼中實現android:tint效果Android
- 在.NET中操作XmlDocument (轉)XML
- AR技術在藝術展館中的使用效果
- 在 retina 屏中實現 1px border 效果
- 美國的軟體公司是什麼樣?---- 以Fog Creek為例
- 在SSM框架中,multfile轉fileSSM框架
- 在DELPHI中圖片轉換
- 在ListCtrl中進行排序 (轉)排序
- 在JavaScript中建立新物件(轉)JavaScript物件
- css如何實現多行文字在div中垂直居中效果CSS
- jQuery實現的div在視窗中垂直水平居中效果jQuery
- 在網站開發中很有用的8個 jQuery 效果網站jQuery
- | / - 的旋轉效果實現(轉)
- 在網頁中怎樣使文字旋轉? (轉)網頁
- 在Windows中玩轉Docker ToolboxWindowsDocker
- 在ASP檔案中呼叫DLL (轉)
- 在Delphi中操作快捷方式 (轉)
- 在vim中實現批次加密(轉)加密
- sqlserver在JAVA中的應用 (轉)SQLServerJava
- 卡片旋轉動畫效果動畫
- 在ORACLE中移動資料庫檔案在(轉)Oracle資料庫
- 在Flutter中建立有意思的滾動效果 - Sliver系列Flutter
- 為啥同樣的邏輯在不同前端框架中效果不同前端框架
- 歸納貼:武俠小說和遊戲中的武功效果(轉)遊戲
- 在powerpoint中設定幻燈片背景的填充效果選項中包含什麼
- 在Director中實現文字滾動 (轉)
- 讓Pqmagic在Server版中執行 (轉)Server
- 在C++ Builder中定義事件 (轉)C++UI事件
- 在DELPHI程式中撥號上網 (轉)
- 在access中增加農曆支援模組. (轉)
- 在VB.NET中尋找App (轉)APP
- Java EE在SOA世界中的消亡?(轉)Java
- 在AIX中設定中文環境(轉)AI