Ich stimme den obigen Büchern mit ein paar Anmerkungen zu:
Die 8. OpenGL-Programmieranleitung ist erschienen und wurde für modernes OpenGL 4.3 überarbeitet.
Die SuperBible 5th Edition bietet Ihnen zwar eine Krückenbibliothek zum Einstieg, aber wenn Sie das Buch durcharbeiten, implementieren Sie die Funktionalität dieser Bibliothek erneut, sodass Sie am Ende des Kurses bereits über umfassende Kenntnisse verfügen sollten. Ich empfehle außerdem dringend, OpenGL-Inhalte in etwas zu packen, wenn Sie eine objektorientierte Sprache verwenden. Ich arbeite zum Spaß an meiner eigenen Bibliothek, was der richtige Weg zu sein scheint. Ich implementiere sie selbst. Ich verstehe alle Vor- und Nachteile und muss nur die Teile einfügen, die ich tatsächlich benutze. Außerdem können Sie einige Dinge, wie das Senden von Daten an Shader, abstrahieren (ist nicht viel schöner als shinyMaterial.setColor (Red)). Auf diese Weise können Sie auch einige Dinge zurückportieren, indem Sie ältere Alternativen bereitstellen. Es gibt auch Oglplus .
Das Hauptproblem beim Erlernen von modernem 'Kern'-OpenGL besteht darin, dass Sie Folgendes verstehen müssen, um eine grundlegende Pipeline zum Laufen zu bringen, selbst wenn Sie nur einen Würfel zeichnen möchten:
- Matrixoperationen (verwenden Sie GLM, wenn Sie mit C ++ arbeiten, benötigen Sie hier auch eine Version des MatrixStack OpenGL Unofficial SDK , oder meine einfache hier .)
- GLSL-Shader-Programmierung.
- Binden von Daten an Shader und Vertex-Pufferobjekte. Wenn Sie nur echtes Kernprofil lernen wollten, mussten alle gleichzeitig implementiert werden, und wenn etwas kaputt ist, sehen Sie einfach nichts und haben fast keine Ahnung, wo es schief gelaufen ist. Dies gilt auch nicht für grundlegende Beleuchtungsaufgaben (bei denen Sie zusätzlich zur Programmiersprache die Schattierungsalgorithmen erlernen müssen).
Sie müssen jedoch nicht mit dem Kernprofil im Deepend beginnen. Verwenden Sie zu Beginn einige der veralteten Funktionen, die von fast allem noch unterstützt werden, und modernisieren Sie sie dann.
Ein weiteres Problem ist, dass sich "modernes" OpenGL wirklich auf drei Dinge beziehen kann:
Die erste ist die programmierbare Shader-Pipeline im Gegensatz zur festen Funktionspipeline. Die wichtigsten 'modernen' Techniken waren möglich, seit OpenGL 2.0 im Jahr 2004 veröffentlicht wurde, als Shader eingeführt wurden (die Tutorials wurden nur nicht aktualisiert). Außerdem verfügte 1.5 über Vertex Buffer Objects, die ein weiterer Eckpfeiler des modernen OpenGL sind. Ein Problem ist, dass OpenGL-Entwickler selbst heute noch nicht einmal in der Lage sind, all das zu nutzen. Es gibt viele beschissene Netbooks mit Intel-Chipsätzen, die nur OpenGL 1.5 unterstützen, und Handys wie ältere iPhones / Android-Geräte, die nur diese unterstützen OpenGL ES 1.1. Der einzige wirkliche Unterschied zwischen diesem Zeug in OpenGL 2.0 und OpenGL 3.x / 4.x ist, dass es jetzt für das Kernprofil obligatorisch ist.
Modernes OpenGL könnte auch auf die neuen Inhalte in 3.x, 4.x verweisen. Dinge wie Vertex-Array-Objekte , Framebuffer-Objekte , Uniform-Buffer-Objekte / std140 , Layout-Qualifikatoren , GLSL-Subroutinenund so weiter. Viele von denen, die ich gefunden habe, machen es viel schöner, damit zu programmieren. Sie können auch subtil Ihre gesamten Motorleitungen ändern. Sie sind auch Dinge, die Sie mit ein wenig Aufwand zurückportieren können, indem Sie Hilfsfunktionen usw. erstellen. (Schreiben Sie beispielsweise ein generisches Shader-Manager-Objekt, mit dem Sie Uniformen festlegen können, wenn UBOs unterstützt werden.) Verwalten Sie andernfalls das manuelle Hochladen der Werte in Shader , vielleicht ein bisschen Shader rewriting, um es zu automatisieren). Dieses Zeug läuft nur auf neuen Grafikkarten. Netbooks, die es unterstützen, oder Videospielkonsolen der aktuellen Generation werden nicht angezeigt (sie verwenden ihre eigene Teilmenge von OpenGL, die OpenGL ES ähnelt). Die neuesten OSX haben nur 3.
Das ultramoderne nextgen OpenGL. OpenGL 4.3 wurde gerade veröffentlicht. Es enthält Compute-Shader, glMultiDrawElementsIndirect und Shader-Speicherpuffer. Dies ermöglicht eine grundlegend andere Pipeline, in der Sie alle Scheitelpunktdaten auf die GPU hochladen und dann mithilfe von Compute-Shadern berechnen, was gezeichnet werden soll, anstatt dies in Ihrem Programm zu tun. Leider ist dies sehr neu, so dass ich keine anständigen Tutorials dazu kenne. Schauen Sie sich den OpenGL 4.3-Test an, der einen Überblick darüber gibt, wie dies funktioniert. Als brandneues Produkt wird es zu diesem Zeitpunkt nirgendwo unterstützt (es sei denn, Sie verwenden eine neuere NVIDIA-Karte mit Betatreibern). Möglicherweise können Sie OpenCL / CUDA verwenden, um einige davon zu implementieren.
Ich würde glBegin, glEnd, glVertex *, glNormal *, glTextCoord *, glTranslate *, glRotate *, glLoadIdenity, glModelViewMatrix und so weiter überspringen. Beginnen Sie stattdessen mit dem Lernen von Vertex-Pufferobjekten ohne Shader. Versuchen Sie an dieser Stelle nicht 3D, sondern nur ein flaches weißes Dreieck, damit Sie nicht mit 3D-Operationen unter Verwendung von Matrizen arbeiten müssen (Sie müssen ja bald lernen, sie an Shader zu binden es macht keinen Sinn, auf alte Weise zu lernen). Als nächstes müssen Sie in den Shadern ändern, wie Ihre Vertex-Pufferobjekte gebunden werden, da Sie nun Vertex-Attribute verwenden möchten. Erfahren Sie, wie Sie ihnen Eigenschaften über Uniformen mitteilen. Lernen Sie dann die Matrixoperationen mit GLM, binden Sie die Matrizen an die Shader und bringen Sie 3D in Schwung. Sobald Sie das getan haben, ist es im Grunde nur fortgeschrittene Dinge wie Texturierung zu lernen,
Einige allgemeine moderne Online-OpenGL-Tutorials, die sich mit der Shader-Programmierpipeline befassen, von denen die meisten mit OpenGL 2.0+ funktionieren:
Für andere allgemeine Lernressourcen. OpenGL ES könnte ein guter Ausgangspunkt sein. OpenGL ES hat alle veralteten Inhalte entfernt. OpenGL 4.1 ist vollständig mit OpenGL ES kompatibel. Daher sollte es möglich sein, ein OpenGL ES-Programm zu verwenden und in OpenGL 4.1 auszuführen. Und die Grundprinzipien sind für beide gleich.
Einige Dinge zu beachten ist, dass OpenGL ES 3.0 soeben veröffentlicht wurde, aber da es neu ist, wird es noch keine Tutorials oder Hardware-Unterstützung geben. Es scheint keine wesentlichen grundlegenden Änderungen zu geben (wie der Unterschied zwischen fester Pipeline und Shader-Modell, den wir mit OpenGL ES 1.0-> 2.0 gesehen haben). Sie werden also wahrscheinlich kein veraltetes Zeug lernen.
Außerdem verwendet OpenGL ES häufig EGL, sodass Sie einen anderen Weg zum Öffnen eines Fensters erlernen müssen, der jedoch nicht zu schwierig sein sollte. Ansonsten gibt es ein paar OpenGL ES-Wrapper / Emulatoren, oder Sie können auf Android / iPhone lernen, wenn Sie einen haben (oder versuchen, deren Emulatoren zu verwenden).
Es gibt das Addison Wesley OpenGL ES 2.0-Programmierhandbuch, das dem Red Book entspricht.
Sie können sich auch Dinge ansehen, die sich auf GLSL-Shader konzentrieren, da hier die meisten modernen OpenGLs leben. Sie müssen nur sicherstellen, dass das, was Sie lernen, die „Klebeseite“ der OpenGL-Bindung abdeckt.
Lesen Sie die OpenGL Shading Language 2nd Edition (Orange Book).
Das OpenGL 4.0 Shading Language-Kochbuch behandelt einige der aktuellsten OpenGL-Themen, ist jedoch selbst kein umfassendes Tutorial. Es ist auf jeden Fall einen Blick wert, um sich mit den neuesten OpenGL-Praktiken in der Praxis vertraut zu machen, z. B. mit einheitlichen Pufferobjekten und GLSL-Subroutinen.
Schließlich können Sie sich WebGL ansehen, obwohl es in JavaScript etwas anders und viel schwieriger zu debuggen sein wird.