shader Mandelbrot
Aus DGL Wiki
Inhaltsverzeichnis
Mandelbrot Shader
Zurück zur Shadersammlung
Beschreibung | Autor | Version |
---|---|---|
Ein Shader zum generieren eines Mandelbrotfraktals | Komoluna | 1.0 |
Bilder
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);
}
}