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;
    }
}

我有两个纹理,命名为 Texture 和 MaskTexture,后者是灰度的。广告牌很可能在同一个顶点缓冲区中,并GraphicsDevice.DrawIndexedPrimitives()通过 XNA 的一次调用来绘制。

我有一种感觉,我没有把整件事都做对。

4

2 回答 2

0

您必须按顺序绘制它们。从最远到最近。

于 2012-06-13T22:18:22.717 回答
0

我找到了解决方案。着色器很好,问题出在 XNA 代码中,很抱歉让您注意错误的事情。

解决方案是在绘制广告牌之前启用深度模板缓冲区(无论它是什么):

device.DepthStencilState = DepthStencilState.DepthRead;

之后可以禁用它:

device.DepthStencilState = DepthStencilState.Default;
于 2012-06-14T07:34:32.277 回答