日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

D3D中的混合

發(fā)布時(shí)間:2024/4/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 D3D中的混合 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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é)

以上是生活随笔為你收集整理的D3D中的混合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。