2011-09-20 29 views
7

Nhưng pow (0, 2,0) cho 0pow (0, 2.2) cung cấp 1 trong bộ đổ bóng pixel hlsl?

Có vẻ rằng bất kỳ số mũ phao cho 1 trong khi số mũ nguyên cho 0.

Tôi đang sử dụng DirectX 9 và trình biên dịch HLSL "D3DCompiler_43.dll". Xác nhận rằng trên thẻ Nvidia và Ati.

Tôi đang bối rối! Có phải một số loại hành vi hoặc lỗi đã biết không?

Để minh họa cho hiệu ứng đổ bóng thử kiểm tra đơn giản sau:

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

Trả lời

5

Nhìn vào các tài liệu HLSL, pow(x, y) dường như được thực hiện trực tiếp như exp(y * log(x)). Kể từ x=0 trong câu hỏi của bạn, hãy xem lại tài liệu log(x) == -INF. Có vẻ như giá trị của y không quan trọng tại thời điểm đó miễn là nó dương và lớn hơn 0.

Bạn có thể vô tình so sánh pow(0.0, 2.0) == 0.0 với pow(0.0, 0.0) == 1.0. Đó là dự đoán tốt nhất của tôi về những gì đang xảy ra.

log(0)=-INF reference

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

+0

Ông có thể xin vui lòng gửi một liên kết đến những tài liệu bạn đang nói về. Âm thanh tốt hơn so với thông tin tôi có thể tìm thấy trên msdn. –

+0

Đã thêm tham chiếu. Tham chiếu thứ hai là lệnh 'pow', thay vì hàm' pow' nội tại. –

+0

Bây giờ tôi thấy, bạn đang nói về các tài liệu lắp ráp shader. Không phải là HLSL nhưng có phần hữu ích vì có một số thông tin bổ sung. Quyền của nó, "pow (abs (Color), Exponent)" và "exp (Exponent * log (Color))" tất cả đều cho kết quả tương tự - bao gồm cả zero-bug, thật không may. Vâng, câu trả lời của bạn không chính xác là một câu trả lời nhưng theo như không có khác và bạn đã giúp bạn có được dấu kiểm. –

Các vấn đề liên quan