我一直在研究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”显卡
我实际上有一个Macbook,也许我应该写上面这个。如果它很重要,它是从2011年和“关于本机”告诉我,我有一个“英特尔高清显卡3000 384 MB”显卡 – asimes 2014-11-25 16:10:24
是的,我假设你在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
此外,您是否尝试过使用常量而不是定义作为终止条件? – 2014-11-26 00:29:03