2012-06-13 64 views
0

對於一個學術項目,我試圖寫一個從頭開始畫廣告牌的代碼;現在我正在讓它們變得半透明。我已經成功地使它們看起來映襯不錯,但他們仍然可以互相掩護他們應該-是透明的角落,像這樣的畫面:透明的物體覆蓋彼此

我不知道我做錯了。這是我用來繪製廣告牌的效果文件。我已經省略了與頂點着色器有關的部分,我認爲它現在是不相關的。

//cut 

texture Texture; 
texture MaskTexture; 

sampler Sampler = sampler_state 
{ 
    Texture = (Texture); 

    MinFilter = Linear; 
    MagFilter = Linear; 
    MipFilter = Point; 

    AddressU = Clamp; 
    AddressV = Clamp; 
}; 

sampler MaskSampler = sampler_state 
{ 
    Texture = (MaskTexture); 

    MinFilter = Linear; 
    MagFilter = Linear; 
    MipFilter = Point; 

    AddressU = Clamp; 
    AddressV = Clamp; 
}; 

//cut 

struct VertexShaderOutput 
{ 
    float4 Position : POSITION0; 
    float4 Color : COLOR; 
    float2 TexCoord : TEXCOORD0; 
}; 

//cut 

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0 
{ 
    float4 result = tex2D(Sampler, input.TexCoord) * input.Color; 
    float4 mask = tex2D(MaskSampler, input.TexCoord); 
    float alpha = mask.r; 
    result.rgb *= alpha; 
    result.a = alpha; 
    return result; 
} 

technique Technique1 
{ 
    pass Pass1 
    { 
     VertexShader = compile vs_2_0 VertexShaderFunction(); 
     PixelShader = compile ps_2_0 PixelShaderFunction(); 

     AlphaBlendEnable = true; 
     SrcBlend = SrcAlpha; 
     DestBlend = InvSrcAlpha; 
    } 
} 

我有兩個紋理,名爲紋理和MaskTexture,後者是在灰度。廣告牌很可能位於同一個頂點緩衝區中,並且從XNA單次調用GraphicsDevice.DrawIndexedPrimitives()進行繪製。

我有一種感覺,我沒有把整個事情做對。

+0

是否啓用GL_BLEND?請看這裏的GL_BLEND部分http://www.opengl.org/sdk/docs/man/xhtml/glEnable.xml – Ani

+0

@ananthonline對不起,我隱藏了項目在XNA中的信息,而不是OpenGL,在某處帖子結尾。那麼,實際上我所做的唯一一件事(或者至少可以記得這樣做)來啓用混合,就是將'AlphaBlendEnable = true;'添加到'pass'塊。這不夠嗎? – kamilk

+0

我實際上看不到您的HLSL有什麼問題,請嘗試更改像素着色器,以僅返回從面罩紋理中獲取的值,以確保它以您打算使用的方式使用。您的backbuffer格式又是什麼? – Andy

回答

0

我找到了解決辦法。着色器很好,問題原來是在XNA代碼中,所以很抱歉把你的注意力引向錯誤的東西。

的解決方案是繪製廣告牌前啓用深度模板緩存(不管它是什麼):

device.DepthStencilState = DepthStencilState.DepthRead; 

可以事後禁用:

device.DepthStencilState = DepthStencilState.Default; 
0

你必須按順序繪製它們。從最遠到最近。