shader Mandelbrot: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Seite erstellt)
 
K
Zeile 23: Zeile 23:
 
Viel Grafikprozessorleistung ;-)
 
Viel Grafikprozessorleistung ;-)
 
<br>
 
<br>
Da für jedes Pixel eine lange(je nach Position) Schleife durchlaufen werden muss, ist der Shader leider sehr Resourcenfressend. Daher sollte man ihn entweder nur mit guten Grafikkarten verwenden und die Bildschirmflächen, auf denen der Shader angewendet wird klein halten.
+
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==
 
==Code==

Version vom 29. November 2014, 13:11 Uhr

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)

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);
    }
    
}