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();
}
}
Podría usted por favor enviar un enlace a los documentos que está hablando. Suena mejor que las informaciones que pude encontrar en msdn. –
Referencias agregadas. La segunda referencia es a la instrucción 'pow', en lugar de la función intrínseca' pow'. –
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. –