Floating point 这是WebGL着色器中有限浮点精度的示例吗?

Floating point 这是WebGL着色器中有限浮点精度的示例吗?,floating-point,glsl,webgl,shader,Floating Point,Glsl,Webgl,Shader,我在shadertoy上有一个着色器,它的行为与我预期的不一样。它获取X和Y片段坐标,将它们相加,计算此表达式的长度。ULP值应该非常小,所以我将其乘以一个非常大的数字,并将其作为像素颜色输出。我希望是白色像素,但我得到黑色,这表明该值实际上为零。这是由我的WebGL实现(Google Chrome for Windows)中的精度限制引起的某种错误吗 编辑:出于好奇,我在手机上加载了shadertoy示例,结果我得到了一个与我最初期望的一样的白色屏幕。你确定floatBitsToInt是你想要

我在shadertoy上有一个着色器,它的行为与我预期的不一样。它获取X和Y片段坐标,将它们相加,计算此表达式的长度。ULP值应该非常小,所以我将其乘以一个非常大的数字,并将其作为像素颜色输出。我希望是白色像素,但我得到黑色,这表明该值实际上为零。这是由我的WebGL实现(Google Chrome for Windows)中的精度限制引起的某种错误吗


编辑:出于好奇,我在手机上加载了shadertoy示例,结果我得到了一个与我最初期望的一样的白色屏幕。

你确定
floatBitsToInt
是你想要使用的功能吗?您将1添加到该转换产生的整数中的确切含义是什么?您确定这会以您希望的方式影响浮点表示吗?因为我认为它会给浮点的指数加1。@NicolBolas将浮点重新解释为int,然后加1会产生下一个最大的浮点。它相当于std::nextafter。你可以在这里看到它的作用。第4.5.1节是否回答了你的问题?@EricPostPhischil也许你只有一个与WebGL 1.0兼容的浏览器?@gman不太可能。我说highp浮点使用ieee754格式,它说像加法这样的操作是正确的四舍五入。如果是这样的话,我希望它能起作用。出于好奇,我在手机上加载了shadertoy示例,结果我得到了一个与我最初期望的一样的白色屏幕。你确定
floatBitsToInt
是你想要使用的函数吗?您将1添加到该转换产生的整数中的确切含义是什么?您确定这会以您希望的方式影响浮点表示吗?因为我认为它会给浮点的指数加1。@NicolBolas将浮点重新解释为int,然后加1会产生下一个最大的浮点。它相当于std::nextafter。你可以在这里看到它的作用。第4.5.1节是否回答了你的问题?@EricPostPhischil也许你只有一个与WebGL 1.0兼容的浏览器?@gman不太可能。我说highp浮点使用ieee754格式,它说像加法这样的操作是正确的四舍五入。如果是这样的话,我希望它能起作用。出于好奇,我在手机上加载了shadertoy示例,不料,我得到了一个白色屏幕,正如我最初预期的那样。
float ulp(float f)
{
    int i = floatBitsToInt(f);
    return abs(intBitsToFloat(i + 1) - f);
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    float f = fragCoord.y + fragCoord.x;
    vec3 col = vec3(ulp(f) * 3.4e38);
    fragColor = vec4(col, 1.0);
}