Черный экран благодаря шейдерам ps_3 - PullRequest
0 голосов
/ 16 марта 2011

Я сейчас использую шейдеры в своей игре, она отлично работает с 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 голосов
/ 16 марта 2011

Я помню, однажды у меня была похожая проблема. Шейдер просто не работал на ATI. Проблема заключалась в том, что вершинные и пиксельные шейдеры были скомпилированы для разных моделей шейдеров (vs_3_0 и ps_2_0). Это работало для NVIDIA, но не для ATI. В вашем случае вы привязываете только пиксельный шейдер к проходу, и кто знает, каким был последний вершинный шейдер.

Конечно, это актуально, только если вы уверены, что проблема с шейдером, а не с чем-то другим, например, ваши DIPs.

Удачи

...