!! ~OpenGL

http://de.wikipedia.org/wiki/OpenGL

Grundsätzlich muss OpenGL vom X-Server unterstätzt werden. Um dies zu testen, benutzt man das Programm '''glxinfo'''. Dies hat bei mir bisher immer Version 1.2 (oder in einem Fall gar kein OpenGL) ausgegeben.

== verschiedene Versionen ==

: ''Auf der Seite JavaGrafik gibt es eine Diskussion, was einzelne Versionen von OpenGL bedeuten und wann man sie benutzen kann. Da mir die Antwort auf diese Fragen immer noch nicht ganz klar ist, erbitte ich hier (oder auf JavaGrafik) Anmerkungen geneigter, wissender Leser. ;-)''

'''OpenGL 1.1''' ist schon recht alt und hat Befehle wie z.B. "glBindTexture" eingeführt. Mit diesen wurde es möglich Texturen vorzuladen und dann wenn man sie benötigt schnell aktiv zu schalten. Mit "glTexImage2D" kann man eine Bitmap als Textur einstellen - hierbei werden aber alle Daten des Bildes an die Grafikkarte gesendet und dies pro Frame immer wieder zu tun dauert einfach zu lange.

'''OpenGL 1.2''' kam unter anderem mit dem Support für dreidimensionale Texturen. Ihr kennt dies vielleicht von Povray - dort ist z.B. die Holztextur dreidimensional. Dies bedeuet, dass für ein Vector (x,y,z) eindeutig ein Farbwert ermittelt werden kann. Da dreidimensionale Texturen enorm viel Speicher fressen werden sie nicht viel verwendet - doch aufgrund der Fähigkeit mit ihnen besondere Effekte zu erzeugen und des wachsenden Grafikkartenspeichers werden sie zunehmend attraktiver. 

'''OpenGL 1.3''' brachte Multitexturing - dies ist ein wichtiges Feature wenn man z.B. Lightmaps benutzen möchte. Dies bedeutet dass eine Textur eine Wand enthalten kann und die andere Textur einen weissen Punkt der nach aussen dunkler wird. Kombiniert man beide übereinander sieht es so aus als würde die Wand von einem Scheinwerfer angestrahlt.

'''OpenGL 1.4''' enthält erweiterte Funktionen für Nebel - und man kann Depth-Texturen definieren. Diese sind soweit ich weiß für Shadowmaps nützlich.

'''OpenGL 2.0''' bringt nun auch Support für Vertex- und Fragmentprogramme mit. Dies sind Programme die auf der Grafikkarte laufen können und entweder die Geometrie selbst (Vertices) oder die erzeugten Pixel (Fragmente) verändern können. Mit diesen Techniken werden z.B. Wasseroberflächen, Spiegelungen, Pixelbasierte Beleuchtung und inzwischen auch das Skinning (animieren von Charakteren über die Knochen) realisiert.

Als absolute Grundlage für ein Spiel mit der OpenGL würde ich die Version 1.3 sehen - denn hier kann man die Beleuchtung schon richtig gut implementieren und diese trägt enorm zu der Gesamtstimmung eines Spiels bei. Es ist aber kein Problem das Spiel später auf einem Rechner laufen zu lassen der nur eine ältere OpenGL-Version hat - es genügt im Programm auf "#define GL_VERSION_1_3   1" abzufragen. Wie das in JOGL realisiert ist, weiß ich allerdings nicht. --StefanGaffga

: Danke für die Info :-) Trotzdem verstehe ich eins noch nicht ganz. Wenn meine Grafikkarte nun z.B. 1.2 kann, heisst das dann, daß ich neuere Befehle gar nicht benutzen kann oder daß die dann langsamer (weil in Software) sind? Wenn ersteres stimmt, müsste ich dann also sozusagen eine extra-Version meines Programmes für jede GL-Version schreiben, diese jeweils abfragen und dann die spezielle Version ausführen??? Oder kann ich sagen "egal ob langsam, mach das mal so!"???

:: Ich kann jetzt nur aus der Sicht von C/C++ sprechen: In der Regel sucht man sich eine Mindest-Versionsnummer heraus aus die man unterstützen möchte. Die vorhandenen Befehle dieser Version verwendet man dann einfach und beendet das Programm direkt zu Beginn, falls die geforderte OpenGL-Version nicht verfügbar ist. Man kann jedoch hingehen und auch ganz neue Befehle der OpenGL verwenden und abwärtskompatibel bleiben - diese Funktionen dürfen dann aber nicht einfach verwendet werden. Von diese Funktionen lädt man über "glXGetProcAddress()" dynamisch zur Laufzeit den Pointer und verwendet sie falls als Pointer nicht NULL zurückgegeben wurde. In letzterem Fall ist das Spiel dann dafür verantwortlich etwas anderes zu unternehmen um die gewünschte Funktionalität abzubilden. Bei JOGL ist es so, dass dort eine OpenGL 1.4 Pflicht ist - denn die Java-Klassen sind ja bereits fest definiert und können sich nicht ändern je nach zugrundliegender OpenGL-Implementierung. 
Mit Software-Rendering habe ich mich nicht wirklich beschäftigt.
Es ist aber kein Problem ein Programm zu schreiben das OpenGL 1.2 haben MUSS, aber auch die evtl. verfügbaren Features der 1.3 und 1.4 nutzen KANN falls verfügbar. --StefanGaffga

== Programmierung von OpenGL ==

Auf http://opengl.org gibt es einige Doku zum Thema. Darüberhinaus kann man das [NeHe-Tutorial|http://nehe.gamedev.net] empfehlen.

* [Programming Guide für OGL 1.1 (Red Book)|http://www.rush3d.com/reference/opengl-redbook-1.1]
* [Reference Manual für OGL 1.0 (Blue Book)|http://www.rush3d.com/reference/opengl-bluebook-1.0]

=== OpenGL in Java ===

Auf der Seite JavaGrafik stehen einige Bemerkungen hierzu.

=== OpenGL unter Python ===

* [Python OpenGL|http://einstein.informatik.uni-oldenburg.de/forschung/py_ogl/] in der Uni Oldenburg
** [kurzes Tutorial|http://einstein.informatik.uni-oldenburg.de/forschung/py_ogl/python_ogl.pdf] (Handbuch)
** [Leuchtturmtest Demo|http://einstein.informatik.uni-oldenburg.de/forschung/py_ogl/archiv/lighthouse270206.zip] (begleitend zum Handbuch)
** [Geschwindigkeitstest|http://einstein.informatik.uni-oldenburg.de/forschung/py_ogl/archiv/cones_bench.zip] verschiedener Darstellungsformen
** [Möblieren mit OpenGL|http://einstein.informatik.uni-oldenburg.de/forschung/py_ogl/archiv/furnishing.tgz] - siehe Anmerkungen
** [PyOpenGL-Dokumentation|http://pyopengl.sourceforge.net/documentation/]
** [Texturen erstellen mit Gimp|http://www.gimps.de/gimp/textur-muster/]
** [Crystal Space|http://www.crystalspace3d.org/tikiwiki/]
** [Panda3D|http://www.panda3d.org/]
** [OOMadness|http://home.gna.org/oomadness/en/index.html]