D3D中的混合
D3D中的混合指的是目標(biāo)像素(后臺(tái)緩沖)與源像素(光柵化像素)混合(blend)輸出的過程。
一、影響最終的混合后輸出結(jié)果的因素有個(gè):混合因子,混合方法。
1)混合因子(D3D10_BLEND)。
混合因子共有19個(gè)。注意:有些混合因子以_COLOR結(jié)尾,有的以_ALPHA結(jié)尾。其中以_COLOR結(jié)尾的混合因子不能用于APPHA混合方程
混合因子分為源混合因子,目標(biāo)混合因子。區(qū)別在于,前者指定的是源像素的比例,后者指定的是目標(biāo)像素的比例。
2)混合方法(DD10_BLEND_OP)
混合方法有5中,一般常用的就是加、減、乘。
3)混合因子與混合方法的常用組合使用示例
1.屏蔽顏色寫入,當(dāng)我們希望屏蔽后臺(tái)緩沖只向深度緩沖寫入數(shù)據(jù)時(shí)。我們可以這樣干,將源像素混合因子設(shè)為D3D10_BLEND_ZERO,目標(biāo)像素混合因子設(shè)為D3D10_BLEND_ONE,混合方法設(shè)為D3D10_BLEND_OP_ADD
2.像素相加減 。源像素混合因子設(shè)為D3D10_BLEND_ONE,目標(biāo)像素混合因子設(shè)為D3D10_BLEND_ONE,混合方法設(shè)為D3D10_BLEND_OP_ADD/SUBTRACT
3.像素相乘 。源像素混合因子設(shè)為D3D10_BLEND_ZERO,目標(biāo)像素混合因子設(shè)為D3D10_BLEND_SRC_COLOR,混合方法設(shè)為D3D10_BLEND_OP_ADD
4.透明效果。 使用源像素的(光柵化像素)的ALPHA分量控制源像素的透明度。將源混合因子設(shè)為D3D10_BLEND_SRC_ALPHA,將目標(biāo)混合因子設(shè)為D3D10_BLEND_INV_SRC_ALPHA,混合運(yùn)算設(shè)為D3D10_BLEND_OP_ADD。
注意:當(dāng)使用該種繪制效果時(shí),要根據(jù)透明物體與攝像機(jī)之間的距離將物體的繪制順序進(jìn)行排序。按照從后向前的順序進(jìn)行繪制。(將透明物體后面所有物體先繪制出來,然后才能將透明的源像素和后臺(tái)緩沖區(qū)的目標(biāo)像素進(jìn)行混合)
下面是示例:
二、使用混合的流程
定義混合狀態(tài)(BLEND_STATE)——>啟用混合狀態(tài)——>繪制。
1)定義并創(chuàng)建、使用混合狀態(tài)
混合狀態(tài)是一個(gè)結(jié)構(gòu)體。內(nèi)容是:源混合因子,目標(biāo)混合因子,混合方法,ALPHA源混合因子,ALPHA目標(biāo)混合因子,ALPHA混合方法。渲染目標(biāo)寫入控制(是多個(gè)枚舉變量的組合,用來控制何種顏色可以寫圖后臺(tái)緩沖,當(dāng)然也可以只寫入ALPHA屏蔽RGB顏色)。
下面是創(chuàng)建并啟用一個(gè)混合狀態(tài)的例子(C++代碼)
ID3D10BlendState* mTransparentBS;D3D10_BLEND_DESC blendDesc = {0}; blendDesc.AlphaToCoverageEnable = false;//不啟用AlphaToCoverage blendDesc.BlendEnable[0] = true;//在索引為0的渲染目標(biāo)中啟用混合 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都可以寫入后臺(tái)緩沖區(qū)) float blendFactor[] = {0.0f, 0.0f, 0.0f, 0.0f}; //使用CreateBlendState函數(shù)創(chuàng)建blendstate md3dDevice->CreateBlendState(&blendDesc, &mTransparentBS); //使用OMSetBlendState函數(shù),啟用剛剛創(chuàng)建的blendstate //第二個(gè)參數(shù)是用于描述RGB顏色向量的浮點(diǎn)數(shù)組,不過我不知道它具體是做什么的… //第三個(gè)參數(shù)0xffffffff表示不屏蔽任何采樣源 md3dDevice->OMSetBlendState(mTransparentBS, blendFactor, 0xffffffff);注意:使用混合會(huì)在每個(gè)像素上進(jìn)行工作,當(dāng)我們不需要使用混合時(shí)應(yīng)當(dāng)馬上將它關(guān)閉。以節(jié)省開銷。關(guān)閉方法如下
//空值表示默認(rèn)混合狀態(tài),也就是禁用混合 md3dDevice->OMSetBlendState(0);最后的最后:像其他D3D接口一樣,當(dāng)我們要結(jié)束程序時(shí),總要將它釋放
mTransparentBS->release(); mTransparentBS = 0;與渲染狀態(tài)一樣,混合狀態(tài)也可以在效果文件中創(chuàng)建和設(shè)置。下面是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);} }?
轉(zhuǎn)載于:https://www.cnblogs.com/CAION/archive/2013/02/26/2934017.html
總結(jié)
- 上一篇: 面试题分享【不断更新】
- 下一篇: Sql Server 邮件日志 操作