Mandelbrot通过使用LOVE2d的GLSL中的着色器进行设置会渲染一个圆,而不是一个分形

问题描述 投票:1回答:2

我正在尝试使用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的一些建议:

  • 添加C而不是减去C;
  • 以(0.0,0.0)开头z,以C传递迭代的起点;
  • 但都无济于事,我仍然有一个圈子。我也尝试使用更多的迭代]

我试图简化编码,但又没有做太多改动。

我在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集,但是得到的只是一个完整的圆...我已经对数学进行了大量检查,但我根本找不到错误,所以我认为问题可能出在语义上。是...

glsl fractals love2d mandelbrot
2个回答
2
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.