Normal map effect for Mandelbrot set all jagged up

36 Views Asked by At

I'm trying to implement this 3D-like shadow effect for the Mandelbrot set that I found here. Here's the simplified GLSL fragment shader code that I've written based on the pseudocode provided in the above link.

vec2 cexp(vec2 z) {
    return exp(z.x) * vec2(cos(z.y), sin(z.y));
}
dvec2 cconj(dvec2 z) {
    return dvec2(z.x, -z.y);
}

double h2 = 1.5f;
float angle = 45;
dvec2 v = dvec2(cexp(vec2(0.0f, angle * M_2PI / 360)));

dvec2 c = (dvec2(gl_FragCoord.x / screenSize.x, (screenSize.y - gl_FragCoord.y) / screenSize.y) - dvec2(0.5, 0.5)) * dvec2(zoom, (screenSize.y * zoom) / screenSize.x) + offset;
dvec2 z = c;

dvec2 der1 = dvec2(1.0, 0.0);
dvec2 der2 = dvec2(0.0, 0.0);

double xx = z.x * z.x;
double yy = z.y * z.y;

for (int i = 0; i < max_iters; i++) {
    if (xx + yy >= 10000000) {
        double lo = 0.5 * log(float(xx + yy));
        dvec2 u = z * der1 * ((1 + lo) * cconj(der1 * der1) - lo * cconj(z * der2));
        u /= length(u);
        double t = dot(u, v) + h2;
        t /= h2 + 1.0;
        if (t < 0) t = 0.2;

        float m = i + 1 - log2(log2(float(length(z)))) / log2(2);
        vec4(mix(color(m * 10), vec3(0.f), float(t)), 1.f);
        return;
    }
    dvec2 new_z = dvec2(xx - yy, 2.0 * z.x * z.y) + c;
    dvec2 new_der1 = der1 * 2.0 * z + 1.0;
    dvec2 new_der2 = 2 * (der2 * z + der1 * der1);
    z = new_z;
    der1 = new_der1;
    der2 = new_der2;
    xx = z.x * z.x;
    yy = z.y * z.y;
}
fragColor = vec4(-1.f, -1.f, 0.f, 0.f);

This is the result enter image description here

Far from what I'm trying to achieve enter image description here

I have triple checked my code but can't figure out what is wrong with it. It is seemingly identical to the pseudocode in the website. I'd appreciate any help!

0

There are 0 best solutions below