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

Glsl webgl片段着色器中三角函数的惊人行为,glsl,webgl,Glsl,Webgl,在以下着色器中,m1和m2应具有相同的值,因为 但是,使用m1生成的字段,而m2生成预期平滑字段: 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);

在以下着色器中,
m1
m2
应具有相同的值,因为

但是,使用
m1
生成的字段,而
m2
生成预期平滑字段:

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不应该出现在那里

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

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

--更新--

今天确认MacOS 10.11.6没有显示渲染错误。这似乎真的是一个驱动程序/操作系统问题。

根据

asin(x):如果∣x∣ > 一,

sqrt(x):如果x<0,则结果未定义

这其中有谁指出了问题所在吗

试一试


m2
渲染正确,因此我将重点关注
m1
。即使使用钳形,渲染也不正确。您的GPU是否通过了这些测试。还有你的GPU是什么?发布您的GPU/驱动程序信息
关于:GPU
内容。芯片组型号:英特尔高清图形3000类型:GPU总线:内置VRAM(动态,最大):384 MB供应商:英特尔(0x8086)设备ID:0x0116修订ID:0x0009以上是我的macbook air的规格。然而,我也在一台运行MacOSX10.10.5的MacBookPro上复制了这一点。升级到10.11.6后的macbook pro:渲染修复。所以基本上我们确定这是一个驱动程序错误?你的专业人员不工作,但现在工作了?你的空气仍然不工作(是在10.11.6吗?)
float m1 = cos(asin(clamp(p, -1., 1.)));
float m2 = sqrt(abs(1.0 - p*p));