Welche OpenGL-Version (en) müssen Sie lernen und / oder verwenden?

16

Also, ich bin neu in OpenGL ... Ich habe allgemeine Kenntnisse im Programmieren von Spielen, aber wenig praktische Erfahrung.

Ich habe in verschiedenen Artikeln und Büchern nachgesehen und versucht, in OpenGL einzutauchen, aber ich fand die verschiedenen Versionen und die alte und die neue Art, Dinge zu verwirren, verwirrend.

Ich denke, meine erste Frage ist, ob jemand Zahlen über den Prozentsatz der Spieler kennt, die jede Version von OpenGL ausführen können. Wie ist der Marktanteil? 2.x, 3.x, 4.x ...

Ich habe mir die Anforderungen für Half Life 2 angesehen, da ich weiß, dass Valve es mit OpenGL aktualisiert hat, um es auf einem Mac auszuführen, und ich weiß, dass sie normalerweise versuchen, eine sehr breite Anwenderbasis zu erreichen, und sie sagen, mindestens GeForce 8 Series. Ich habe mir den 8800 GT auf der Nvidia-Website angesehen und dort die Unterstützung für OpenGL 2.1 aufgelistet. Was sich für mich uralt anhört, weil es bereits 4.x gibt. Ich habe nach einem Treiber für 8800GT gesucht, der 4.2 unterstützt! Eine kleine Diskrepanz, lol.

Ich habe auch gelesen, dass XP nur bis zu einer bestimmten Version unterstützt, dass OS X nur 3.2 unterstützt oder alle möglichen anderen Dinge. Insgesamt bin ich nur verwirrt, wie viel Unterstützung für verschiedene Versionen und welche Version zu lernen / zu verwenden ist.

Ich suche auch nach Lernressourcen. Meine bisherigen Suchergebnisse haben mich auf die OpenGL SuperBible aufmerksam gemacht. Die 4. Ausgabe hat großartige Rezensionen auf Amazon, lehrt aber 2.1. Die fünfte Ausgabe lehrt 3.3 und es gibt ein paar Dinge in den Rezensionen, die erwähnen, dass die vierte Ausgabe besser ist und dass die fünfte Ausgabe die neuen Funktionen nicht richtig lehrt oder so? Grundsätzlich sehe ich sogar innerhalb des Lernmaterials Diskrepanzen und weiß nicht einmal, wo ich anfangen soll.

Soweit ich weiß, hat 3.x eine völlig neue Arbeitsweise eingeführt, und ich habe in verschiedenen Artikeln und Rezensionen gelesen, dass Sie sich von veralteten Funktionen wie glBegin (), glEnd () und vielen Büchern fernhalten möchten und Tutorials, die ich gesehen habe, verwenden diese Methode. Ich habe gesehen, wie Leute sagten, dass die neue Art, Dinge zu tun, komplizierter ist, die alte jedoch schlecht

Ich persönlich weiß, dass ich noch viel zu lernen habe, aber ich interessiere mich für Tessellation. also denke ich, dass das auch dazu beiträgt, weil, soweit ich das verstehe, das nur in 4.x ist?

[Übrigens, mein Desktop unterstützt 4.2]

Kenmore
quelle
Diese Frage (zu Stack Overflow) scheint ein Duplikat zu sein: stackoverflow.com/questions/6823371/…
Anderson Green

Antworten:

21

Wenn Sie sich über die OpenGL-Abdeckung wundern, ist der Steam Hardware Survey ein guter Ausgangspunkt.

http://store.steampowered.com/hwsurvey?platform=pc

Leider scheint es momentan kaputt zu sein und es werden keine Statistiken für Videokarten angezeigt. : \

Ich habe auch gelesen, dass XP nur bis zu einer bestimmten Version unterstützt

DirectX 9 ist vergleichbar mit OpenGL 2.1, DirectX 10 mit OpenGL 3.0 und DirectX 11 mit OpenGL 4.0. Dies ist der Grund für die Verwirrung.

XP unterstützt alle Versionen von OpenGL, jedoch nicht DirectX 10 oder höher. So wollte Microsoft die Leute zwingen, auf Vista zu aktualisieren, aber es hat nicht sehr gut geklappt. OpenGL ist ein offener Standard. Solange Hersteller von Videokarten bereit sind, Treiber für XP zu produzieren, werden neuere Versionen von OpenGL unterstützt.

