Seite 1 von 1

[Projekt] Mandelbrot

Verfasst: 27.11.2010, 13:40
von Jiba
Hallo,
Ich habe mich mal in Shaderprogrammierung versucht.
Dabei ist ein Pixelshader entstanden der ein Mandelbrot Fraktal berechnet.
Mandelbrot.rar
(121 KiB) 220-mal heruntergeladen
Steuerung:
Cursortasten - x-y Bewegung auf der Ebenen
W - Hineinzoomen
S - Rauszoomen
Q - Erhöht die Iterationen-Durchläufe
A - Verkleinert die Iterationen-Durchläufe
F1 - Speichert die aktuelle Position in einer Textdatei-Liste
Bild Hoch - Lädt aus der Textdatei die nächste Position
Bild Runter - Lädt aus der Textdatei die vorherige Position

Ich hoffe es läuft bei allen.
scr00.png
scr01.png
scr02.png
Mandelbrot.rar
(121 KiB) 220-mal heruntergeladen
Mal zwei Fragen zu Pixelshader (HLSL):
1. Kommt man an die States die man mit SetRenderState setzt oder ist diese Funktion nur für die Fixed Pipe?
2. Kommt man an die x-y Koordinaten eines Pixels?

Viel Spass beim erfoschen.

Re: [Projekt] Mandelbrot

Verfasst: 27.11.2010, 14:18
von Krishty
Funktioniert und sieht hübsch aus.
Jiba hat geschrieben:Mal zwei Fragen zu Pixelshader (HLSL):
1. Kommt man an die States die man mit SetRenderState setzt oder ist diese Funktion nur für die Fixed Pipe?
Garnicht. Auch in anderen APIs kommst du nicht an die States ran, weil sie da sind um das zu steuern, was mit Shadern nicht programmierbar ist.
Jiba hat geschrieben:2. Kommt man an die x-y Koordinaten eines Pixels?
In D3D9 nur, wenn du ein Rechteck über den Bildschirm zeichnest und seinen Vertices ihre Positionen mit auf den Weg gibst, damit sie im Pixel-Shader interpoliert ankommen.

Shader vor 4.0 sind für Fraktalrenderer eigentlich völlig ungeeignet, weil dir nur 24-Bit-Rechenpräzision garantiert wird – dass, wie auf den Screenshots, was 32-Bit-Genaues rauskommt, ist schon ein Glücksfall. Erst ab Shader Model 4 (also Direct3D 10 oder höher) hat man volle 32-Bit-Gleitkommapräzision und kann, wie bei „echten“ Fraktalrenderern, quasi-unendliche Präzision durch eigene Gleitkommaklassen emulieren. Nur, falls du mit dem Gedanken spielst, das weiter zu verfolgen.

Als Übung ist es aber ganz nett, obwohl du mehr mit Texturen arbeiten solltest. Kein Shader, den du je schreibst, wird bloß eine mathematische Funktion ausführen sondern es wird immer darauf hinauslaufen, Texturen miteinander zu verrechnen und Vektoren miteinander zu transformieren.

Gruß, Ky

Re: [Projekt] Mandelbrot

Verfasst: 30.11.2010, 17:58
von Frekl
sieht ja echt gut aus :)
gute Arbeit...
Ist es eigentlich schwer bzw zeitaufwendig,
so ein, durch rekursive Funktionen enstandenes, Mandelbrot nachzuprogrammiern?
Ganz simpel mein ich, hab mich mit dem Thema noch nie so richtig beschäftigt

Re: [Projekt] Mandelbrot

Verfasst: 01.12.2010, 00:42
von Jiba
Hallo,

es ging eigendlich recht flott. Das drumherum hat am längsten Zeit gefressen. Also die Benutzereingabe, wie wähle ich hübsche Farben aus oder wie funktioniert HLSL.
Ich hatte es schonmal mit SDL und OpenGL 1 gemacht. Das war mir zu langsam, weil kein zoomen in echtzeit möglich war. In OpenGL kenn ich mich auch kaum aus um es zu optimieren. Und der Algorithmus ist in wikipedia sehr gut beschrieben.

Ich hab ungefähr 3 Abende gebraucht dafür.
1. Abend - Quick and Dirty den Algorithmus reingehackt
2. Abend - Auf Direct3D mit Pixelshader umgeschrieben
3. Abend - Steuerung, Farben und ein wenig Feinschliff

Der Shader wird vom Programm aus einer Datei geladen. Kannst ja an der Formel Experimentieren, wenn du lust hast.

zb ist auch folgender Code ganz hübsch.
Zneu=Zalt³+C statt Zneu=Zalt²+C

Code: Alles auswählen

COMPLEX Mandelbrot(COMPLEX c, float n)
{
    float i;
	COMPLEX Z = {0, 0};

	for(i=0; i<n; ++i)
	{
		Z = Add(Multiply(Z, Multiply(Z, Z)), c);
	}

	return Z;
}
Nur schade das recht schnell Genauigkeitgrenzen auftauchen.

Re: [Projekt] Mandelbrot

Verfasst: 01.12.2010, 16:35
von Slin
Sieht nett aus :)
Ich habe sowas auch mal gemacht. Nur wie hier ja schon festgestellt kommt man doch ziemlich schnell an die Grenzen der Präzision.