Opengl双溢出

Opengl双溢出,opengl,glsl,Opengl,Glsl,我有两个“半径”=2.0E-45,当我将其设置为~2.0E-46时,计算崩溃导致白色屏幕。所以问题似乎是溢出的。我写了同样的算法,但使用NUBMACUDA和f64(双精度)“半径”。一切正常。我正在使用f32纹理缓冲区来实现“深度数组”(这里没有float64数据类型),但numba实现可以很好地使用f32,opengl实现也可以很好地工作,直到“半径”大于~2.0E-46为止。为什么numba实现可以工作,而opengl不能?我想坚持使用opengl。有没有可能修复它 我只放了使用“半径”的部

我有两个“半径”=2.0E-45,当我将其设置为~2.0E-46时,计算崩溃导致白色屏幕。所以问题似乎是溢出的。我写了同样的算法,但使用NUBMACUDA和f64(双精度)“半径”。一切正常。我正在使用f32纹理缓冲区来实现“深度数组”(这里没有float64数据类型),但numba实现可以很好地使用f32,opengl实现也可以很好地工作,直到“半径”大于~2.0E-46为止。为什么numba实现可以工作,而opengl不能?我想坚持使用opengl。有没有可能修复它

我只放了使用“半径”的部分。所有其他变量都是双精度类型。(代码凌乱,只是一个划痕)

#版本150
#扩展GL\U ARB\U gpu\U着色器\U fp64:启用
双半径=2.0E-45;
...
dvec2像素=dvec2(gl_FragCoord.xy)+dvec2(-0.5+(双(x)+0.5)/double(AA),-0.5+(双(y)+0.5)/double(AA));
DVEC2C=像素/dvec2(宽度、高度)*dvec2(半径、半径)+dvec2(-半径/2,-半径/2);
color.rgb+=样品(c);
...
vec3样本(dvec2 dn)
{
vec3颜色=vec3(0.0,0.0,0.0);
dvec2 d0=dn;
双zn_尺寸=0.0;
int i=0;
while(ir)
{
双分形器=(zn_尺寸-r)/(r2-r);
双折射率=双(i)-折射率;
双m=sqrt(iter)*mul*2.0;
颜色=sin(vec3.1.15.2)*浮点数(m)*0.5)*.5+0.5;
打破
}
}
返回颜色;
}
在GLSL中,
2.0E-45
的类型为
float
。这意味着在将该值分配给某个值之前,该值将被压缩到
float
的有效范围内


如果您希望文本是
双精度
,则需要使用适当的后缀:
2.0E-45lf

是的,thx有效。我忘了提到我试着做了
双半径=0.00…(很多零)…0002
,但没有成功。
#version 150
#extension GL_ARB_gpu_shader_fp64 : enable

double radius = 2.0E-45;

...

dvec2 pixel = dvec2(gl_FragCoord.xy) + dvec2(-0.5+(double(x)+0.5)/double(AA),-0.5+(double(y)+0.5)/double(AA));
dvec2 c = pixel/dvec2(width, height) * dvec2(radius, radius) + dvec2(-radius/2, -radius/2);
color.rgb += sample(c);

...

vec3 sample(dvec2 dn)
    {
        vec3 color = vec3(0.0,0.0,0.0);
        dvec2 d0 = dn;

        double zn_size = 0.0;
        int i = 0;
        while (i < depth)
        {
            int x = i % depth;
            dvec2 value = dvec2(texelFetch(depth_array, x).rg);
            dn = complex_mul(dn, value + dn);
            dn = dn + d0;

            i++;
            x = i % depth;
            value = dvec2(texelFetch(depth_array, x).rg);
            dvec2 zn = value * 0.5 + dn;

            zn_size = dot(zn, zn);
            if (zn_size > r)
            {
                double fraciter = (zn_size-r)/(r2-r);
                double iter = double(i) - fraciter;
                double m = sqrt(iter)*mul*2.0;

                color = sin(vec3(.1, .15, .2)*float(m)*0.5)*.5+0.5;
                break;
            }
        }
        return color;
    }