【问题标题】:surprising behavior of trigonometric functions in webgl fragment shaderwebgl片段着色器中三角函数的惊人行为
【发布时间】:2016-08-16 19:36:35
【问题描述】:

在以下着色器中,m1m2 应该具有相同的值,因为 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 确实显示渲染错误。这看起来确实是驱动程序/操作系统问题。

【问题讨论】:

    标签: glsl webgl


    【解决方案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));
    

    【讨论】:

    • m2 渲染正确,所以我将重点关注m1。即使有钳位,渲染也不正确。
    • 您的 GPU 是否通过了这些测试? test1test2。还有你的GPU是什么?发布您的 GPU/驱动程序信息about:gpu 内容。
    • 芯片组型号:Intel HD Graphics 3000 类型:GPU 总线:内置 VRAM(动态,最大):384 MB 供应商:Intel (0x8086) 设备 ID:0x0116 修订 ID:0x0009
    • 以上是我的 macbook air 的规格。但是,我还在具有不同硬件、运行 Mac OS X 10.10.5 的 macbook pro 上复制了这一点。升级到 10.11.6 后相同的 macbook pro:渲染已修复。
    • 所以基本上我们已经确定这是一个驱动程序错误?你的亲没有工作,但现在呢?您的空气仍然无法正常工作(在 10.11.6 上吗?)
    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    相关资源
    最近更新 更多