我正在尝试使用GLSL渲染Mandelbrot集,但是我得到的只是一个完整的圆圈...我已经对数学进行了大量检查,但我根本找不到错误,所以我认为问题可能出在语义上。
有人能看到什么问题吗?
而且,有人能给我关于组织,结构等方面的见解吗?我正在尝试学习适当的编码,但是很难找到有关样式的材料。
Obs .:可以将着色器应用于任何图像
这个想法很简单(您可能会跳过):
- checkConvergence返回true,如果z没有发散(即,abs(z)<4
- sumSquare返回复数乘法(z.r,z.i)*(z.r,z.i)-(c.r,c.i),其中K.r = Re(K)和K.i = Im(K)
- iterate是实际的算法:保持对z的平方,直到它发散或达到最大迭代次数(tol)为止>>
- clr是参数化函数,它返回取决于n的RGB数组
- 最后,通过做两件事,效果就是神奇的地方:
- [获取像素的坐标(GLSL归一化为interval(0,1),并将其归一化为Mandelbrot集大小(-2
- 它在对坐标进行迭代上调用clr。
GLSLShader = love.graphics.newShader[[ vec2 c = vec2(1.0, 0.0); int tol = 100; vec4 black = vec4(0.0, 0.0, 0.0, 1.0); vec4 white = vec4(1.0, 1.0, 1.0, 1.0); bool checkConvergence(vec2 z) { return (z[0]*z[0] + z[1]*z[1] < 4); } vec2 sumSquare(vec2 z) { return vec2(z[0]*z[0] - z[1]*z[1] - c[0], 2 * z[0] * z[1] - c[1]); } int iterate(vec2 z) { int n = 0; while (checkConvergence(z) && (n < tol)) { vec2 z = sumSquare(z); n = n + 1; } return n; } vec4 clr(int n){ if(n == tol){return vec4(0.0,0.0,0.0,1.0);} int r, g, b; r = int(255*n + 47*(1-n)); g = int(180*n + 136*(1-n)); b = int(38*n + 255*(1-n)); if (r > 255) {r = 255;} else{ if(r<0){r = 0;} } if (g > 255) {g = 255;} else{ if(g<0){g = 0;} } if (b > 255) {b = 255;} else{ if(b<0){b = 0;} } return vec4(r, g, b, 1.0); } vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords){ vec2 z = vec2(texture_coords.x*4-2, texture_coords.y*4-2); return clr(iterate(z)); } ]]
更新
我尝试了来自@WeatherVane的一些建议:
但都无济于事,我仍然有一个圈子。我也尝试使用更多的迭代]
我试图简化编码,但又没有做太多改动。
我在clr函数中添加了一个条件,如果n小于0或大于1,则返回绿色。奇怪的是,圆圈是黑色的,屏幕的其余部分是白色的,但是我看不到哪里这种白色可能来自(因为clr永远不会在0 vec2 c = vec2(0.0, 0.0);
int tol = 1000;
vec4 black = vec4(0.0, 0.0, 0.0, 1.0);
vec4 white = vec4(1.0, 1.0, 1.0, 1.0);
vec4 green = vec4(0.0, 1.0, 0.0, 1.0);
int iterate(vec2 z) {
int n = 0;
while ( (z[0]*z[0] + z[1]*z[1] < 4) && (n < tol) ) {
vec2 z = vec2( z[0]*z[0] - z[1]*z[1] + c[0], 2 * z[0] * z[1] + c[1] );
n = n + 1;
}
return n;
}
vec4 clr(int n){
n = n / tol;
if(n == 1){return black;}
if(n > 1 || n < 0){return green;}
int r, g, b;
r = int(255*n + 47*(1-n));
g = int(180*n + 136*(1-n));
b = int(38*n + 255*(1-n));
return vec4(r, g, b, 1.0);
}
vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords){
vec2 z = vec2(texture_coords.x*4-2, texture_coords.y*4-2);
return clr(iterate(z));
}
我正在尝试使用GLSL渲染Mandelbrot集,但是得到的只是一个完整的圆...我已经对数学进行了大量检查,但我根本找不到错误,所以我认为问题可能出在语义上。是...