Pow (0, 2,2) дает 1 в пиксельный шейдер hlsl? - PullRequest
9 голосов
/ 20 сентября 2011

Но pow (0, 2.0) дает 0

. Кажется, что любой показатель с плавающей запятой дает 1, а целочисленные - 0. 0. 1003 *

Я использую DirectX 9 и hlsl компилятор "D3DCompiler_43.dll",Подтвердил, что на картах Nvidia и Ati.

Я в замешательстве!Это какое-то известное поведение или ошибка?

Чтобы проиллюстрировать эффект, попробуйте следующий простой тестовый шейдер:

// Test shader demonstrating strange pow behaviour
// when brightness becomes 0 resulting color will jump to white

float4x4 WorldViewProjXf : WorldViewProjection < string UIWidget="None";>;

float Brightness
<
    string UIName = "Brightness";   
    float UIMin =  0;   
    float UIMax =  1;       
> = 0;


struct VS_Input
{
    float4 position : POSITION0;
};

struct VS_Output
{
    float4 position : POSITION0;
};

VS_Output Vertex_Func( VS_Input in_data )
{
    VS_Output outData;
    outData.position = mul(in_data.position, WorldViewProjXf);
    return outData;
}

float4 Fragment_Func( VS_Output in_data ) : COLOR
{
    return pow(Brightness, 2.2);
}

technique Main 
{
    pass p0 
    {       
        VertexShader = compile vs_3_0 Vertex_Func();
        PixelShader = compile ps_3_0 Fragment_Func();
    }
}

1 Ответ

7 голосов
/ 21 сентября 2011

Глядя на документы HLSL, pow(x, y) представляется реализованным непосредственно как exp(y * log(x)).Поскольку x=0 в вашем вопросе, снова просматриваю документы log(x) == -INF.Кажется, что значение y не должно иметь значения в этот момент, если оно положительное и больше нуля.

Возможно, вы случайно сравниваете pow(0.0, 2.0) == 0.0 с pow(0.0, 0.0) == 1.0.Это мое лучшее предположение о том, что происходит.

log(0)=-INF ссылка

pow = exp(y * log(x)) ссылка

...