這是我正面臨的簡化問題: 使用directx我需要在兩個(或多個)完全相同的(在相同的2d平面中)重疊的三角形繪製。三角形是半透明的,但我想要釋放的效果是它們剪裁成單個三角形的透明度。下面的圖片可能會更好地描述問題。在directx中合併重疊的透明形狀
有沒有辦法做到這一點?
這是我正面臨的簡化問題: 使用directx我需要在兩個(或多個)完全相同的(在相同的2d平面中)重疊的三角形繪製。三角形是半透明的,但我想要釋放的效果是它們剪裁成單個三角形的透明度。下面的圖片可能會更好地描述問題。在directx中合併重疊的透明形狀
有沒有辦法做到這一點?
啓用深度模具防止這個問題
在遊戲中,Z測試通常在Alpha上啓用,但不是Z寫入(所以表面不會覆蓋不透明的地面項目)。透明物品通常從後到前排序。因此積累的顏色/不透明度。如果您在屏幕上的相同位置有兩個不同的透明表面,並且Z深度相同,則根據您設置的拒收測試,您最終會進行Z戰鬥。通常,您設置混合狀態。用不同顏色的三角形重新測試您的解決方案,您可能會遇到z戰鬥。祝你好運。 – ErnieDingo
我用這個來獲得重疊的透明三角形而不是「積累」。您需要創建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。
感謝您的答案,我想這是要走的路,但我不能得到它的工作。在blendstate上嘗試了很多不同的設置,但它沒有做到我想要的。 SourceAlphaBlend,DestinationAlphaBlend和AlphaBlendOperation似乎什麼都不做。我是否需要向像素着色器添加某些內容? –
'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
'float4 pixelColourBlend; \t pixelColourBlend = primaryTexture.Sample(textureSamplerStandard,input.uv.xy,0); pixelColourBlend.w = input.uv.w; clip(pixelColourBlend.w - 0。05F); return pixelColourBlend;' – ErnieDingo
有幾種方法可以做到這一點,因爲你用的着色器標籤標記您的問題:'MAX(tri1Color,tri2Color);' –
@LJᛃ您的建議THX。三角形的數量可以超過兩個,如果它們都以最大透明度繪製,結果將是相同的,所以我恐怕這將不起作用 –
通過啓用深度模板解決了問題,我必須在寫入之前禁用它導致此行爲的不可見對象。忘了再次啓用它。 –