FAQ: Modernes OpenGL mit OpenGL 3.x



  • Du willst also OpenGL lernen? Und du willst nicht mehr die alten Sachen lernen wie die Fixed Pipeline und glBegin und glEnd?
    Dann bist du hier richtig.

    Generell zu OpenGL

    OpenGL an sich ist keine SDK oder Library die man runterladen kann. Es ist nur eine Spezifikation. Umsetzen tun diese Hersteller von Betriebssystemen und Grafikkarten. Leider hat Microsoft verständlicherweise kein Interesse daran, OpenGL groß zu unterstützen, deswegen ist in Windows nur Support für OpenGL 1.1 vorhanden.
    Aber das ist kein Beinbruch. Da es nur eine Spezifikation ist, ist auch festgelegt, dass Funktionen aus den DLL geladen werden können. Dazu gibt es auf Windows die Funktion wglGetProcAdress. Damit kann man auf modernen Systemen die Funktionsadressen direkt aus den Treibern laden.
    Das muss man aber nicht unbedingt selber machen. Hierfür gibts eine Library, die sich GL3w nennt. Diese kann man ganz einfach in die eigene Anwendung einbinden und muss nach erfolgreicher Erzeugung eines Context nur einmal gl3wInit() aufrufen. Danach stehen alle Extensions und Core-Funktionen zur Verfügung, sofern vorhanden. Auch einen einfachen Test lässt GL3w zu, ob diese Anwendungen vorhanden sind, mittels gl3wIsSupported. Die installation ist einfach: Man lädt sich das Pythonscript von github herunter und führt es aus. Dabei werden 2 Header erstellt die eingebunden werden müssen und eine .c Datei die man mit dem Projekt mitkompiliert. Man sollte GL/GL.h dann nicht am besten gar nicht mehr einbinden.

    Verfügbarkeit von OpenGL 3

    OpenGL 3 ist auf Grafikkarten verfügbar, die DirectX 10 unterstützen und die Treiber entsprechend aktualisiert sind.
    Das dürften bei der NVIDIA alle Karten ab 8xxx sein und bei ATI ab der HD2xxxx Serie.

    Unterschied zu OpenGL 2.x

    Der größte Unterschied ist, dass man auf OpenGL 3 keine fixed Functions mehr hat. Sprich, alles was irgendwie mit Matrizen zu tun hatte, ist, neben einigen anderen Dingen, rausgeflogen.
    Moment, wirklich alles?
    Ja.
    Jetzt denkt man sich natürlich, wie man das jetzt alles selber programmieren soll. Muss man natürlich nicht. Hierfür gibts glm, eine Mathematik Bibliothek die gegen den GLSL-Spec (Shadersprache von OpenGL) geschrieben wurde und direkt auf OpenGL designed wurde. Diese ersetzt die fixed Functions und man kann die Matrizen und Vectoren sehr einfach an die Shader senden (mittels glm::value_ptr hat man Zugriff auf das unterliegende Array).

    OpenGL 3 lernen

    Es gibt bisher sehr wenige Anlaufstellen dafür, leider.
    Ein Buch sei empfohlen, die OpenGL Superbible in der 5ten Ausgabe.
    Online Tutorial: http://arcsynthesis.org/gltut/
    OpenGL Wiki: http://www.opengl.org/wiki/Main_Page
    Vor allem: http://www.opengl.org/wiki/Getting_started
    Auch eine Suche im Forum auf http://OpenGL.org kann fruchtbar sein.
    Code Beispiele: http://nopper.tv/opengl.html

    Es sei auch noch das DelphiGL Wiki erwähnt. Dort ist der meiste Code zwar in Delphi, aber wer C++ kennt, sollte auch mit dem DelphiCode klar kommen. Dieser ist gut lesbar. Ausserdem heissen die Funktionen in C++ genauso wie in Delphi. Vor allem aber gibts dort für die meisten Befehle eine deutsche Seite die diesen Befehl erläutert.

    Der Context von OpenGL 3

    Wer eventuell schonmal mit OpenGL hantiert hat, weiss, dass OpenGL immer einen Canvas bzw speziellen Context mit einem geeigneten Pixelformat braucht.
    Eine generelle Anleitung gibt es hier:
    http://www.opengl.org/wiki/Creating_an_OpenGL_Context

    Tutorial mit SourceCode für Windows:
    http://www.dhpoware.com/demos/gl3ContextCreation.html

    Tutorial mit Source Code für XWindow:
    http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)

    Mac-User sollten hier vorbeischauen:
    http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_intro/opengl_intro.html

    Ich empfehle jedoch, entweder SDL 1.3 oder Freeglut am Anfang zu verwenden. SFML 2 kann zwar auch einen 3.x Context erzeugen, aber man kann keinen Core-Context erzeugen, welcher nötig ist um alle veralteten Funktionen auszusperren. Zumindest geht das nicht ohne Hilfsmittel. Ich hoffe ja stark darauf, dass das sehr bald geändert wird, da SFML ansonsten toll ist.

    Wie man einen Context mit SDL 1.3 erstellt, habe ich bereits vor einiger Zeit in einem Blog erklärt.

    gDebugger

    Das wohl mächtigste, kostenlose OpenGL Tool das es gibt, zum kostenlosen Download hier:
    http://www.gremedy.com/

    Damit kann man die eigene Anwendung debuggen und sich Texturen, Buffer und sogar die Shader ansehen und auch live korrigieren. Einen Debug Build des Programmes vorrausgesetzt.
    Vor allem aber kann das Tool auf veraltete Funktionen hinweisen, was vor allem am Anfang eine große Hilfe sein kann.

    Das ist eine grobe Übersicht für Leute die damit anfangen wollen. Ich bin mir sicher, es gibt noch mehr "cooles Zeug" da draussen.
    Wenn ihr was kennt, immer her damit.

    Dokumentation

    Die Funktionen, welche den Core von OpenGL 3 darstellen, findet man samt Dokumentation hier:
    http://www.opengl.org/sdk/docs/man3/



  • Update: Referenz auf GLew entfernt und durch GL3w ersetzt.



  • 👍

    Ich finde noch folgendes "Tutorial" (leider nicht sehr vollständig) gut: http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Table-of-Contents.html

    und glslDevil (ein Shader-Debugger) ist vermutlich auch ganz interessant:
    http://cumbia.informatik.uni-stuttgart.de/glsldevil/index.html

    Wenn man an WebGL interessiert ist, dann sind folgende Links noch zu empfehlen:

    * Spezifikation: http://www.khronos.org/webgl/
    * Mozilla Dev Network (Tutorials, Beispiele, etc.): https://developer.mozilla.org/en/WebGL
    * WebGL Inspector (gDEBugger inspirierter WebGL Debugger): http://benvanik.github.com/WebGL-Inspector/



  • Gut gemacht 👍
    Ist GL3W plattformunabhängig (ich glaube schon aber bin mir nicht sicher)? Und kennst du ein Tut, wo man lernen kann, wie man einen Rendercontext auf einem Mac oder einem Linux machen kann?



  • edit:
    Wer suchet der findet 😃

    Und ja, GL3w ist XPlatform. Bzw es ist so, dass xgl/wgl Funktionen gar nicht vorhanden sind. Die muss man selber laden. Aber das ist das kleinste Problem.
    Besser als GLew ist es aber alle mal.



  • Hab mich mit GL3 noch nicht beschäftigt, aber wenn das ganze fixed function Zeug raus ist, ist GL3 dann noch abwärtskompartibel? Wird OpenGL ❤ Code vom Treiber irgendwie übersetzt?



  • Ja. Du kannst 3 verschiedene Context erzeugen:

    Compabilityy
    Core
    Forward Compatible

    Die Namen dürften selbst erklärend sein.



  • EOutOfResources schrieb:

    kennst du ein Tut, wo man lernen kann, wie man einen Rendercontext auf einem Mac oder einem Linux machen kann?

    Nahezu genauso wie mit Windows nur dass das Fenster unter Linux eben per X11-Api erzeugt wird.
    Schau Dir mal die ersten Nehe-Beispiele an, da gibt's doch Downloads fuer alle moeglichen Plattformen...



  • hellihjb schrieb:

    EOutOfResources schrieb:

    kennst du ein Tut, wo man lernen kann, wie man einen Rendercontext auf einem Mac oder einem Linux machen kann?

    Nahezu genauso wie mit Windows nur dass das Fenster unter Linux eben per X11-Api erzeugt wird.
    Schau Dir mal die ersten Nehe-Beispiele an, da gibt's doch Downloads fuer alle moeglichen Plattformen...

    Die Context Erzeugung ist bei OpenGL3 leicht anders. Nehe ist veraltet leider.



  • Besser als GLew ist es aber alle mal.

    Was ist so schlecht an Glew?



  • Frau Holle schrieb:

    Besser als GLew ist es aber alle mal.

    Was ist so schlecht an Glew?

    Es fehlen #defines, es erzeugt Warnungen nach der Context-Erzeugung.



  • Und glew funktioniert nur mit dem Compatibility-Modus, da es intern glGetString(GL_EXTENSIONS) verwendet, um die unterstützten Extensions rauszufinden. Dieser spezifische glGetString()-Aufruf ist als veraltet markiert (nicht glGetString() selbst). Richtig wärs, glGetStringi() zu verwenden.

    Im Übrigen kann man auch http://www.glfw.org/ als Alternative zu SDL 1.3 einsetzen; GLFW 2.7 unterstützt auch OpenGL 3.x Contexterzeugung.



  • Es funktioniert schon mit einem Core-Context. Allerdings kommt wie gesagt die Warnung. Die Treiber sind da sehr kulant was glGetString angeht. Aber es sind auch Funktionen falsch benannt. So haben alle glFramebuffer-Funktionen noch das EXT hinten dran, was einfach falsch ist. Es ist im Core. Erbsenzählerei? Vielleicht. Aber wenn sich das Ding nicht an Standards hält, dann is das ein Problem.



  • Mir ist das ganze Ding um die Ohren geflogen, weil glGetString(GL_EXTENSIONS) einen Nullpointer zurückliefert. Ich verwende die 270.41.06 NVidiatreiber, und ein Forward Compatible Context.
    Oh, und ein Nachteil hat gl3w: da die S3TC/DXT-Formate nie in den Kern aufgenommen wurden, sind sie nicht #definiert, das muss man selbst nachziehen. Sind aber nur 4 Defines, was das ganze leicht fixbar macht.



  • 4 defines sind nicht wild. Die x/wgl Funktionen fehlen auch. Allerdings ist es die einzig wirklich brauchbare OpenGL3 Lib für diesen Zweck atm.



  • Die x/wgl-Funktionen sind idR aber eher nur im Sourcecode von Libraries wie SDL und GLFW brauchbar. Direkt verwendet man sie kaum, am ehesten für PBuffer zB.



  • Soll der Thread hier eig. gepinnt oder in die Spiele-FAQ verschoben werden? Ich kann's zwar selbst nicht machen, würd aber dann 'nen Mod/Admin anhauen 🙂
    Wär ja schade, wenn er untergehen würde.



  • GPC schrieb:

    Soll der Thread hier eig. gepinnt oder in die Spiele-FAQ verschoben werden? Ich kann's zwar selbst nicht machen, würd aber dann 'nen Mod/Admin anhauen 🙂
    Wär ja schade, wenn er untergehen würde.

    Auf jeden Fall.
    Ich hatte diesen Beitrag vor einiger Zeit entdeckt, aber keine Zeit gehabt mich damit zu beschäftigen. Jetzt musste ich schon danach suchen.
    (Und ich wusste den Titel nicht mehr)



  • GPC schrieb:

    Soll der Thread hier eig. gepinnt oder in die Spiele-FAQ verschoben werden? Ich kann's zwar selbst nicht machen, würd aber dann 'nen Mod/Admin anhauen 🙂
    Wär ja schade, wenn er untergehen würde.

    Bitte nur pinnen, denn OpenGL hat ja nicht zwangsläufig etwas mit Spielen zu tun.

    OpenGL kann man auch ganz gut für ernsthafte 3d Visualisierungen gebrauchen und dann ist das anpinnen im Forum Grafikprogrammierung schon richtig und Spiele-FAQ eher fehl am Platz.


  • Mod

    ins FAQ zu verschieben ist eher eine bestraffung fuer einen thread, mir scheint es als ob dort seltener geschaut wird als das leute hier die suche verwenden.

    sticki fuer die threads, wie damals fuer den guten terrain rendering thread usw. will ich eher nicht vergeben, weil es die ersten x-zeilen mit selten gelesenem zeug "zumuellt" (wenn ich das hier sticki mache, muesste ich der fairheit halber sehr viele andere threads sticky machen).

    ich werde einen thread sticki machen mit indices die auf sowas wie das hier verlinken.


Log in to reply