10

しかし、 pow(0, 2.0) は 0 を返します

float 指数は 1 になり、integer 指数は 0 になるようです。

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

1 に答える 1

8

HLSL ドキュメントを見ると、pow(x, y)として直接実装されているようexp(y * log(x))です。あなたの質問以来x=0、もう一度 docs を見てください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))参照

于 2011-09-21T00:22:05.343 に答える