【问题标题】:Transparent objects covering each other透明物体相互覆盖
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    device.DepthStencilState = DepthStencilState.DepthRead;
    

    之后可以禁用:

    device.DepthStencilState = DepthStencilState.Default;
    

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多