前段時(shí)間曾經(jīng)碰到過RT紋理繪制出來時(shí)需要透明的問題。當(dāng)時(shí)也Google了一下,但是很少有人提起過這個(gè)問題。昨天看劍孤寒的空間的Galaxy2D引擎中使用RT的透明繪制,文章在這里。發(fā)現(xiàn)這個(gè)特性居然需要顯卡支持,馬上查過DX9SDK文檔,發(fā)現(xiàn)這樣一篇文章,已經(jīng)告訴我們怎么做了:
Render Target Alpha (Direct3D 9)
The frame buffer blender can now blend alpha channels independent from color-channel blending on render targets. This control is enabled with a new render state, D3DRS_SEPARATEALPHABLENDENABLE.
When D3DRS_SEPARATEALPHABLENDENABLE is set to FALSE (which is the default condition), the render-target blending factors and operations applied to alpha are the same as those defined for blending color channels. A driver needs to set the D3DPMISCCAPS_SEPARATEALPHABLEND cap to indicate that it can support render-target alpha blending. Be sure to enable D3DRS_ALPHABLEND to tell the pipeline that alpha blending is needed.
To control the factors in the alpha channel of the render-target blenders, two new render states are defined as follows:
D3DRS_SRCBLENDALPHA
D3DRS_DESTBLENDALPHA
Like the D3DRS_SRCBLEND and D3DRS_DESTBLEND, these can be set to one of the values in the D3DBLEND enumeration. The source and destination blend settings can be combined in several ways, depending on the settings in the SrcBlendCaps and DestBlendCaps members of D3DCAPS9.
The alpha blending is done as follows:
renderTargetAlpha = (alphain* srcBlendOp) BlendOp (alphart* destBlendOp)
Where:
- alphain is the input alpha value.
- srcBlendOp is one of the blend factors in D3DBLEND.
- BlendOp is one of the blend factors in D3DBLENDOP.
- alphart is the render-target alpha value.
- destBlendOp is one of the blend factors in D3DBLEND.
- renderTargetAlpha is the final blended alpha value.
翻譯如下:
使用 D3DRS_SEPARATEALPHABLENDENABLE渲染狀態(tài)可以讓Frame Buffer 混合器將RT中的Alpha通道與顏色通道分開混合。
當(dāng)D3DRS_SEPARATEALPHABLENDENABLE 設(shè)置為 FALSE(默認(rèn)),RT渲染參數(shù)和操作會跟顏色通道一樣被應(yīng)用到Alpha通道。 這項(xiàng)特性需要顯卡支持D3DPMISCCAPS_SEPARATEALPHABLEND 特性。記住,在之前設(shè)置D3DRS_ALPHABLEND以便打開Alpha混合。
RT混合器的Alpha通道混合因子渲染狀態(tài)如下:
D3DRS_SRCBLENDALPHA
D3DRS_DESTBLENDALPHA
其被定義在D3DBLEND枚舉中,D3DRS_SRCBLEND 和D3DRS_DESTBLEND也是這樣定義的。來源色與目標(biāo)顏色將會有很多組合方式,主要依賴于D3DCAPS9中的SrcBlendCaps 和DestBlendCaps
Alpha混合公式如下:
renderTargetAlpha = (alphain* srcBlendOp) BlendOp (alphart* destBlendOp)
其中:
alphain為輸入alpha值
srcBlendOp是D3DBLEND中的一個(gè)混合因子
BlendOp是 D3DBLENDOP中的一個(gè)混合因子
alphart是RT的alpha值
destBlendOp是D3DBLEND中的一個(gè)混合因子
renderTargetAlpha是最后混合后的alpha值