shader Mandelbrot

Aus DGL Wiki
Version vom 29. November 2014, 13:17 Uhr von Komoluna (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Mandelbrot Shader

Zurück zur Shadersammlung

Beschreibung Autor Version
Ein Shader zum generieren eines Mandelbrotfraktals Komoluna 1.0

Bilder

Screenshot des Shaders bei der Arbeit

Beschreibung

Dieser Shader zeichnet abhängig von den Texturkoordinaten ein Mandelbrotfraktal (Mandelbrot-Menge). Ein Fraktal ist ein Muster oder eine Figur, deren Teile eine ähnlich Form haben, wie das gesamte Objekt. (Bsp: Romanesco-Brokkoli oder eine Schneeflocke)

Die Uniform Variable camera wird folgendermaßen verwendet:

camera[0] camera[1] camera[2]
Zoomfaktor (Default = 1) Verschiebung auf der X Achse (Default = 0) Verschiebung auf der Y Achse (Default = 0)

Besondere Vorraussetzungen

Viel Grafikprozessorleistung ;-)
Da für jedes Pixel eine lange(je nach Position) Schleife durchlaufen werden muss, ist der Shader leider sehr resourcenfressend. Daher sollte man ihn eher auf guten Grafikkarten verwenden und die Bildschirmflächen, auf denen der Shader angewendet wird eher klein halten.

Code

Ich wäre für Tipps zur Performanceverbesserung sehr dankbar...

Vertexshader

void main()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_TexCoord[0] = gl_MultiTexCoord0;  //Wichtig, da sonst nicht auf die Texturkoordinaten zugegriffen werden kann.
}

Fragmentshader

#version 120

uniform vec3 camera = vec3(1,0,0);

uniform int MaxIter = 1000;

void main()
{
	vec2 tc = vec2(gl_TexCoord[0]);

    float x0 = (tc.x * 3 - 2) * camera[0] + camera[1];
    float y0 = (tc.y * 2 - 1) * camera[0] + camera[2];

    float x = 0;
    float y = 0;
    int iteration = 0;

    while ((x * x + y * y <= 4) && (iteration < MaxIter))
    {
    	float xtemp = x * x - y * y + x0;
    	y = 2 * x * y + y0;
    	x = xtemp;

    	iteration += 1;
    }
    
    if (iteration == MaxIter)
    {
	/*
	  Hier wird der Farbwert für das Innere der Mandelbrotmenge gesetzt
	*/
    	gl_FragColor = vec4(0, 0, 0, 1);
    }
    else
    {
	/*
	  Hier kann eine beliebige Farbwahl stattfinden(z.B. mit einer Farbtabelle).
	  als Index verwendet man die Variable "iteration", die einen Wert zwischen 1 und MaxIter hat.
	*/
    	x = sin(float(iteration));
	gl_FragColor = vec4(x, x, x, 1);
    }
    
}