對於一個學術項目,我試圖寫一個從頭開始畫廣告牌的代碼;現在我正在讓它們變得半透明。我已經成功地使它們看起來映襯不錯,但他們仍然可以互相掩護他們應該-是透明的角落,像這樣的畫面:透明的物體覆蓋彼此
我不知道我做錯了。這是我用來繪製廣告牌的效果文件。我已經省略了與頂點着色器有關的部分,我認爲它現在是不相關的。
//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()
進行繪製。
我有一種感覺,我沒有把整個事情做對。
是否啓用GL_BLEND?請看這裏的GL_BLEND部分http://www.opengl.org/sdk/docs/man/xhtml/glEnable.xml – Ani
@ananthonline對不起,我隱藏了項目在XNA中的信息,而不是OpenGL,在某處帖子結尾。那麼,實際上我所做的唯一一件事(或者至少可以記得這樣做)來啓用混合,就是將'AlphaBlendEnable = true;'添加到'pass'塊。這不夠嗎? – kamilk
我實際上看不到您的HLSL有什麼問題,請嘗試更改像素着色器,以僅返回從面罩紋理中獲取的值,以確保它以您打算使用的方式使用。您的backbuffer格式又是什麼? – Andy