OpenGL Mandelbrot像素化缩放

时间:2015-03-04 07:53:49

标签: c# glsl fractals opengl-4 sharpgl

我用SharpGL(OpenGL的C#实现)编写了一个带缩放的Mandelbrot查看器。它工作正常,但在17个缩放(每个缩放双倍缩放)后,它开始像素化非常糟糕。我有几乎相同的代码直接用c#编写,没有这个问题。

我已尝试在片段着色器中将浮点数设置为highp,以防它出现精度问题,但这并没有任何不同。这是我的片段着色器:

#version 400 core

out vec4 out_Color;
in vec4 gl_PointCoord;
in vec4 pixCoord;
uniform float max;
uniform float scale;
uniform float[2] center;

vec3 hsv2rgb(vec3 c)
{
    vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
}

void main(void) {
    highp vec2 z,c,p;
    vec3 tcolor;
    float hue,norm,colorfix,hue2;
    highp float x,y;
    p.x = pixCoord.x;
    p.y = pixCoord.y;


    c.x = (p.x) / scale+center[0];
    c.y = (p.y) / scale-center[1];

    int i;
    z = c;

    for(i=0; i<max; i++) {
        x = (z.x * z.x - z.y * z.y) + c.x;
        y = (z.y * z.x + z.x * z.y) + c.y;

        if((x * x + y * y) > 4.0) break;
        z.x = x;
        z.y = y;
    }

    if (i >= max)
        out_Color = vec4(0.0,0.0,0.0, 1.0);
    else {
        norm = sqrt(x*x+y*y);
        colorfix = max / (log(2*(scale))+1);
        hue = i + 1 - log(log(norm)/log(2))/log(2);
        hue2 = mod((0.8 * colorfix + hue) , colorfix) / colorfix;
        tcolor = hsv2rgb(vec3(hue2,0.6,1.0));
        out_Color = vec4(tcolor, 1.0);
    }
}

我尝试过使用黑色和红色,以防光滑的颜色计算造成一些麻烦,但这并没有改变任何东西。

缩放是在c#sharp程序中设置的,只是变焦的2的幂,所以大约2 ^ 17就是它开始变得明显的地方。

中心是复杂平面中真正的图像中心。

0 个答案:

没有答案