【发布时间】:2012-06-13 18:46:59
【问题描述】:
对于一个学术项目,我正在尝试编写从头开始绘制广告牌的代码;现在我正处于使它们半透明的地步。我已经设法让它们在背景下看起来不错,但它们仍然可以用它们应该是透明的角相互覆盖,就像这张照片中一样:
我不确定我做错了什么。这是我用来绘制广告牌的效果文件。我省略了与顶点着色器相关的部分,我认为这些部分现在无关紧要。
//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;
}
}
我有两个纹理,命名为 Texture 和 MaskTexture,后者是灰度的。广告牌很可能在同一个顶点缓冲区中,并通过来自 XNA 的一次GraphicsDevice.DrawIndexedPrimitives() 调用来绘制。
我有一种感觉,我没有把整件事都做对。
【问题讨论】:
-
您启用了 GL_BLEND 吗?看看这里的 GL_BLEND 部分opengl.org/sdk/docs/man/xhtml/glEnable.xml
-
@ananthonline 抱歉,我在帖子末尾的某处隐藏了该项目在 XNA 中而不是 OpenGL 中的信息。好吧,实际上我为启用混合所做的(或至少记得做过的)唯一一件事就是将
AlphaBlendEnable = true;添加到pass块中。还不够吗? -
我实际上看不出您的 HLSL 有什么问题,请尝试更改您的像素着色器以仅返回从您的蒙版纹理中获取的值,以确保它以您想要的方式使用。另外你的后备缓冲格式是什么?
标签: graphics 3d xna hlsl pixel-shader