Skip to content

Instantly share code, notes, and snippets.

@agrif
Created December 2, 2012 22:09
Show Gist options
  • Save agrif/4191275 to your computer and use it in GitHub Desktop.
Save agrif/4191275 to your computer and use it in GitHub Desktop.
#version 400 core
#extension GL_ARB_gup_shader_fp64 : enable
in vec2 txcoords;
uniform double zoom;
uniform dvec2 offset;
out vec4 fragColor;
uniform int iter;
uniform sampler1D palette;
void main() {
double c_real = double(txcoords.x) * zoom + offset.x;
double c_imag = double(txcoords.y) * zoom + offset.y;
double z_real_0 = c_real;
double z_imag_0 = c_imag;
double z_real_1 = z_real_0 * z_real_0 - z_imag_0 * z_imag_0 + c_real;
double z_imag_1 = 2.0 * z_real_0 * z_imag_0 + c_imag;
double z_real_2 = z_real_1 * z_real_1 - z_imag_1 * z_imag_1 + c_real;
double z_imag_2 = 2.0 * z_real_1 * z_imag_1 + c_imag;
double z_real_3 = z_real_2 * z_real_2 - z_imag_2 * z_imag_2 + c_real;
double z_imag_3 = 2.0 * z_real_2 * z_imag_2 + c_imag;
double z_real_4 = z_real_3 * z_real_3 - z_imag_3 * z_imag_3 + c_real;
double z_imag_4 = 2.0 * z_real_3 * z_imag_3 + c_imag;
double z_real_5 = z_real_4 * z_real_4 - z_imag_4 * z_imag_4 + c_real;
double z_imag_5 = 2.0 * z_real_4 * z_imag_4 + c_imag;
double z_real_6 = z_real_5 * z_real_5 - z_imag_5 * z_imag_5 + c_real;
double z_imag_6 = 2.0 * z_real_5 * z_imag_5 + c_imag;
double z_real_7 = z_real_6 * z_real_6 - z_imag_6 * z_imag_6 + c_real;
double z_imag_7 = 2.0 * z_real_6 * z_imag_6 + c_imag;
int i;
for (i = 0; i < iter; i += 8) {
double z_r_q = z_real_7 * z_real_7;
double z_i_q = z_imag_7 * z_imag_7;
if (z_i_q + z_r_q > 4.0) {
break;
}
z_real_0 = z_r_q - z_i_q + c_real;
z_imag_0 = 2.0 * z_real_7 * z_imag_7 + c_imag;
z_real_1 = z_real_0 * z_real_0 - z_imag_0 * z_imag_0 + c_real;
z_imag_1 = 2.0 * z_real_0 * z_imag_0 + c_imag;
z_real_2 = z_real_1 * z_real_1 - z_imag_1 * z_imag_1 + c_real;
z_imag_2 = 2.0 * z_real_1 * z_imag_1 + c_imag;
z_real_3 = z_real_2 * z_real_2 - z_imag_2 * z_imag_2 + c_real;
z_imag_3 = 2.0 * z_real_2 * z_imag_2 + c_imag;
z_real_4 = z_real_3 * z_real_3 - z_imag_3 * z_imag_3 + c_real;
z_imag_4 = 2.0 * z_real_3 * z_imag_3 + c_imag;
z_real_5 = z_real_4 * z_real_4 - z_imag_4 * z_imag_4 + c_real;
z_imag_5 = 2.0 * z_real_4 * z_imag_4 + c_imag;
z_real_6 = z_real_5 * z_real_5 - z_imag_5 * z_imag_5 + c_real;
z_imag_6 = 2.0 * z_real_5 * z_imag_5 + c_imag;
z_real_7 = z_real_6 * z_real_6 - z_imag_6 * z_imag_6 + c_real;
z_imag_7 = 2.0 * z_real_6 * z_imag_6 + c_imag;
}
if (z_imag_0 * z_imag_0 + z_real_0 * z_real_0 > 4.0) {
i -= 7;
z_real_7 = z_real_0;
z_imag_7 = z_imag_0;
} else if (z_imag_1 * z_imag_1 + z_real_1 * z_real_1 > 4.0) {
i -= 6;
z_real_7 = z_real_1;
z_imag_7 = z_imag_1;
} else if (z_imag_2 * z_imag_2 + z_real_2 * z_real_2 > 4.0) {
i -= 5;
z_real_7 = z_real_2;
z_imag_7 = z_imag_2;
} else if (z_imag_3 * z_imag_3 + z_real_3 * z_real_3 > 4.0) {
i -= 4;
z_real_7 = z_real_3;
z_imag_7 = z_imag_3;
} else if (z_imag_4 * z_imag_4 + z_real_4 * z_real_4 > 4.0) {
i -= 3;
z_real_7 = z_real_4;
z_imag_7 = z_imag_4;
} else if (z_imag_5 * z_imag_5 + z_real_5 * z_real_5 > 4.0) {
i -= 2;
z_real_7 = z_real_5;
z_imag_7 = z_imag_5;
} else if (z_imag_6 * z_imag_6 + z_real_6 * z_real_6 > 4.0) {
i -= 1;
z_real_7 = z_real_6;
z_imag_7 = z_imag_6;
}
if (i == iter) {
fragColor = vec4(0.0, 0.0, 0.0, 1.0);
} else {
float ni = float(i) + 1.0 - log(log(float(sqrt(z_imag_7 * z_imag_7 + z_real_7 * z_real_7)))) / log(2.0);
fragColor = texture(palette, abs(ni / float(iter)));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment