我一直在研究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;显卡
答案 0 :(得分:1)
假设您使用的是Windows PC,您可能会在ANGLE中遇到循环展开错误。
要验证此操作,请使用--use-gl=desktop
启动浏览器。此标志强制您的浏览器不使用 ANGLE DirectX转换层。当你的问题确实是基于ANGLE时
使用getTranslatedShaderSource查看已编译的HLSL代码并从那里进行调试。
不幸的是,如果它是一个基于角度的问题,你唯一有机会让它运行,或者直到正确转换或在角度项目页面上提交错误。