2016-11-22 72 views
0

這是我正面臨的簡化問題: 使用directx我需要在兩個(或多個)完全相同的(在相同的2d平面中)重疊的三角形繪製。三角形是半透明的,但我想要釋放的效果是它們剪裁成單個三角形的透明度。下面的圖片可能會更好地描述問題。在directx中合併重疊的透明形狀

Current and wanted result

有沒有辦法做到這一點?

+1

有幾種方法可以做到這一點,因爲你用的着色器標籤標記您的問題:'MAX(tri1Color,tri2Color);' –

+0

@LJᛃ您的建議THX。三角形的數量可以超過兩個,如果它們都以最大透明度繪製,結果將是相同的,所以我恐怕這將不起作用 –

+0

通過啓用深度模板解決了問題,我必須在寫入之前禁用它導致此行爲的不可見對象。忘了再次啓用它。 –

回答

0

啓用深度模具防止這個問題

+0

在遊戲中,Z測試通常在Alpha上啓用,但不是Z寫入(所以表面不會覆蓋不透明的地面項目)。透明物品通常從後到前排序。因此積累的顏色/不透明度。如果您在屏幕上的相同位置有兩個不同的透明表面,並且Z深度相同,則根據您設置的拒收測試,您最終會進行Z戰鬥。通常,您設置混合狀態。用不同顏色的三角形重新測試您的解決方案,您可能會遇到z戰鬥。祝你好運。 – ErnieDingo

0

我用這個來獲得重疊的透明三角形而不是「積累」。您需要創建blendstate並將其設置爲輸出合併。

blendStateDescription.AlphaToCoverageEnable = false; 
 blendStateDescription.RenderTarget[0].IsBlendEnabled = true; 
     blendStateDescription.RenderTarget[0].SourceBlend = D3D11.BlendOption.SourceAlpha; 
     blendStateDescription.RenderTarget[0].DestinationBlend = D3D11.BlendOption.One; // 
     blendStateDescription.RenderTarget[0].BlendOperation = D3D11.BlendOperation.Maximum; 
     blendStateDescription.RenderTarget[0].SourceAlphaBlend = D3D11.BlendOption.SourceAlpha; //Zero 
     blendStateDescription.RenderTarget[0].DestinationAlphaBlend = D3D11.BlendOption.DestinationAlpha; 
     blendStateDescription.RenderTarget[0].AlphaBlendOperation = D3D11.BlendOperation.Maximum; 
     blendStateDescription.RenderTarget[0].RenderTargetWriteMask = D3D11.ColorWriteMaskFlags.All; 

希望這有助於。代碼是用C#編寫的,但它在C++中的工作原理是一樣的。基本上,將源代碼和目標代碼的alpha值進行比較,並將其作爲最大值。這將永遠是相同的(只要你在這兩個三角形上使用相同的字母),否則它將渲染最多的字母。

編輯:我已經添加了一個混合在我的項目中做了什麼的樣本。這裏的道路重疊。 Overlap Sample

我的像素着色器是爲:

我通過UV共ORDS在個float4。

xy = uv coords。 w是alpha值。

像素着色器代碼

float4 pixelColourBlend; 
pixelColourBlend = primaryTexture.Sample(textureSamplerStandard, input.uv.xy, 0); 
pixelColourBlend.w = input.uv.w; 
clip(pixelColourBlend.w - 0.05f); 
return pixelColourBlend; 

忽略我的反應,無法對其進行編輯... GRRRR。

+0

感謝您的答案,我想這是要走的路,但我不能得到它的工作。在blendstate上嘗試了很多不同的設置,但它沒有做到我想要的。 SourceAlphaBlend,DestinationAlphaBlend和AlphaBlendOperation似乎什麼都不做。我是否需要向像素着色器添加某些內容? –

+0

'code' float4 pixelColourBlend; \t pixelColourBlend = primaryTexture.Sample(textureSamplerStandard,input.uv.xy,0); pixelColourBlend.w = input.uv.w; clip(pixelColourBlend.w - 0.05f); return pixelColourBlend; – ErnieDingo

+0

'float4 pixelColourBlend; \t pixelColourBlend = primaryTexture.Sample(textureSamplerStandard,input.uv.xy,0); pixelColourBlend.w = input.uv.w; clip(pixelColourBlend.w - 0。05F); return pixelColourBlend;' – ErnieDingo