在Direct93D中Fog效果 (轉)

worldblog發表於2008-01-31
在Direct93D中Fog效果 (轉)[@more@]

在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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章