2013-07-19 47 views
1

我有一個Direct3D程序,通過逐幀繪製而不是清除每一幀,它使用alpha混合在屏幕上繪製黑色方塊。渲染後,它會:direct3d淡入淡出效果葉子文物

renderstate.alphablendenable = true; 
renderstate.blendoperation = add; 
renderstate.sourceblend = zero; 
renderstate.destinationblend = invblendfactor; 
renderstate.blendfactor = rgb(8,8,8); 

然後它呈現方塊(請原諒僞代碼)。這很好地工作,除了它不完全清除屏幕。它留下永久性的痕跡,我不明白爲什麼。適當的混合應該足夠的框架後,完全褪色成黑色,但這會留下灰色的痕跡。任何人都知道Direct3D中爲什麼或更好的淡入淡出方法?

回答

0

有很多方法可以解決這個問題,這取決於代碼的其他部分的結構。例如,您可以將所有內容渲染到紋理,並在黑色背景頂部使alpha值遞減,而不是反過來渲染。

如果你不介意使用着色器,一種快速且相對高效的方法是將像素着色器應用於你正在「褪色」的任何東西。

着色器相當於你此刻在做什麼(呈現低-α黑過頂)會是這樣:

float4 FadeEffectShader(PixelInputType input) : SV_Target 
{ 
    float4 color;  

    color = shaderTexture.Sample(SampleType, input.tex); 
    color = color * 0.01; 

    return color; 
} 

你最終的顏色沿着指數曲線淡出其中,對於這個例子來說,永遠不會等於零,你會留下一個很好的優雅的淡出,直到出現文物的地方几乎變黑。你真正想要的是更象:

float4 FadeEffectShader(PixelInputType input) : SV_Target 
{ 
    float4 color; 

    color = shaderTexture.Sample(SampleType, input.tex); 
    color = color * 0.01; 
    if(color.r<0.01) color.r = 0; 
    if(color.g<0.01) color.g = 0; 
    if(color.b<0.01) color.b = 0; 

    return color; 
} 

低於0.01值的夾緊將確保他們變成黑色,而不是關閉,但並非足夠接近的到黑色。

+0

謝謝,我想有沒有陰影這樣做的方法,但我猜不是。我仍然不明白爲什麼alpha混合不能正常工作。我想我將不得不使用着色器。謝謝。 – HypnoToad