HLSL点精灵纹理坐标在ATI上正常,在NVIDIA上不正常。

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();        

    }
}
1个回答

1

我曾经遇到过同样的问题,它浪费了我很多时间。我没有找到任何关于这个问题的文档,但是通过在ATI和NVIDIA设备上进行测试,我发现了差异。使用pointsprites时,ATI可以正常工作,它可以将纹理坐标适当地插值到TEXCOORD0中。相比之下,NVIDIA几乎做了同样的事情,但是他们使用TEXCOORD插值器将纹理坐标写入所有字段中。因此,您通过纹理坐标传递给像素着色器的所有信息都将被覆盖。我通过使用COLOR插值器而不是TEXCOORD插值器来解决了这个问题。非常奇怪,但对我来说很有效 :) 在您的情况下,应该是:

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

这种行为似乎也适用于英特尔GPU。至少在我个人测试过的HD 4000上。颜色插值器的解决方法也适用于这些设备。 - eodabash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接