4

私は本当にこれにこだわっています。スプライト シートのテクスチャ座標でポイント スプライトをレンダリングするための私の HLSL は、すべての ATI カードで正常に動作しますが、どの NVIDIA カードでも動作しません。NVIDIA カードでは、渡されたテクスチャ座標はスプライト シートの一部ではなく全体にマップされます。奇妙ですが、ATI カードでは問題なく動作します。ATI カードに固有の何かが欠けていますか?

これが私のシェーダーです

struct VS_INPUT
{
        float4 Position   : POSITION;
        float4 Color      : COLOR;
        float4 Texture    : TEXCOORD0;
    //float1 Psize    : PSIZE0;
};


struct VS_OUTPUT
{
        float4 Position   : POSITION;
        float4 Color      : COLOR;
        float2 Texture    : TEXCOORD0;
        float2 Texture_zw : TEXCOORD1;
    float1 Psize      : PSIZE;
};



float4x4 WorldViewProj;
texture Tex <string name = "sprite_coin_test.dds";>;
sampler2D s_2D;
float offset_x=0.0;
float offset_y=0.0;


sampler S0 = sampler_state
{
    Texture = (Tex);
    MinFilter = ANISOTROPIC; //LINEAR;
    MagFilter = ANISOTROPIC; //LINEAR;
    MipFilter = LINEAR;
};


VS_OUTPUT vs_main( in VS_INPUT In )
{
    VS_OUTPUT Out=(VS_OUTPUT)0;                      //create an output vertex

    Out.Position = mul(In.Position, WorldViewProj);  //apply vertex transformation
    Out.Texture  = In.Texture;
        Out.Texture_zw = float2(In.Texture.z, In.Texture.w);
        Out.Color    = In.Color;
    //Out.Psize    = In.Psize;
    Out.Psize=(Out.Position.z)*10.0;
        return Out;                         //return output vertex
}

float4 PS_Particle_main(float2 vPos: TEXCOORD0, float2 text_zw: TEXCOORD1) : COLOR 
{   
        vPos.x*=offset_x;
        vPos.y*=offset_y;

        vPos += float2(text_zw[0], text_zw[1]);    

        return tex2D(s_2D, vPos);
}

technique RenderVS
{   
    pass p0   
    {       
        AlphaBlendEnable        = true;     
        AlphaTestEnable     = false;        
        SrcBlend            = SRCALPHA;     
        DestBlend           = INVSRCALPHA;  

        POINTSPRITEENABLE       = true;     
        POINTSCALEENABLE        = true;
              POINTSIZE_MIN     = 1.0f;     
        POINTSIZE_MAX       = 400.0f;           
                    POINTSCALE_A        = 1.0f;
        POINTSCALE_B        = 1.0f;
        POINTSCALE_C        = 1.0f;
        ZWRITEENABLE        = false;

        Sampler[0]      = (S0);


        VertexShader = compile vs_1_1 vs_main();
        PixelShader = compile ps_2_0 PS_Particle_main();        

    }
}
4

1 に答える 1

1

私はしばらくの間同じ問題を抱えていましたが、それには多くの時間がかかりました。この問題に関するドキュメントは見つかりませんでしたが、ATI および NVIDIA デバイスでのテストで違いが見つかりました。ポイントスプライトを使用すると、ATI は問題なく動作し、テクスチャ座標を適切に TEXCOORD0 に補間します。対照的に、NVIDIA はほぼ同じことを行いますが、TEXCOORD 補間器を使用してすべてのフィールドにテクスチャ座標を書き込みます。したがって、 texturecoordinates によってピクセルシェーダーに渡すすべての情報は上書きされます。TEXCOORD インターポレーターの代わりに COLOR インターポレーターを使用して、これを解決しました。非常に奇妙ですが、私にとってはうまく機能します:)あなたの場合は次のようになります。

struct VS_OUTPUT
{
    float4 Position   : POSITION;
    float4 Color      : COLOR0;
    float2 Texture    : TEXCOORD0;
    float2 Texture_zw : COLOR1;
    float1 Psize      : PSIZE;
};
于 2012-11-09T10:02:10.803 に答える