Seite 1 von 2

Mandelbort Menge / Apfelmänchen als OpenGL Shader

Verfasst: Sonntag 27. Januar 2008, 17:19
von veers
Ich habe heute etwas mit Pyglet experimentiert. Und dabei etwas Programmiert was ich schon lange einmal machen wollte - die Mandelbrot Menge auf der GPU visualisieren. Das ganze hat auch ziemlich toll geklappt. Auch bei 1680x1050 Pixel und bis zu 250 Iterationen pro Pixel komme ich noch auf 75 FPS (Das Limit meines 75 Herz Displays). Das ganze natürlich ohne CPU Last.

Screenshot:
Bild

Source:
http://29a.ch/mandelbrot/mandelbrot.py.txt

Voraussetzungen:
Python, Pyglet, OpenGL 2.0 kompatible Grafikkarte

Bedienung:
Source Code hat geschrieben: Usage:
You can move arround by dragging with the left mouse button
You can zoom in and out with your mouse wheel
You can toggle the fullscreen mode with the F key
You can toggle the fps display with the F1 key
Vielleicht ist die Shader Klasse ja auch noch für jemand anders nützlich.
Über Feedback würde ich mich freuen!

Gruss,
Jonas

Verfasst: Sonntag 27. Januar 2008, 19:08
von Y0Gi
Wow, sieht sehr klasse aus! Aber:

1) pyglet war bereits per easy_install bei mir installiert, wollte sich aber partout nicht importieren lassen (am PYTHONPATH lag es nicht). Den 'ZipImportError'(?) bin ich durch erneute Installation mittels '-Z' losgeworden, aber dann klappte der Import immer noch nicht.

Das Ei enthielt nur optimierten Bytecode - was ja nichts ungewöhnliches ist. Als ich dann '__init__.py', meckerte er nicht mehr über den generellen Import, aber zumindest darüber, dass er (wenig verwunderlich) den Rest nicht finden.

Ubuntu hat offenbar kein Paket für pyglet im Angebot, also habe ich es letztlich aus dem Source erstellt ("herkömmlich", ohne setuptools dabei zu nutzen) und dann lief's auch.

2) Beim Starten des Progamms begegnet mir ein weißes Fenster und eine ganze Menge von diesen hier:

Code: Alles auswählen

Mesa 7.0.3 implementation error: User called no-op dispatch function (an unsupported extension function?)
Please report at bugzilla.freedesktop.org
Any ideas?

Verfasst: Sonntag 27. Januar 2008, 19:20
von Craven
Y0Gi hat geschrieben:1) pyglet war bereits per easy_install bei mir installiert, wollte sich aber partout nicht importieren lassen (am PYTHONPATH lag es nicht).
Selbes Problem, anderes Betriebssystem: Windows.

Verfasst: Sonntag 27. Januar 2008, 20:21
von veers
Craven hat geschrieben:
Y0Gi hat geschrieben:1) pyglet war bereits per easy_install bei mir installiert, wollte sich aber partout nicht importieren lassen (am PYTHONPATH lag es nicht).
Selbes Problem, anderes Betriebssystem: Windows.
Ja, Pyglet hat sich auch bei mir nicht per Easyinstall installieren lassen. Warum auch immer.

Y0Gi,
Sieht aus als würden Shaderprogramme von deiner Grafikkarte/Treiber nicht unterstützt werden. Was verwendest du? Ich habe den Code nur mit Nvidia Karten getestet.

Verfasst: Sonntag 27. Januar 2008, 21:47
von HWK
Das sieht ganz toll aus. Aber was hast Du denn für einen Rechner? Ich komme über 10 FPS nur, wenn das Bild ziemlich schwarz ist.
MfG
HWK

Verfasst: Sonntag 27. Januar 2008, 21:55
von veers
HWK hat geschrieben:Das sieht ganz toll aus. Aber was hast Du denn für einen Rechner? Ich komme über 10 FPS nur, wenn das Bild ziemlich schwarz ist.
MfG
HWK
Die 60 FPS erreiche ich mit einer Geforce 8800GT. Der Rest dürfte nicht wirklich relevant sein. Was für eine Grafikkarte verwendest du denn?

Verfasst: Sonntag 27. Januar 2008, 22:09
von Y0Gi
In meinem Laptop steckt 'ne schäbige, alte ATI. Gut, viel erwartet hatte ich nicht, aber zumindest, dass es startet ;) Mit den Grafikkarten/-treibern ist das aber ja immer so eine Sache unter Linux, an der die Hersteller nicht unschuldig sind.

Naja, werd's bei Zeiten mal auf ner größeren Maschine testen. Sowas zu programmieren reizt mich jedenfalls sehr.

Verfasst: Montag 28. Januar 2008, 12:37
von skypa
Sieht sehr sehr nice aus, werds später ma testen mit meiner GeForce 8600 GS.

Mfg skypa

Verfasst: Montag 28. Januar 2008, 13:15
von Jan-Peer
Also bei mir läuft es gut (Gentoo & 8600 oder 6600 GS - zu faul nachzugucken). Muß allerdings als root ausgeführt werden.

... ich bin begeistert ...

Verfasst: Montag 28. Januar 2008, 14:01
von HWK
NVIDIA GeForce 7300 LE

Verfasst: Montag 28. Januar 2008, 14:45
von veers
HWK hat geschrieben:NVIDIA GeForce 7300 LE
Na gut, das ist auch nicht gerade eine schnelle Karte :)

Verfasst: Montag 28. Januar 2008, 20:27
von apollo13
Hmm hinundwieder bekomm ich beim F1-Tastendruck nen Absturz und folgende Meldung:
Floating point exception

