遊戲開發基礎(七)

 

第七章
融合技術能使我們將當前要進行光柵化的像素與先前已光柵化並處於同一位置的像素的顏色進行合成。
即將正在處理的圖元顏色值與存儲在後臺緩存中的像素顏色值進行合成(混合),利用該技術,我們可以獲得各種各樣的效果,尤其是透明效果。
這種將當前計算得到的像素(源像素)顏色值與先前計算所得的像素(目標像素)顏色值進行合成的做法稱爲融合
注意,融合的效果並不侷限於普通玻璃類型的透明效果
在融合運算時,必須遵循以下原則:
首先繪製那些不需要進行融合的物體,然後將需要進行融合的物體按照相對於攝像機的深度值進行排序,如果物體已處於觀察座標系中,該運算的效率會相當高,因爲此時只需對z分量進行排序,最後,按照自後往前的順序逐個繪製將要進行融合運算的物體。
對兩個像素顏色值進行融合處理的公式:
OutputPixel = SourcePixel*SourceBlendFactor + DestPixel * DestBlendFactor
公式中的每個變量都是一個4D顏色向量(r,g,b,a)符號*表示分量逐個相乘
OutputPixel 融合後的顏色值
SourcePixel 當前計算得到的,用於與後臺緩存中對應像素進行融合的像素顏色值
SourceBlendFactor 源融合因子,指定了源像素的顏色值在融合中所佔比例,該值在區間[0,1]內
DestPixel 當前處於後臺緩存中的像素顏色值
DestBlendFactor 目標融合因子,指定了目標像素的顏色值在融合中所佔的比例,該值在區間[0,1]內

源融合因子和目標融合因子使我們可以各種方式修改源像素和目標像素的顏色值,從而可以獲得各種不同的效果
Direct3D中,默認狀態下都是禁止融合運算的,可將繪製狀態D3DRS_ALPHABLENDENABLE設爲true,便啓用運算
Device->SetRenderState(D3DRS_ALPHABLENDENABLE,true);

注意:融合的計算開銷並不低,所以應該僅在必須得場合中使用,當您繪製完需要進行融合的幾何體之後,應禁止Alpha融合,在對三角形單元組進行融合時,最好進行批處理,之後應立即繪製出來,這樣就可避免在每幀圖像中都啓用和禁止融合運算


通過設定源融合因子和目標融合因子,我們可創建一系列不同的融合效果
可通過設置繪製狀態D3DRS_SRCBLEND 和D3DRS_DESTBLEND的值來對源融合因子和目標融合因子分別進行設定。
Device->SetRenderState(D3DRS_SRCBLEND,Source);
Device->SetRenderState(D3DRS_DESTLEND,Destination);
其中,Source和destination可取下列融合因子
D3DBLEND_ZERO blendFactor = (0,0,0,0)
D3DBLEND_ONE blendFactor = (1,1,1,1)
D3DBLEND_SRCCOLOR blendFactor = (rs,gs,bs,as)
D3DBLEND_INVSRCCOLOR blendFactor = (1-rs,1-gs,1-bs,1-as)
...........
源融合因子和目標融合因子的默認值分別是D3DBLEND_SRCALPH D3DLEND_INVSRCALPHA
每個頂點顏色中的Alpha分量與顏色值類似,都是沿着三角形單元表面漸變的,但它並非用於確定某像素的顏色值,而是用於確定像素的Alpha分量。
Alpha分量主要用於指定像素的透明度,假定我們爲每個像素的Alpha分量保留了8位,則該Alpha分量的合法區間是[0,255],其中,[0,255]對應於透明度[%0,100%].當Alpha值爲0,該像素就是完全透明的,如果像素的Alpha值爲128,其透明度就是50%,而Alpha值爲255的像素就是完全不透明的。
爲了能夠用Alpha分量來描述像素的透明度,我們必須將源融合因子和目標融合因子分別設置爲D3DBLEND_SRCALPHA和D3DBLEND_INVSRCALPHA,這些值恰好也是融合因子的默認值。

我們並不直接使用計算得到的Alpha分量,而往往是從紋理的Alpha通道中獲取Alpha信息,Alpha通道是保留給存儲了Alpha分量的紋理元的一個額外的位集合。當紋理映射到某個圖元中時,Alpha通道中的Alpha分量也進行了映射,併成爲該圖元中像素的Alpha分量。

默認狀態下,如果當前設置的紋理擁有一個Alpha通道,Alpha值就取自該Alpha通道,如果沒有Alpha通道,Alpha值就取自頂點的顏色,但也可以用下列繪製狀態來指定Alpha值得來源(漫反射顏色值或Alpha通道)
//compute Alpha from diffuse colors during shading
Device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);
Device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTA_SELECTARG1);
// take Alpha from Alpha channel
Device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
Device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTA_SELECTARG1);

發佈了79 篇原創文章 · 獲贊 17 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章