【发布时间】:2016-08-16 19:36:35
【问题描述】:
在以下着色器中,m1 和 m2 应该具有相同的值,因为 cos(asin(x)) == sqrt(1.0 - x*x)。
但是,使用 m1 shows a black ring in the lower left corner 而产生的字段 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 确实不显示渲染错误。这看起来确实是驱动程序/操作系统问题。
【问题讨论】: