Ist das Lernen von OpenGL 2.1 heute nutzlos?

44

Ich bin neu in der 3D OpenGL / DirectX-Welt und habe herausgefunden, dass die OpenGL 4.1- und GLSL-Spezifikationen erst heute veröffentlicht wurden.

Ein Freund von mir gab mir das Rote Buch für OGL v2.1, aber soweit ich es gelesen habe, unterscheiden sich 3.x und 4.x stark von 2.x und viele Dinge sind mittlerweile veraltet.

Kann ich mit dem Buch die Grundlagen von 3D und CG erlernen oder ist es besser, eine neuere Version zu finden?

Reefaktor
quelle
10
Ich weiß nicht viel über OpenGL / DirectX, aber ich spiele gerne auf einem Computer, der älter als ein Jahr ist. Ich könnte mir vorstellen, dass Ihr Wissen über OpenGL vor 3.x meinen Spielgewohnheiten zuträglich ist. Nur ein Gedanke.
Simurr
Mir gefällt nicht, wie diese Frage formuliert ist. Kannst du ein Spiel in OpenGL 2.1 machen ? Die Antwort: ein definitives Ja . Was meinst du dann mit nutzlos ? Können Sie die Grundlagen von 3D aus einem älteren Buch oder einer veralteten API lernen? Wieder ein definitives Ja . Ist es der beste-beste-bessssssste Weg, es zu tun? Wahrscheinlich nicht .
Bobobobo

Antworten:

18

In Zeiten wie diesen gehe ich immer zum Steam Hardware Survey: http://store.steampowered.com/hwsurvey/ - Sie werden feststellen, dass die Marktdurchdringung von Systemen der DX10 / 11-Klasse bei fast 80% liegt. Dies entspricht im Großen und Ganzen GL3.3 oder höher. Diese 80% sind auf Vista / 7-Benutzer beschränkt - fügen Sie eine DX10 / 11-GPU mit XP hinzu, und Sie erreichen etwas mehr als 90%.

Wenn Sie bedenken, dass es sich hier um etwas mehr Hardcore-Gamer handelt, müssen Sie zunächst an Ihre Zielgruppe denken. Sind dies die Personen, die Sie ansprechen möchten? Wenden Sie sich stattdessen an Personen mit mehr Downlevel-Hardware? Was ist mit Intel-Grafik? Was ist mit Mac- und Linux-Benutzern? Dies sind alles Fragen, die Sie selbst beantworten müssen. Aus diesem Grund sind allgemeine Richtlinien die besten, die Sie bekommen werden.

Außerdem müssen Sie berücksichtigen, dass Sie, wenn Sie heute beginnen zu lernen, mit der Absicht, etwas zu versenden, einen Zeitraum von mindestens einem Jahr einhalten müssen, bevor Sie dort ankommen (es sei denn, wir sprechen davon) über wirklich triviale / einfache Fälle). Da der Aufwärtstrend der gfx-Funktionen anhält, erwarten wir, dass die GL3.3 + -Hardware bis dahin nahezu zu 100% genutzt wird.

Berücksichtigen Sie dann, dass Sie mit GL2.1 oder niedriger eine Menge altmodischen Unsinns lernen und verwenden werden, selbst wenn Sie sich auf die Shader- und VBO-Untergruppe von GL2.1 beschränken (GLSL-Versionen mit niedrigerem Level sind unangenehm in der Verwendung) , und Streaming-VBOs sind ohne GL_ARB_map_buffer_range so gut wie unbrauchbar. Mit GL3.3 + wurden viel bessere (und performantere) Methoden eingeführt, mit denen Sie die Hardware des Players besser ausnutzen können (und für die Sie dankbar sind) Sie dafür) und Sie werden mehr Zeit damit verbringen, produktiven Code zu schreiben, als eine API zu bekämpfen, die wirklich nicht mit Ihnen zusammenarbeiten möchte.

Und dann ist da noch die gefürchtete Fahrersituation. Die harte, aber wahre Tatsache ist, dass die GL-Treiber unter Windows in einem traurigen Zustand sind - NV-Support sollte sie nicht unterstützen, AMD sollte sie nicht unterstützen, und bei Intel müssen Sie sich wirklich auf die GL-Funktionalität beschränken, für die es welche gibt ein Äquivalent in D3D. Je neuer GL_VERSION ist, desto wahrscheinlicher ist es, dass Sie auf Treiberfehler stoßen, aber für GL3.3 sind die Dinge jetzt einigermaßen stabil.

Die Zusammenfassung ist also, dass ich in Abwesenheit anderer Informationen (Zielgruppe usw.) GL3.3 als Basis anvisieren würde (möglicherweise unter Einbeziehung der Funktionalität von höheren GL_VERSIONs, wo sie verfügbar ist und wo sie die Codebasis nicht stört zu viel), es sei denn, es gab einen sehr spezifischen und definitiv identifizierten Grund, einen niedrigeren Wert zu wählen (und ich möchte mir diesbezüglich absolut 100% sicher sein, anstatt eine vage Vorstellung von " aber was ist mit denen mit älterer Hardware " zu verwenden). Im letzteren Fall würde ich GL2.1 nicht unterschreiten und würde versuchen, selbst dann so viele 3.x-Funktionen wie möglich zu nutzen.

Maximus Minimus
quelle
Toller Punkt bei den Hardware-Statistiken GL3.3 ~ = DX10 / 11 und Steam.
Nate
Nur um diese Statistiken zu aktualisieren - DX10 / 11 GPU + Vista / 7 sind jetzt bei ~ 88%, fügen Sie weitere 4,38% für DX10 / 11 GPU + XP hinzu und Sie sehen ganz bequem über 90% Penetration. Die Aufnahme steigt viel schneller als ich erwartet hatte, als ich diesen ursprünglichen Beitrag gemacht habe.
Maximus Minimus
"GL3.3 + hat viel schönere (und performantere) Möglichkeiten für den Umgang mit vielen Dingen eingeführt" - Wie schlägt sich 3.2 im Vergleich? Mac-Benutzer erhalten noch keine 3.3. Ich habe angenommen, dass es fast dasselbe ist, aber ich möchte nicht zu viel annehmen.
michael.bartnett
38

Ich würde vorschlagen, bei der Schnittmenge von 2.1 und 3 zu bleiben. Es gibt immer noch eine Menge Hardware und Treiber, die nur OpenGL 2.1 unterstützen, aber die von OpenGL 3 Core empfohlenen Vorgehensweisen sind besser. Dieses Tutorial ist ein ziemlich guter Anfang (bringt OpenGL 2.0 ohne Funktionen bei, die in 3 nicht mehr unterstützt wurden).

Jake McArthur
quelle
3
+1 für das Joe Groff-Tutorial. Er führt Sie durch die gesamte Pipeline in Kapitel 2. Und jeder "Dienstprogramm" -Code, den er hinzufügt, besteht nur aus zwei Funktionen: eine zum Einlesen einer Datei (für GLSL) und eine zum Lesen von TGA-Bildern (und Sie könnten genauso gut eine andere verwenden Bildbibliothek oder schreiben Sie Ihren eigenen Bildlader, sobald Sie das Beispiel zum Laufen gebracht haben). Alles andere wird erklärt und ist Teil des Tutorials.
michael.bartnett
18

Ich würde sagen, es ist nicht nutzlos.

Warum? Nun, während der Rest der Welt OpenGL 3.x und 4.0 unterstützt, unterstützt Mac OS X immer noch nur OpenGL 2.1. Und OpenGL ES, das auf den meisten, wenn nicht allen tragbaren Plattformen verwendet wird, wird in allen Versionen weiterhin weitgehend unterstützt: 1.0, 1.1 und 2.0; die in etwa mit OpenGL 1.4, 1.5 und 2.1 vergleichbar sind.

Solange OpenGL ES 1.0 nicht vollständig von der Erdoberfläche verschwindet, ist es keine Verschwendung , OpenGL 2.x zu kennen.

Das heißt nicht, dass es keinen Wert hat, OpenGL 3.x oder 4.0 auf Plattformen zu verwenden, die dies unterstützen.

Update: Ab der Veröffentlichung von Mac OS X Lion (10.7) wird das OpenGL 3.2 Core-Profil jetzt auf dem Mac unterstützt. Diese Version setzt große Teile von OpenGL 1.x außer Kraft, um die API zu vereinfachen. Benutzer älterer Versionen von OS X (und niedrigerer Intel-Grafik) sind weiterhin auf OpenGL 2.0 und 2.1 beschränkt. Die Kenntnis von OpenGL 2.x ist jedoch nach wie vor nützlich und wird es noch einige Zeit bleiben.

greyfade
quelle
Snow Leopard unterstützt die meisten Erweiterungen von OpenGL 3 - sogar Geometrie-Shader.
Axel Gneiting
@Alex Die Unterstützung der meisten Erweiterungen bedeutet nicht, dass Core GL3 unterstützt wird. Und wir reden gerade über 3.x
Matias Valdenegro
@Axel Gneiting: Es ist einfach nicht dasselbe. Die meisten interessanten Funktionen von OpenGL 3.0+ sind nicht als Erweiterungen verfügbar. Es gibt eine große Anzahl von Kernänderungen.
Greyfade
12

Die Antwort von mh01 deckte einen Großteil der Grundlagen ab, daher füge ich ein paar Ergänzungen hinzu.

OpenGL ES

Lassen Sie uns über ES 2.0 vs. Desktop GL 2.1 vs. Desktop GL 3.3 sprechen. Für die Zwecke dieser Diskussion bezieht sich der Begriff "GL XY" auf die Desktop-OpenGL-Version XY, während sich "ES XY" auf OpenGL ES XY bezieht

Strukturell hat ES 2.0 mehr mit dem Kern-GL 3.3 gemeinsam als mit dem GL 2.1. GL 3.3 und ES 2.0 basieren beide auf Pure-Shadern. Sie sind beide rein pufferobjektbasiert. Usw. GL 2.1 hat viele Leistungs- und Codierungs-Traps, die es einfach machen würden, eine GL 2.1-App zu schreiben, die nicht einfach auf ES 2.0 portierbar wäre.

In Bezug auf die Syntax der Schattierungssprache ähnelt GLSL ES 1.00 (Zuordnung zu ES 2.0) jedoch eher GLSL von GL 2.1 als GL 3.3. Die Schlüsselwörter attributeund varyingsind in 3.3 core nicht vorhanden. Es verwendet inund out, was viel konsistenter und sinnvoller ist, wenn Sie mit mehr als 2 Shader-Stufen arbeiten (aus diesem Grund hat ES 3.0 die GL 3.3-Syntax übernommen).

Es ist einfach, die in GL 3.3 erlernten Konzepte auf ES 2.0 abzubilden . Wenn Sie also GL 3.3 für eines der verschiedenen Tools dazu lernen, werden Sie verstehen, wie man in der ES 2.0-Welt arbeitet. Sie müssen natürlich herausfinden, wo sich die Teilmenge befindet (dh die Dinge, die GL 3.3 nicht kann, die ES 2.0 nicht kann), aber die Konzepte sind dieselben.

Das Zuordnen der GLSL-Syntax, sodass Sie Shader von einem zum anderen kopieren können, ist etwas schwieriger. Aber in Wirklichkeit sind nur ein paar #Defines an den richtigen Stellen erforderlich. Außerdem verfügt GLSL 3.30 über einige ES-Kompatibilitätsfunktionen wie z. B. highp(die in Desktop-GLSL nichts bewirken).

Sie gewinnen also etwas für ES 2.0, wenn Sie von GL 3.3 anstatt von GL 2.1 lernen.

Nicol Bolas
quelle
8

Für Spiele, für die die größeren Änderungen an OpenGL nicht erforderlich sind, die nur in den neueren Versionen verfügbar sind, werden Sie durch die Verwendung von nur 3.x + auf eine NVIDIA 8-Serie und höher beschränkt (bei den anderen Grafikanbietern sind Sie sich nicht sicher, ob Sie das nachschlagen möchten). Wenn Sie also nicht die 3.x + -Funktionen verwenden, schaffen Sie nur ein künstliches Limit, um Leute mit älteren, aber leistungsstarken Grafikkarten daran zu hindern, Ihr Spiel zu spielen.

Aus diesem Grund empfehle ich dringend, die vorwärtskompatible Teilmenge und die neueren Versionen zu lernen und dann die niedrigste Version auszuwählen, in die Sie Ihr Spiel effektiv übertragen können. Du kannst

Ich werde auch als Antwort auf eine andere Frage bemerken, dass OpenGL: ES 2.0 die feste Funktionspipeline entfernt, so dass es mehr zu 3.0 als zu 2.1 äquivalent ist. Außerdem werden zur Laufzeit immer verschiedene Funktionen gemäß der unterstützten gl-Version unterstützt.

jsimmons
quelle
4

Ich würde sagen, es ist sicher, OpenGL mit Ihrem Red Book zu lernen. Ignorieren Sie einfach die Dinge, die in den neueren Versionen veraltet sind (wie glBegin (), glEnd () - verwenden Sie stattdessen VBOs). Die meisten Funktionen in den neueren Versionen waren bereits zuvor über Erweiterungen verfügbar.

thbusch
quelle
4

Ich bin größtenteils mit thbusch einverstanden. Aber ich würde die veralteten APIs nicht völlig ignorieren: Es gibt immer noch zu viel Code, der sie verwendet. Ich würde ihnen jedoch viel weniger Aufmerksamkeit schenken. Es macht beispielsweise keinen Sinn, glBegin (), glEnd () gründlich genug zu lernen, um damit eigenen Code zu schreiben. Aber Sie sollten sie erkennen, wenn Sie sie sehen, und eine Vorstellung davon haben, was sie tun.

Es lohnt sich immer noch, das gesamte Rote Buch mindestens einmal durchzulesen, auch wenn Sie nicht den Beispielcode erstellen und Übungen zu Funktionen ausführen, die in OpenGL 3.x nicht mehr verfügbar sind.

user1800
quelle
3

Die kurze Antwort:

Nein. Das Erlernen von OpenGL 2.1 ist auch heute noch eine gute Idee, solange Sie die "guten Teile" lernen.

Die lange Antwort:

OpenGL kann im Wesentlichen in zwei Teile unterteilt werden: "Die guten Teile" und "Legacy-Funktionen".

Ehrlich gesagt sehe ich keinen großen Vorteil darin, Legacy-Funktionen (die "feste Funktion") zu lernen. Ein wesentlicher Teil von OpenGL 2.1 (die guten Teile) ist jedoch noch heute mit relativ geringen Änderungen verfügbar.

Daher kann das Erlernen einiger Teile von OpenGL 2.1 von Vorteil sein. Insbesondere OpenGL ES 2 ist heutzutage sehr beliebt, und ES 2 ist meistens (aber nicht genau) eine Teilmenge von OpenGL 2.1. Für die 3D-Programmierung in Smartphones ist OpenGL ES 2 ein Muss.

Was ist also "gut"? Im Wesentlichen alles, was sich in OpenGL 3.x "Kernprofil" (im Gegensatz zu "Kompatibilitätsprofil") und / oder in OpenGL ES 2 befindet.

  • Vertex- und Fragment-Shader: Lernen Sie sie
  • Texturen: Immer noch gut.
  • Matrizen: Zu wissen, wie sie funktionieren, ist von Vorteil, aber solche glLoadIdentityFunktionen sind veraltet und sollten vermieden werden
  • Licht: Es ist nützlich zu wissen, wie Licht in Computergrafiken simuliert werden kann, aber auch glLightfvandere Lichtfunktionen mit fester Funktion sollten vermieden werden.
  • Array-Puffer: Gut
  • glBegin, glVertex, glColor, glEnd: Vermeiden sie. Könnte gut für schnelles Experimentieren sein, aber es gibt andere bessere Möglichkeiten, das Gleiche zu tun.
  • Listen anzeigen: Vermeiden

Die Frage, in der ich diese Antwort ursprünglich gepostet habe, stellte sich als Duplikat heraus. Deshalb veröffentliche ich sie hier erneut.

Luiscubal
quelle
1

Ich glaube nicht, dass es eine schlechte Idee ist. Viele GL-Konzepte erstrecken sich über alle Versionen von OpenGL und helfen Ihnen letztendlich immer noch. Ich habe eine Reihe von OpenGL-Büchern von vor 10 Jahren, die noch heute helfen. Ich würde sagen, wenn Sie neu in OpenGL sind und es einige bessere Bücher gibt, die älter sind, werden Sie viel lernen und der Code sollte immer noch funktionieren. Das meiste von OpenGL ist abwärtskompatibel (glaube ich).

Mungoid
quelle
1

Ich rate, dass Sie zuerst die modernen Sachen lernen und einfach so tun, als gäbe es die alten Sachen erst, wenn Sie sie brauchen.

Das veraltete Zeug kann in einigen Fällen nützlich sein, zum Beispiel, wenn Sie versuchen, auf etwas zu programmieren, das nur OpenGL 1.5 oder älter unterstützt (auf älteren beschissenen Netbooks und älteren MacOS-Systemen), OpenGL ES 1.x (die älteren iPhones) und Android vor 1.6) oder OpenGL SC (The Saftey Critical subset, wenn Sie gerade ein Display für Jet Fighter programmieren). Minecraft zum Beispiel ist gegen OpenGL 1.3 gebaut, so dass es wirklich alte Hardware unterstützen kann (aber auch das hat eine 'erweiterte' Option).

Es kann auch nützlich sein, wenn Sie nur Pixel auf den Bildschirm bringen möchten und es nicht wichtig ist, es richtig zu machen.

Es ist nützlich, sich beim Lernen auf einige der Funktionen zu verlassen, die OpenGL standardmäßig ausführt, z. B. das Einrichten eines Ansichtsfensters von -1,0 bis 1,0 und das Rendern ohne Shader. Auf diese Weise können Sie lernen, ohne alles auf einmal erledigen zu müssen.

Ansonsten sollte es nach Möglichkeit übersprungen werden.

Ich schlage vor, meine Antworten hier und hier zu lesen, um weitere Informationen zu erhalten.

David C. Bishop
quelle