Aug 26, 2009

Trigonometric function explosion

這幾天寫HLSL碰到一個怪問題,存nomal的texture上總是會有多餘的碎片,原因大概是經過一連串三角函數的運算,不知道是三角函數還是浮點數出了問題,導致這段程式最後的the在應該接近π時變成非正數(小於等於0):

float3 nor = normalize(input.wnor);
float phi = acos(nor.y);
float len = sin(phi);
float the = acos(nor.x / len);

最後改成這樣就搞定了:

float the = acos(clamp(nor.x / len, -1.0f, 1.0f));

No comments: