黑屏由于着色器ps_3

时间:2011-03-16 08:14:00

标签: c# xna shader

我目前正在游戏中使用着色器,它与nVidia GeForceGT330m配合使用,但是带有ATI 4670(支持ps_4.1)我遇到黑屏。

以下是HLSL效果的来源:

struct Explo
{
    float3 position;
    float4 color;
    float power;
    int time;
};
float2 DisplacementScroll;
texture colortexture;

int nb;
Explo explos[5];

float ambient;
float4 ambientColor;

float screenWidth;
float screenHeight;

sampler ColorMap = sampler_state
{
    Texture = <colortexture>;
};

float4 CalculateLight(Explo ex, float4 base, float3 pixelPosition)
{

    float3 direction = ex.position - pixelPosition;
    float distance = 1 / length(ex.position - pixelPosition) * ex.power;
    float amount = max(dot(base, normalize(distance)), 0);

    return base * distance * amount * ex.color * ambient;
}

float4 Explosion(float2 texCoords : TEXCOORD0) : COLOR
{
    //texCoords =  tex2D(NormalMap, DisplacementScroll + texCoords / 3)*0.2 - 0.15;
    float4 base = tex2D(ColorMap, texCoords);

    float3 pixelPosition = float3(screenWidth * (texCoords.x),
                            screenHeight * (texCoords.y),0);

    float4 finalColor = (base * ambientColor * ambient);
    for (int i=0; i<nb; i++)
    {
        finalColor += CalculateLight(explos[i], base, pixelPosition);
    }

    return finalColor;
}

technique KaBoom
{
    pass Pass1
    {
        PixelShader = compile ps_3_0 Explosion();
    }
}

1 个答案:

答案 0 :(得分:0)

我记得有过类似的问题。着色器在ATI上无效。问题是顶点和像素着色器被编译为不同的着色器模型(vs_3_0和ps_2_0)。它适用于NVIDIA,但不适用于ATI。在你的情况下,你只是绑定一个像素着色器的传递,谁知道最后一个顶点着色器是什么。

当然,这只有在您确定问题与着色器有关时才有意义,而不是其他问题,例如:你的DIP。

祝你好运