2016-08-15 37 views
1

在以下着色器中,m1m2應該具有相同的值,因爲cos(asin(x)) == sqrt(1.0 - x*x)webgl片段着色器中三角函數的令人驚訝的行爲

precision highp float; 

void main() { 
    float scale = 10000.0; 
    float p = length(gl_FragCoord.xy/scale); 

    float m1 = cos(asin(p)); 
    float m2 = sqrt(1.0 - p*p); 

    float v = asin(m1); // change to m2 to see correct behavior 

    float c = degrees(v)/90.0; 
    gl_FragColor = vec4(vec3(c), 1.0); 
} 

此行爲確實令人費解:

然而,場使用m1shows a black ring in the lower left cornerm2產生預期的平滑場產生的。黑環的解釋是什麼?我認爲這可能是一個精確問題,但highp產生相同的結果。或者黑環代表NaN的結果,但NaN不應該出現在那裏。

black ring rendering

這鉻/ FF複製在MacOS 10.10.5。不在Windows 10或iOS 9.3.3上覆制。會這樣的事情是一個驅動程序問題?

(對於好奇,這些公式計算緯度爲中心的北極的正投影。)

--UPDATE--

今天證實,MacOS的10.11.6不顯示渲染錯誤。這看起來像是一個驅動程序/操作系統問題。

回答

1

根據to the spec

ASIN(X):結果是不確定的,如果|x|> 1.

SQRT(X):結果是不確定的,如果x < 0.

做其中的任何一位都指出了這個問題?

嘗試

float m1 = cos(asin(clamp(p, -1., 1.))); 
float m2 = sqrt(abs(1.0 - p*p)); 
+0

'm2'正確渲染,所以我將重點放在'm1'。即使使用夾具,渲染也是不正確的。 – cambecc

+0

您的GPU是否通過了這些測試? [test1](https://www.khronos.org/registry/webgl/sdk/tests/conformance/glsl/functions/glsl-function-asin.html?webglVersion=1&quiet=0),[test2](https:/ /www.khronos.org/registry/webgl/sdk/tests/conformance/ogles/GL/asin/asin_001_to_006.html?webglVersion=1&quiet=0)。你的GPU又是什麼?發佈你的GPU/Driver信息'about:gpu'內容。 – gman

+0

兩個測試都通過了。 – cambecc