2011-09-20 18 views
7

लेकिन पॉव (0, 2,0) 0पाउ (0, 2.2) 1 एचएलएसएल पिक्सेल शेडर में देता है?

लगता है कि किसी भी नाव प्रतिपादक 1 देता है, जबकि पूर्णांक एक्स्पोनेंट्स 0.

मैं DirectX 9 का उपयोग कर रहा देने के लिए और HLSL संकलक "D3DCompiler_43.dll" देता है। ने पुष्टि की कि एनवीडिया और एटीआई कार्ड पर।

मैं उलझन में हूँ! क्या यह किसी तरह का ज्ञात व्यवहार या बग है?

इसे समझने के लिए प्रभाव निम्नलिखित साधारण परीक्षण शेडर का प्रयास करें:

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

उत्तर

5

HLSL डॉक्स को देखते हुए, pow(x, y)exp(y * log(x)) के रूप में सीधे लागू किया जाना प्रतीत होता है। आपके प्रश्न में x=0 के बाद, फिर से दस्तावेज़ log(x) == -INF पर देख रहे हैं। ऐसा लगता है कि y के मान उस बिंदु पर कोई फर्क नहीं पड़ता जब तक यह सकारात्मक और शून्य से अधिक न हो।

आप pow(0.0, 0.0) == 1.0 के साथ गलती से pow(0.0, 2.0) == 0.0 की तुलना कर सकते हैं। क्या हो रहा है इसके लिए यह मेरा सबसे अच्छा अनुमान है।

log(0)=-INF reference

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

+0

आप उन दस्तावेज़ों को आप की बात कर रहे हैं करने के लिए एक लिंक पोस्ट कृपया सकते हैं। एमएसडीएन पर मिली जानकारी से बेहतर लगता है। –

+0

जोड़ा गया संदर्भ। दूसरा संदर्भ 'पाउ 'आंतरिक कार्य के बजाय' पाउ 'निर्देश के लिए है। –

+0

अब मैं देखता हूं, आप शेडर असेंबलर दस्तावेज़ों के बारे में बात कर रहे थे। एचएलएसएल नहीं, लेकिन कुछ अतिरिक्त जानकारी है क्योंकि कुछ अतिरिक्त जानकारी है। इसका अधिकार, "पाउ (पेट (रंग), एक्सपोनेंट)" और "एक्सप (एक्सपोनेंट * लॉग (रंग))" सभी एक ही परिणाम देते हैं - दुर्भाग्यवश, शून्य-बग सहित। खैर, आपका जवाब बिल्कुल एक जवाब नहीं है, लेकिन जहां तक ​​कोई दूसरा नहीं है और आप सहायक थे, आपको चेकमार्क मिलता है। –

संबंधित मुद्दे