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という名前の2つのテクスチャがあり、後者はグレースケールです。ビルボードは、ほとんどの場合、同じ頂点バッファーにありGraphicsDevice.DrawIndexedPrimitives()、XNAからの1回の呼び出しで描画されます。

私はすべてを正しくやっていないと感じています。

4

2 に答える 2

0

私は解決策を見つけました。シェーダーは問題ありません。問題はXNAコードにあることが判明したため、間違ったことに注意を向けて申し訳ありません。

解決策は、ビルボードを描画する前に、深度ステンシルバッファ(それが何であれ)を有効にすることです。

device.DepthStencilState = DepthStencilState.DepthRead;

後で無効にすることができます:

device.DepthStencilState = DepthStencilState.Default;
于 2012-06-14T07:34:32.277 に答える
0

あなたはそれらを順番に描く必要があります。最も遠いものから最も近いものへ。

于 2012-06-13T22:18:22.717 に答える