在D3D11里面想對一個面貼一張圖后,再在此圖上面再貼一張帶透明的紋理(紋理加載的是一張png圖片),想實作的效果如下:
貼第一圖的效果如下

第二張圖就是png圖片,中間的空白是透明的,邊緣是從透明漸變到不透明如下

想要實作理想的效果是像這樣第三張圖:

有兩個方案,方案一:畫到第一張圖后,開啟混合,再畫第二張png紋理 ,這樣可以實作這上面的效果,但是模形的大小和方向改變,也要同時更改第二張png紋理,這樣很麻煩。
這時候就有第二種方案:使用多重紋理,
float4 PS_Main2(PS_Input frag) :SV_TARGET
{
float4 col= texture_.Sample(samplerState_,frag.tex0);
float4 col2 = texture_filter.Sample(samplerState_,frag.tex0);
return col*col2;
}
這是著色器里面的對兩張紋理混合采樣的代碼, 這個時候能在第一張圖上顯示第二張圖,但是透明通道沒有了,成這樣的效果了
,這個時候是沒有開啟混合的狀態的,開啟混合狀態后,開啟混合狀態后,第一紋理顯示不出來了,只顯第二張紋理了。
混合引數如下:
D3D11_BLEND_DESC blendDesc;
ZeroMemory(&blendDesc,sizeof(blendDesc));
blendDesc.AlphaToCoverageEnable = FALSE;
blendDesc.IndependentBlendEnable = FALSE;
blendDesc.RenderTarget[0].BlendEnable = TRUE;
blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0].RenderTargetWriteMask= D3D11_COLOR_WRITE_ENABLE_ALL;
uj5u.com熱心網友回復:
做這樣兩張圖融合不要需要開啟融合,直接寫shader挺好的啊,如果你的圖是黑白圖,shader代碼應該和你寫的一樣;
如果你的圖是透明圖,shader代碼應該這樣:
float4 PS_Main2(PS_Input frag) :SV_TARGET
{
float4 col=texture_.Sample(samplerState_,frag.tex0);
float4 col2 = texture_filter.Sample(samplerState_,frag.tex0);
float4 ret = col * (1- col2.a) + col2 * col2.a;
return ret;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/71129.html
標籤:其它游戲引擎
