2014-11-25 123 views
1

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

但是,在一台机器上在工作时,它在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); 
} 

。 ..并发现这是适用于我的电脑。显然这是非常不方便的,我不知道为什么它在“手动”循环时工作。到底是怎么回事?

编辑:为响应LJ_1102的回答,我已经从2011年的MacBook和“关于本机”告诉我,我有一个“英特尔高清显卡3000 384 MB”显卡

回答

1

在假设你”在Windows PC上,听起来像是在体验循环展开ANGLE中的错误。

要验证这一点,请使用--use-gl=desktop开始浏览。此标志强制您的浏览器使用不使用 ANGLE DirectX转换层。当您的问题确实是基于角度的 时,请使用getTranslatedShaderSource查看已编译的HLSL代码并从中进行调试。

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

+0

我实际上有一个Macbook,也许我应该写上面这个。如果它很重要,它是从2011年和“关于本机”告诉我,我有一个“英特尔高清显卡3000 384 MB”显卡 – asimes 2014-11-25 16:10:24

+0

是的,我假设你在Macbook上运行OSX?据我记忆,(英特尔HD 3000)驱动程序有一些问题,你是否安装了最新版本的OSX,[chrome:// gpu /](chrome:// gpu /)/ [about :gpu](about:gpu)(假设你使用chrome)给你,是否应用了任何驱动程序解决方法?您也可以参加[WebGL一致性测试](https://www.khronos.org/registry/webgl/sdk/tests/webgl-conformance-tests.html)。你最好的选择是更新你的图形驱动程序。 – 2014-11-26 00:21:51

+0

此外,您是否尝试过使用常量而不是定义作为终止条件? – 2014-11-26 00:29:03