2011-09-20 22 views
7

Pero pow (0, 2.0) da 0pow (0, 2.2) da 1 en un sombreador de píxeles hlsl?

parece que cualquier exponente flotador da 1 mientras exponentes enteros dan 0.

estoy usando DirectX 9 y HLSL compilador "D3DCompiler_43.dll". Confirmado que en las tarjetas Nvidia y Ati.

¡Estoy confundido! ¿Es algún tipo de comportamiento conocido o error?

para ilustrar el efecto de sombreado intente lo siguiente prueba sencilla:

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

Respuesta

5

En cuanto a los documentos HLSL, pow(x, y) parece ser implementadas directamente como exp(y * log(x)). Desde x=0 en su pregunta, nuevamente mirando los documentos log(x) == -INF. Parece que el valor de y no debería importar en ese punto, siempre que sea positivo y mayor que cero.

Es posible que accidentalmente comparando pow(0.0, 2.0) == 0.0 con pow(0.0, 0.0) == 1.0. Esa es mi mejor estimación de lo que está pasando.

log(0)=-INF reference

pow = exp(y * log(x)) reference

+0

Podría usted por favor enviar un enlace a los documentos que está hablando. Suena mejor que las informaciones que pude encontrar en msdn. –

+0

Referencias agregadas. La segunda referencia es a la instrucción 'pow', en lugar de la función intrínseca' pow'. –

+0

Ahora veo, hablabas de los documentos del ensamblador del sombreador. No HLSL pero algo útil ya que hay algo de información adicional. Su derecho, "pow (abs (Color), Exponent)" y "exp (Exponent * log (Color))" dan todos el mismo resultado, incluido el error cero, desafortunadamente. Bueno, su respuesta no es exactamente una respuesta, pero en la medida en que no hay otra y fue útil, obtuvo la marca de verificación. –

Cuestiones relacionadas