Mehr, nicht...

Achja laufen tuts bei mir zwischen 15 und 50 (je nach Zoom) Frames auf nem Laptop mit ner Geforce Go 7700.
Auf jeden Fall steigt die GPU Temperatur an wenn es länger offen ist und man wild hin un her zoomt^^ Mal schaun bei 110 Grad sollte er runter schalten ;)

EDIT:// Keine Chance, der Lüfter schaltet bei 70° einen Deut höher und dann ist die Temperatur gleich wieder unten...

Verfasst: Montag 28. Januar 2008, 20:40
von veers
apollo13 hat geschrieben:Hmm hinundwieder bekomm ich beim F1-Tastendruck nen Absturz und folgende Meldung:
Floating point exception
Das kann ich mir nicht erklären. Kannst du mir mal einen Stacktrace zukommen lassen?

Verfasst: Mittwoch 30. Januar 2008, 12:33
von nkoehring
Also ich habe Pyglet vorhier nicht gekannt. Hab es spontan mal installiert (die entsprechende .msi unter Vista 64bit) und bekam folgenden Backtrace bei der Ausfuehrung deines Programmes:

Code: Alles auswählen

>D:\Programme\Python25\pythonw.exe -u "glslmandelbrot.py"
Traceback (most recent call last):
  File "glslmandelbrot.py", line 229, in <module>
    main()
  File "glslmandelbrot.py", line 226, in main
    MainWindow().run()
  File "glslmandelbrot.py", line 167, in __init__
    self.shader = Shader(vertex_shader, fragment_shader)
  File "glslmandelbrot.py", line 105, in __init__
    gl.GL_VERTEX_SHADER)
  File "glslmandelbrot.py", line 128, in create_shader
    raise ShaderException(message)
__main__.ShaderException: Vertex shader was successfully compiled to run on hardware.
 
>Exit code: 1
...also eine ShaderException die sagt, das es klappt O_o strange :roll:

Btw: Ich bin einer der rar gewordenen ATI-User. ATI HD2900XT

Verfasst: Mittwoch 30. Januar 2008, 14:07
von veers
In der Tat toll :)
Funktioniert es wenn du die Zeile 128 durch ein pass ersetzt?

Verfasst: Mittwoch 30. Januar 2008, 16:21
von nkoehring
veers hat geschrieben:In der Tat toll :)
Funktioniert es wenn du die Zeile 128 durch ein pass ersetzt?
Nein, dann bekomm ich folgendes:

Code: Alles auswählen

>D:\Programme\Python25\pythonw.exe -u "glslmandelbrot.py"
Traceback (most recent call last):
  File "glslmandelbrot.py", line 229, in <module>
    main()
  File "glslmandelbrot.py", line 226, in main
    MainWindow().run()
  File "glslmandelbrot.py", line 167, in __init__
    self.shader = Shader(vertex_shader, fragment_shader)
  File "glslmandelbrot.py", line 113, in __init__
    raise ShaderException(message)
__main__.ShaderException: Fragment shader(s) linked, vertex shader(s) linked. 

>Exit code: 1
...lasse ich auch diese Exception passieren laeuft es auch bei mir :)
Ich kann allerdings nicht sehr weit zoomen... Es wird schnell pixelig.
Ansonsten hab ich direkt nach dem Start zw 45 und 50 F/s. bei den Anfaengen der Pixeligkeit sind es dann so 25-30. Dabei bleibt es dann in etwa.

Verfasst: Mittwoch 30. Januar 2008, 17:50
von veers
Was heisst wenig? Bei mir liegen so ~15 mal drin. Danach ist die Präzision der Floats am Ende. Doubles werden leider nicht unterstützt. Das mit der ShaderException werde ich fixen. Ich brauche wohl einen anderen Weg um herauszufinden ob ein Fehler aufgetreten ist oder nicht. Ich hoffe du wirst es dann noch einmal testen!

Gruss,
Jonas

Verfasst: Mittwoch 30. Januar 2008, 20:01
von apollo13
veers hat geschrieben:
apollo13 hat geschrieben:Hmm hinundwieder bekomm ich beim F1-Tastendruck nen Absturz und folgende Meldung:
Floating point exception
Das kann ich mir nicht erklären. Kannst du mir mal einen Stacktrace zukommen lassen?
Wenn du mit Stacktrace den normalen Backtrace meinst: Gibt es leider nicht, es kommt nur Floating point exception....
Falls du was anderes damit meinst, sag mir wie ich ihn bekomm...

EDIT:
auftreten tut das Problem scheinbar in diesen beiden Zeilen (eher erste..., also direkt in der if abfrage):

Code: Alles auswählen

            if self.show_fps:
                self.fps.draw()
Möglicherweise, wenn das Programm gestartet wird und die Maus außerhalb ist, das Programm selbst aber Fokus hat...

Verfasst: Sonntag 10. Februar 2008, 12:45
von Jan-Peer
Hallo,

Ich brauch' mal einen kleinen Tipp: Ich würde die Darstellung gerne etwas anders einfärben - mehr in Richtung warme Farben. Wo muß ich da ansetzen?

Verfasst: Sonntag 10. Februar 2008, 18:41
von veers
Jan-Peer hat geschrieben:Hallo,

Ich brauch' mal einen kleinen Tipp: Ich würde die Darstellung gerne etwas anders einfärben - mehr in Richtung warme Farben. Wo muß ich da ansetzen?

Code: Alles auswählen

    gl_FragColor = vec4 (iter, iter, sin(iter*2.00), 1.0);
Hi Jan,
Da wird die Farbe bestimmt ;)

Gruss,
Jonas :)