Utforskare för Mandelbrotmängden

2026-03-19

För snart ett år sedan skrev jag ett program för att utforska Mandelbrotmängden. Denna skrev jag i RENODLAD C med OpenGL (Ooooh vad ni nu måste känna er som riktiga posers)! Den har inte alltför många funktioner men den är SNABB och det går att flyga runt och utforska mängden ganska bra. Sedan har mitt program problemet att när man zoomar in nog så har floatsen i vertex shadern inte nog med precision, vilket är ganska surt. Om någon har någon lösning på detta mejla gärna mig. Här är koden för shadern

#version 400


uniform float u_max_iter;
uniform vec4 u_viewport;
uniform uint u_show_exit_time;

in vec2 Fragpos;

out vec4 LFragment;

float escapetime(in float real, in float imag) {
	float i = 0.;
	float curreal = real, curimag = imag;
	float tmp;
	for (; i < u_max_iter && sqrt(curreal*curreal + curimag * curimag) < 2.; i++) {
		tmp = curreal * curreal - (curimag * curimag) + real;
		curimag = 2 * curimag * curreal + imag;
		/* c^3 instead of c^2 */
		/*tmp = curreal * curreal * curreal - 3 * (curreal * curimag * curimag) + real;*/
		/*curimag = 3 * (curreal * curreal * curimag) - (curimag * curimag * curimag) + imag;*/
		curreal = tmp;
	}

	return i;
}

void main() {
	// LFragment = vec4(1.,1.,1.,1.);
	// LFragment = vec4(0.38, 0.58, 0.93, 1.0);
	float real = u_viewport.x + (Fragpos.x / 2.f + 0.5f) * (u_viewport.z - u_viewport.x);
	float imag = u_viewport.y + (1 - (Fragpos.y / 2.f + 0.5f)) * (u_viewport.w - u_viewport.y);
	float iter = escapetime(real, imag);

	if (iter >= u_max_iter)
		LFragment = vec4(1.f, 1.f, 1.f, 1.f);
	else if (u_show_exit_time == 1)
		LFragment = vec4(iter / u_max_iter, 0., 0., 1.);
	// LFragment = vec4(Fragpos.x, Fragpos.y, 0., 1.);
}
Variabelnamn och resten får ni lista ut själva men det är inte så svårt. I alla fall här är en banger screenshot från mitt program


Mail: erikk@previousplan.org