D3D中的混合
D3D中的混合指的是目標像素(后臺緩沖)與源像素(光柵化像素)混合(blend)輸出的過程。
一、影響最終的混合后輸出結果的因素有個:混合因子,混合方法。
1)混合因子(D3D10_BLEND)。
混合因子共有19個。注意:有些混合因子以_COLOR結尾,有的以_ALPHA結尾。其中以_COLOR結尾的混合因子不能用于APPHA混合方程
混合因子分為源混合因子,目標混合因子。區別在于,前者指定的是源像素的比例,后者指定的是目標像素的比例。
2)混合方法(DD10_BLEND_OP)
混合方法有5中,一般常用的就是加、減、乘。
3)混合因子與混合方法的常用組合使用示例
1.屏蔽顏色寫入,當我們希望屏蔽后臺緩沖只向深度緩沖寫入數據時。我們可以這樣干,將源像素混合因子設為D3D10_BLEND_ZERO,目標像素混合因子設為D3D10_BLEND_ONE,混合方法設為D3D10_BLEND_OP_ADD
2.像素相加減 。源像素混合因子設為D3D10_BLEND_ONE,目標像素混合因子設為D3D10_BLEND_ONE,混合方法設為D3D10_BLEND_OP_ADD/SUBTRACT
3.像素相乘 。源像素混合因子設為D3D10_BLEND_ZERO,目標像素混合因子設為D3D10_BLEND_SRC_COLOR,混合方法設為D3D10_BLEND_OP_ADD
4.透明效果。 使用源像素的(光柵化像素)的ALPHA分量控制源像素的透明度。將源混合因子設為D3D10_BLEND_SRC_ALPHA,將目標混合因子設為D3D10_BLEND_INV_SRC_ALPHA,混合運算設為D3D10_BLEND_OP_ADD。
注意:當使用該種繪制效果時,要根據透明物體與攝像機之間的距離將物體的繪制順序進行排序。按照從后向前的順序進行繪制。(將透明物體后面所有物體先繪制出來,然后才能將透明的源像素和后臺緩沖區的目標像素進行混合)
下面是示例:
二、使用混合的流程
定義混合狀態(BLEND_STATE)——>啟用混合狀態——>繪制。
1)定義并創建、使用混合狀態
混合狀態是一個結構體。內容是:源混合因子,目標混合因子,混合方法,ALPHA源混合因子,ALPHA目標混合因子,ALPHA混合方法。渲染目標寫入控制(是多個枚舉變量的組合,用來控制何種顏色可以寫圖后臺緩沖,當然也可以只寫入ALPHA屏蔽RGB顏色)。
下面是創建并啟用一個混合狀態的例子(C++代碼)
ID3D10BlendState* mTransparentBS;D3D10_BLEND_DESC blendDesc = {0}; blendDesc.AlphaToCoverageEnable = false;//不啟用AlphaToCoverage blendDesc.BlendEnable[0] = true;//在索引為0的渲染目標中啟用混合 blendDesc.SrcBlend = D3D10_BLEND_SRC_ALPHA; blendDesc.DestBlend = D3D10_BLEND_INV_SRC_ALPHA; blendDesc.BlendOp = D3D10_BLEND_OP_ADD; blendDesc.SrcBlendAlpha = D3D10_BLEND_ONE; blendDesc.DestBlendAlpha = D3D10_BLEND_ZERO; blendDesc.BlendOpAlpha = D3D10_BLEND_OP_ADD; blendDesc.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL;//全部(RGB顏色和ALPHA都可以寫入后臺緩沖區) float blendFactor[] = {0.0f, 0.0f, 0.0f, 0.0f}; //使用CreateBlendState函數創建blendstate md3dDevice->CreateBlendState(&blendDesc, &mTransparentBS); //使用OMSetBlendState函數,啟用剛剛創建的blendstate //第二個參數是用于描述RGB顏色向量的浮點數組,不過我不知道它具體是做什么的… //第三個參數0xffffffff表示不屏蔽任何采樣源 md3dDevice->OMSetBlendState(mTransparentBS, blendFactor, 0xffffffff);注意:使用混合會在每個像素上進行工作,當我們不需要使用混合時應當馬上將它關閉。以節省開銷。關閉方法如下
//空值表示默認混合狀態,也就是禁用混合 md3dDevice->OMSetBlendState(0);最后的最后:像其他D3D接口一樣,當我們要結束程序時,總要將它釋放
mTransparentBS->release(); mTransparentBS = 0;與渲染狀態一樣,混合狀態也可以在效果文件中創建和設置。下面是HLSL代碼
BlendState blend {BlendEnable[0] = TRUE;SrcBlend = SRC_COLOR;DestBlend = INV_SRC_ALPHA;BlendOp = ADD;SrcBlendAlpha = ZERO;DestBlendAlpha = ZERO;BlendOpAlpha = ADD;RenderTargetWiriteMask[0] = 0x0F; };technique Tech {pass P0{...SetBlendState(blend,float4(0.0f,0.0f,0.0f,0.0f),0xffffffff);} }?
轉載于:https://www.cnblogs.com/CAION/archive/2013/02/26/2934017.html
總結
- 上一篇: 面试题分享【不断更新】
- 下一篇: linux下的嵌入式开发技能(嵌入式工程