在以下着色器中,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上复制。这样的事情会成为驱动程序问题吗?
(好奇的是,这些公式计算了以北极为中心的正投影的纬度。)
- UPDATE -
今天确认MacOS 10.11.6 不显示渲染错误。这看起来像是一个驱动程序/操作系统问题。
答案 0 :(得分:1)
asin(x):如果|x |>结果未定义1。
和
sqrt(x):如果x
其中任何一个都指出了这个问题吗?
尝试
float m1 = cos(asin(clamp(p, -1., 1.)));
float m2 = sqrt(abs(1.0 - p*p));