Soweit ich weiß, hat 3.x eine völlig neue Arbeitsweise eingeführt, und ich habe in verschiedenen Artikeln und Rezensionen gelesen, dass Sie sich von veralteten Funktionen wie glBegin (), glEnd () und vielen Büchern fernhalten möchten und Tutorials, die ich gesehen habe, verwenden diese Methode. Ich habe gesehen, wie Leute sagten, dass die neue Art, Dinge zu tun, komplizierter ist, die alte jedoch schlecht

Dies ist ein sehr großes Problem für OpenGL. Grundsätzlich schickten Sie in früheren Zeiten Dinge im "Sofortmodus" an die Videokarte. Beginnen Sie mit glBegin, machen Sie ein paar Sachen, enden Sie mit glEnd. Grafikkartentreiber mögen dies jedoch überhaupt nicht . Wie können sie wissen, wie viel Zeug Sie senden werden? Werden es 4 Eckpunkte für ein texturiertes Quad oder 100.000 für ein enthäutetes Modell sein? Aus diesem Grund haben sie Vertex Buffer Objects (VBOs) eingeführt. Während der Sofortmodus eine verknüpfte Liste ist, ist ein VBO ein statisches Array. Der Entwickler weiß, wie groß es ist, der Fahrer weiß, wie groß es ist. Alle sind glücklich. Daher entschied sich das OpenGL-Standards Board (Khronos Group), den Sofortmodus für OpenGL 3.0 und höher zu deaktivieren. Dies ist jedoch problematisch, wie ich anhand eines einfachen Beispiels zeigen werde.

Angenommen, Sie möchten ein strukturiertes Quad anzeigen, beginnend bei Null.

In OpenGL 2.1:

  • Richten Sie die Projektionsmatrix ein und legen Sie sie ein GL_PROJECTION.
  • Richten Sie die Modelview-Matrix ein und fügen Sie sie ein GL_MODELVIEW.
  • Laden Sie ein Bild und legen Sie es in einen GL_TEXTURE_2DGriff.
  • Definieren Sie die Positionen, Texturkoordinaten und Farben für Ihre Scheitelpunkte.
  • Binde die Textur.
  • glBegin... glVertex2f... glTexCoord2f... glEnd.

In OpenGL 3.0:

  • Erstellen Sie eine Matrix für die Projektion und Modellansicht.
  • Laden Sie ein Bild und legen Sie es in einen GL_TEXTURE_2DGriff.
  • Definieren Sie die Positionen, Texturkoordinaten und Farben für Ihre Scheitelpunkte und fügen Sie sie in VBOs ein.
  • Erstellen Sie ein Vertex-Array-Objekt (VAO) und hängen Sie Ihre VBOs an.
  • Schreiben Sie einen Shader, um ein strukturiertes Quad auszugeben, und fügen Sie ihn in ein Shader-Programm ein.
  • Befestigen Sie die Matrizen mit Uniformen am Shader-Programm.
  • Binde die Textur.
  • Hängen Sie die Textur an das Shader-Programm an.
  • glDrawArrays.

Was könnte also in der ersten Version schief gehen?

  • Ihre Positionen sind falsch.
  • Ihre Scheitelwindung ist falsch herum.
  • Deine Textur wird nicht richtig geladen.
  • Deine Textur bindet nicht richtig.
  • Ihre Projektionsmatrix ist falsch.
  • Ihre Modelview-Matrix ist falsch.
  • Sie senden nicht die richtigen Eckpunkte.

Und in der zweiten Version können Sie Probleme mit den oben genannten und haben :

  • Ihre VBOs sind falsch.
  • Ihre VAO ist falsch.
  • Dein Shader ist falsch.
  • Ihre Texturbindung an den Shader ist falsch.

Ohne geeignete Debug-Tools wird dies zu einem ernsthaften Problem. Dies ist der Grund, warum die Leute sagen, Sie sollten sich an den Sofortmodus halten. Zum Glück haben wir jetzt den kostenlosen und ausgezeichneten gDEBugger , aber es ist kein Wundermittel .

