Math pow(0,2.2)在hlsl像素着色器中给出1?

Math pow(0,2.2)在hlsl像素着色器中给出1?,math,shader,hlsl,pixel-shader,Math,Shader,Hlsl,Pixel Shader,但是pow(0,2.0)给出了0 似乎任何浮点指数都给出1,而整数指数给出0 我正在使用DirectX 9和hlsl编译器“D3DCompiler_43.dll”。 在Nvidia和Ati卡上确认 我糊涂了! 这是某种已知的行为或bug吗 要演示效果,请尝试以下简单的测试着色器: // Test shader demonstrating strange pow behaviour // when brightness becomes 0 resulting color will jump to

但是pow(0,2.0)给出了0

似乎任何浮点指数都给出1,而整数指数给出0

我正在使用DirectX 9和hlsl编译器“D3DCompiler_43.dll”。 在Nvidia和Ati卡上确认

我糊涂了! 这是某种已知的行为或bug吗

要演示效果,请尝试以下简单的测试着色器:

// 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();
    }
}
//测试演示奇怪pow行为的着色器
//当亮度变为0时,结果颜色将跳转为白色
float4x4 WorldViewProjXf:WorldViewProjection;
浮动亮度
<
字符串UIName=“亮度”;
浮动UIMin=0;
浮动UIMax=1;
> = 0;
结构与输入
{
浮动4位置:位置0;
};
结构与输出
{
浮动4位置:位置0;
};
VS_输出顶点函数(VS_输入数据)
{
VS_输出数据;
outData.position=mul(in_data.position,WorldViewProjXf);
返回数据;
}
float4 Fragment_Func(与_数据中的_输出):颜色
{
返回功率(亮度,2.2);
}
主要技术
{
通过p0
{       
VertexShader=compile vs_3_0 Vertex_Func();
PixelShader=编译ps_3_0片段_Func();
}
}

查看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
进行比较。这是我对所发生事情的最好猜测


请您发布一个指向您所提到的那些文档的链接,好吗。听起来比我在msdn上能找到的信息要好。添加了参考资料。第二个参考是
pow
指令,而不是
pow
固有函数。不是HLSL,但有些帮助,因为还有一些附加信息。它的右边,“pow(abs(Color),Exponent)”和“exp(Exponent*log(Color))”都给出了相同的结果——不幸的是,包括zero错误。好吧,你的答案并不完全是一个答案,但只要没有其他答案,而且你很有帮助,你就得到了复选标记。