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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

D3D中的混合

發布時間:2024/4/17 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。