Um Ihre Frage zu beantworten: Es hängt von Ihrem Spiel ab. Wenn Sie ein breites Publikum erreichen möchten (zum Beispiel ein Gelegenheitsspiel oder ein 2D-Plattformspiel), sollten Sie auf 2.1 abzielen. Wenn Sie ein episches Weltraumspiel erstellen, das ohnehin nicht auf einer sechs Jahre alten Hardware ausgeführt werden kann, wählen Sie Ziel 3.3. Und wenn Sie das Neueste und Beste für die Zukunftsfähigkeit benötigen, wählen Sie Ziel 4.0.

knight666
quelle
2
Ich denke, Sie zeigen hier eine gewisse Voreingenommenheit gegenüber VAO / VBO. In Wirklichkeit hätten Sie, wenn Sie ein texturiertes Quad zeichnen wollten, ein vollständiges VAO / VBO-Set zusammen mit bereits erstellten Shadern und Texturen (während des Programmstarts - diese werden von niemandem zur Laufzeit erstellt). Das Zeichnen eines texturierten Quad über den neuen Weg ist in der Realität nur eine Handvoll Aufrufe - zugegebenermaßen lädt es die Komplexität bei der Programminitialisierung nach vorne, während der alte Weg die Komplexität zur Laufzeit aufdeckt.
Maximus Minimus
2
Aber genau das habe ich gemeint: Jetzt könnte Ihr Fehler in Ihren Daten (Vertex-Daten und Textur-Objekt), Ihrem Shader-Programm, Ihrem Shader-Code, Ihren Matrizen, Ihrem einheitlichen Upload oder Ihrer VAO-Bindung liegen. Wenn Sie anfangen von nichts , ist das eine Menge von zu überprüfenden Subsystemen! Und Sie müssen viel mehr Zustand im Auge behalten.
Knight666
1
Beachten Sie, dass gDEBugger von der Gremedy-Site nicht mehr aktuell ist. Ich gehe davon aus, dass sie verlassen wurden, da ihre Foren schon lange nicht mehr verfügbar sind. Das Tool wurde von AMD übernommen: gDEBugger .
MichaelHouse
2
"glBegin ... glVertex2f ... glTexCoord2f ... glEnd." Einfach nein. glBegin, glVertex etc. hatten nie recht. glDrawArrays wurde in OpenGL 1.1 (1997) eingeführt und sollte immer über glBegin und End verwendet werden.
API-Beast
9

Einige Statistiken zur Hardwarekompatibilität finden Sie in der Steam-Umfrage: http://store.steampowered.com/hwsurvey/ Obwohl DX10 und DX11 aufgeführt sind, ist die Hardwarekompatibilität mit OpenGL 3 bzw. OpenGL 4 identisch. Beachten Sie jedoch, dass der Installationsstatus des OpenGL-Treibers bei Benutzern normalerweise schlechter ist als bei DX.

Windows XP unterstützt weder DX10 noch DX11, aber OpenGL 3 und 4 sollten in Ordnung sein, sofern die Treiber in Ordnung sind. OSX unterstützt OpenGL 3 (maximal), unter Linux erhalten Sie OpenGL 4 mit Treibern von ATI / NVIDIA-Anbietern (natürlich nur, wenn die Hardware dies unterstützt).

Dann gibt es noch die mobilen ES-Versionen von OpenGL. In der Tat würde ich vorschlagen, OpenGL ES 2.0 zu untersuchen, da es kleiner ist, so dass es einfacher zu erlernen ist, aber Sie müssen auch moderne Methoden anwenden, dh Shader und VBOs. Es ist auch das, was auf den meisten Mobilgeräten verwendet wird (Sie könnten also auch mobile Spiele entwickeln), und WebGL ist im Grunde dasselbe, sodass Sie all Ihr Lernen im Webbrowser mit seinen schnellen Entwicklungsvorteilen durchführen können. OpenGL ES 3.0 ist diesen Sommer fällig.

Tessellation ist eine OpenGL 4.0-Funktion. Sie sollten zuerst die anderen Arten von Shadern lernen, geschweige denn alle Grundlagen, aber ich stimme zu, dass es interessant ist - tatsächlich habe ich einen kleinen Test damit geschrieben: http://blog.tapiov.net/post/15189341463/playing- with-opengl-4-tessellation

Tapio
quelle
4
Verdammt, knight666 hat mich geschlagen, mit einer genaueren Antwort. Dennoch lohnt es sich, über den ES-Teil nachzudenken.
Tapio