为什么手动迭代工作而不是for循环?

时间:2014-11-25 07:05:36

标签: glsl webgl

我一直在研究WebGL中的分形距离函数,并注意到每当我将迭代计数设置为3或更大时,它就会在我的计算机上失败。我的意思是我得到一个灰色屏幕而不是灰度分形(我认为计算没有完成,因为我在非WebGL设置中测试了它的正确性)

然而,在工作的机器上,它可以在3或更高的数量下正常工作。我定义了这样的迭代次数:

#define MANDELBOX_ITER 20

试图找出我转换基于迭代的代码的问题:

float mandelboxDist(Object inMandelbox, vec3 inPos) {
    inPos -= inMandelbox.pos;
    vec3 offset = vec3(inPos);

    float d = 1.0;
    for (int i = 0; i < MANDELBOX_ITER; i++) {
        // Boxfold
        inPos = clamp(inPos, -MANDELBOX_BFOLD, MANDELBOX_BFOLD)*2.0-inPos;

        // Spherefold
        float posDot = dot(inPos, inPos);
        if (posDot < MANDELBOX_MIN_RAD) {
            inPos *= MANDELBOX_LINEAR_SCALE;
            d *= MANDELBOX_LINEAR_SCALE;
        }
        else if (posDot < MANDELBOX_FIXED_RAD) {
            float inversion = MANDELBOX_FIXED_RAD/posDot;
            inPos *= inversion;
            d *= inversion;
        }

        inPos = MANDELBOX_SCALE*inPos+offset;
        d = MANDELBOX_SCALE*d+1.0;
    }

    return length(inPos)/abs(d);
}

......进入这个:

void iterateMandelbox(inout vec3 pos, vec3 inOffset, inout float d) {
    // Boxfold
    pos = clamp(pos, -MANDELBOX_BFOLD, MANDELBOX_BFOLD)*2.0-pos;

    // Spherefold
    float posDot = dot(pos, pos);
    if (posDot < MANDELBOX_MIN_RAD) {
        pos *= MANDELBOX_LINEAR_SCALE;
        d *= MANDELBOX_LINEAR_SCALE;
    }
    else if (posDot < MANDELBOX_FIXED_RAD) {
        float inversion = MANDELBOX_FIXED_RAD/posDot;
        pos *= inversion;
        d *= inversion;
    }

    pos = MANDELBOX_SCALE*pos+inOffset;
    d = MANDELBOX_SCALE*d+1.0;
}

float mandelboxDist(Object inMandelbox, vec3 inPos) {
    inPos -= inMandelbox.pos;
    vec3 offset = vec3(inPos);
    float d = 1.0;

    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);
    iterateMandelbox(inPos, offset, d);

    return length(inPos)/abs(d);
}

...并发现它可以在我的电脑上运行。显然这是非常不方便的,我不知道为什么它在手动&#34;循环。发生了什么事?

编辑:为了回应LJ_1102的答案,我有一张2011年的Macbook和&#34;关于这款Mac&#34;告诉我,我有一台英特尔高清显卡3000 384 MB&#34;显卡

1 个答案:

答案 0 :(得分:1)

假设您使用的是Windows PC,您可能会在ANGLE中遇到循环展开错误。

要验证此操作,请使用--use-gl=desktop启动浏览器。此标志强制您的浏览器不使用 ANGLE DirectX转换层。当你的问题确实是基于ANGLE时 使用getTranslatedShaderSource查看已编译的HLSL代码并从那里进行调试。

不幸的是,如果它是一个基于角度的问题,你唯一有机会让它运行,或者直到正确转换或在角度项目页面上提交错误。