webgl片段着色器中三角函数的惊人行为

时间:2016-08-15 14:36:00

标签: glsl webgl

在以下着色器中,m1m2应具有相同的值,因为cos(asin(x)) == sqrt(1.0 - x*x)

但是,使用m1 shows a black ring in the lower left cornerm2生成的字段会生成预期的平滑字段:

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

这种行为真的令人费解。什么解释黑环?我认为这可能是一个精确的问题,但highp会产生相同的结果。或者也许黑环表示NaN结果,但NaN不应该出现在那里。

black ring rendering

这在Chrome / FF中的MacOS 10.10.5上重复。不在Windows 10或iOS 9.3.3上复制。这样的事情会成为驱动程序问题吗?

(好奇的是,这些公式计算了以北极为中心的正投影的纬度。)

- UPDATE -

今天确认MacOS 10.11.6 显示渲染错误。这看起来像是一个驱动程序/操作系统问题。

1 个答案:

答案 0 :(得分:1)

根据to the spec

  

asin(x):如果|x |>结果未定义1。

  

sqrt(x):如果x

其中任何一个都指出了这个问题吗?

尝试

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