Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.05.2013, 21:39

OpenGL: Unterstützung von verschiedenen Versionen

Moin, moin.
Leider ist es nicht ganz so einfach, auszumachen welche Rendermethoden nun wirklich bei welchen OpenGL Versionen effizient sind bzw. überhaupt funktionieren. Tutorials beschäftigen sich allzuoft mit stark veralteten OpenGL Versionen und wenn nicht, dann sind sie meist komplizierter gehalten als eigentlich nötig. Dokumentationen und Spezifikationen sind für solche spezifische Fragen nicht immer geeignet (sobei ich auch kaum die Zeit finde für jede Bibilothek die komplette Dokumentation zu lesen). Erste Priorität hat zumindest, dass es auf jedem Computer läuft, auch auf älterer oder minderwertiger Hardware. Da das resultierende Spiel nicht soviel RAM und CPU Geschwindigkeit braucht, gibt es in meinen Augen eigentlich keine Rechtfertigung dafür, ältere OpenGL Versionen nicht zu unterstützen. Nun bin ich natürlich kein Spezialist in Sachen Graphikbibliotheken, zumindest weiß ich, wie ich in alten Versionen rendere und Effekte benutze.

Momentan programmiere ich in C/C++, wobei ich nur auf wenige C++ spezifische Funktionen nur zugreife (z.B. vector) und der grundlegende Code imperativ ist. Ansonsten natürlich GLFW und GLEW, wobei soweit ich weiß, immer die höchstmögliche Version benutzt wird. Das Spiel wird in 2D sein und momentan arbeite ich an einer Art Engine, natürlich keine richtige Engine sondern nur eine einfache Vorlage für ein Spiel die ich nach belieben wieder neu benutzen kann, sollte ich erneut an einem Spiel arbeiten. Da ich Lua für viele Dinge wie z.B. die KI benutzen werde und einen Editor für ein eigenes Levelformat schreiben werde, wird das auch kein Problem darstellen.

Nun ist aber die Frage, was brauch so eine Vorlage? Fakt ist ja, dass fast die gesamte Geometrie schon voher existiert und sich wenig verändert (von Objekten wie Türen mal abgesehen) und die Graphik relativ pixelig sein wird und auch sein soll. Einzig allein ein paar Effekte wie das einfärben von Texturen, Alphablending und dynamisches Licht sind erwünscht und sollen die Graphik etwas aufpeppen (falls jemand noch andere Ideen hat welche Effekte hilfreich und schön sein könnten, bin ich gerne dafür offen). Natürlich möchte ich mich nicht unbedingt auf einen einzigen Spieltyp beschränken, ist ja der Sinn hinter dem wiederverwendbaren Code, für das erste Spiel habe ich aber eine sehr klare Vorstellung. Ich will den Kram ja richtig schreiben und nicht irgendeinen Mist verzapfen, nun seh ich aber in vielen Codebeispielen überhaupt gar keine Fehlerabfragen.

Leider tun sich bei mir inzwischen auch weitaus mehr Fragen als Antworten auf, was ich als recht frustrierend empfinde. Zumindest eine Frage wurde mir in einem etwas größeren OpenGL IRC Channel beantwortet; Wenn ich mehrere OpenGL Versionen unterstützen möchte, sollte ich am besten zwei bis drei Rendermethoden schreiben und je nach Version wird eine dieser Methoden benutzt. Aber das ist bei weitem nicht die einzige Frage.
Sind VBOs wirklich die schnellste Methode zum rendern oder gibt es irgendwas was (mit lohnenswertem Aufwand natürlich) wesentlich schneller ist? Wenn ja, sollte ich es dann bei zwei Methoden belassen (eine mit VBOs und eine ohne)? Woher weiß ich wann mein VBO "voll ist", bzw. welche Größe hat ein VBO? Wenn ich dafür Videoram reserverieren muss, wieviel wird reserviert? Wieviel ist empfohlen? Wie fange ich Fehler vernünftig ab? Was ist denn nun genau die Shadersprache und wofür verwende ich sie, ist sie überhaupt interessant für mich? Wie benutze ich Effekte wie z.B. Alphablending mit VBOs?

Alles Fragen über Fragen. Vorab schonmal: Bin wenig daran interessiert, großartig darüber zu disktuieren warum ich nun A, B oder C möchte, mache, tue oder sonstwas oder warum ich deswegen nun dumm, unfähig, unreif, 13 Jahre alt etc. bin, hab davon genug im Chat gehabt und bin dementsprechend wenig scharf darauf. Wenn ihr nicht daran interessiert seid mir zu helfen, respektiere ich das (wie auch andere Meinungen) aber auf ständige Diffamierung und elendslange Diskussionen habe ich wenig Lust, danke. Ansonsten bin ich natürlich für jede Antwort sehr dankbar.

2

15.05.2013, 22:09

Es stimmt wohl das OpenGL Dokumentationen und Hilfe sowie Tutorials teils sehr konfus sind... entweder veraltet oder unnötig verkompliziert (sehr schade alles in allem)

Meiner persönlichen Meinung kannst Du getrost VBOs nutzen (auch für ältere Systeme)
VBOs werden bereits seit OpenGL Version 1.5 unterstützt

Shader, wenn man sich einmal mit befasst hat vereinfachen diverse Operationen und Berechnungen (zB Blending, Multitexturing ect...)
Und da diese direkt auf der Grafikkarte berechnet werden sind sie zudem auch noch um einiges schneller...

Es ist lobenswert verschiedene Versionen in Betracht zu ziehen, persönlich denke ich jedoch ist es soviel Aufwand gar nicht wert...
Wenn Du nicht zwingend aktuellste 4.X Funktionen verwenden möchtest.... insbesondere nicht für reine 2D Operationen.

Meiner Meinung nach, oder wie ich vorgehen würde: erst einmal auf bekannten 'Terrain' alles ausarbeiten und dann gucken ob dieses oder jenes mit neueren OpenGL Funktionen nicht vielleicht besser/schneller/optimaler laufen könnte...

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

15.05.2013, 22:17

Zitat

Sind VBOs wirklich die schnellste Methode zum rendern oder gibt es irgendwas was (mit lohnenswertem Aufwand natürlich) wesentlich schneller ist?

VBOs sind aktuell und in Kombination mit VAOs äußerst Effektiv.

Zitat

Wenn ja, sollte ich es dann bei zwei Methoden belassen (eine mit VBOs und eine ohne)?

Im Prinzip hast du keine andere Wahl, da alles < OpenGL 2 mit glBegin() usw. arbeitet (bzw. diesen List Dingern, Namen vergessen, ist eh veraltet) und >= OpenGL 3 mit Buffern. Daher reichen eigentlich zwei Rendermethoden(/funktionen).

Zitat

Wenn ich dafür Videoram reserverieren muss, wieviel wird reserviert?

So viel wie du ins VBO packst.

Quellcode

1
sizeof(float)*vertices.size()

z.B.

Zitat

Wieviel ist empfohlen?

Selbst bei alter Hardware wirst du den VRAM wohl nur mit Texturen wirklich voll bekommen. Empfohlenen Speicherverbrauch kenne ich da nicht.

Zitat

Was ist denn nun genau die Shadersprache und wofür verwende ich sie, ist sie überhaupt interessant für mich?

Für alles was du mit deinen Daten auf der Grafikkarte machen willst. Von Anfang bis zur Ausgabe. Damit kannst du z.B. Licht berechnen (google mal nach "modern OpenGL Phong Shading").

Zitat

Wie benutze ich Effekte wie z.B. Alphablending mit VBOs?

Quellcode

1
2
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // nutze ich eigentlich immer

4

15.05.2013, 22:28

Zitat von »"DeKugelschieber"«

Zitat von »"S. P. Gardebiter"«

Wenn ich dafür Videoram reserverieren muss, wieviel wird reserviert?
So viel wie du ins VBO packst.

Quellcode

1
sizeof(float)*vertices.size()
z.B.

Zitat von »"S. P. Gardebiter"«

Wieviel ist empfohlen?


http://www.opengl.org/wiki/Vertex_Specif…_Best_Practices

Es macht natürlich wenig Sinn einzelne Quads oder Triangles in ein VBO zu stecken, das würde alles in allem die ganze sache sogar langsamer machen als mit glBegin/glEnd zu 'zeichnen'

Man sollte nach möglichkeit versuchen die Drawcalls so niedrig wie möglich zu halten.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

15.05.2013, 22:40

Achso, ich dachte eher an den Gesamtverbrauch. Nee also wie EternalPain schon sagt, es macht (eigentlich) keinen Sinn 2 Dreiecke in ein VBO zu packen.
Ich mach es zwar trotzdem (Generalisierung), aber wenn du es effizient haben willst: batching. Heißt du packst z.B. eine ganze Tilemap in ein VBO, fasst also einzelne Objekte zusammen.
Du kannst ja auch Teile eines VBO rendern, dann lohnt es sich eigentlich immer.

6

16.05.2013, 09:57

Andererseits: Wenn das Spiel auf älteren Rechnern mit älteren, ineffizienteren OpenGL Funktionen (glBegin z.B.) laufen soll - wieso dann für neue Hardware, die eh schon schneller ist, eine schnellere Version programmieren?
Wenn du ein Spiel machst, wird vermutlich eh nichts anderes im Hintergrund laufen, und wenn du nicht 2 komplett verschiedene Grafiksetups (mit wesentlich größeren Texturen, detaillierteren Modellen usw.) machen willst, nützt dir der Geschwindigkeitsvorteil von VBO's überhaupt nichts.
Lieber dumm fragen, als dumm bleiben!

7

21.06.2013, 04:29

Moin, moin, vielen Dank für eure Antworten.
Und tut mir leid, dass ich erst einen Monat später antworte, bei mir wars die letzte Zeit relativ stressig. :)
Wieviel Geschwindigkeit bringt denn nun ein VBO?
Ich habe ja eher das Problem, dass ich verschiedene Ebenen in Verbindung mit verschiedenen Blendfunktionen und Einfärbungen habe, kann ich das irgendwie als ein einziges VBO realisieren oder muss ich dafür mehrere VBOs hernehmen? Das mit den Ebenen sollte ja in erster Linie kein Problem sein, einfach die Dinge die zuerst gezeichnet werden, zuerst in das VBO schreiben. Bei verschiedenen Blendfunktionen oder sogar Equations, muss ich ja auch selber sortieren soweit ich weiß.

Wie ist denn das nun mit der Fehlerabfrage? Es könnte ja wirklich mal sein, dass irgendwann das VRam voll ist, stürzt das Programm dann ab oder kann ich den Fehler abfangen und selber behandeln?

8

21.06.2013, 11:02

Nachdem Du die Vertexdaten mittels glBufferData [1, 3] an OpenGL übergeben hast, prüfe mittels glGetError [2, 3] auf GL_OUT_OF_MEMORY, ob diese angelegt werden konnten und reagiere entsprechend dem Ergebnis.

Im Falle von GL_OUT_OF_MEMORY ist der Status von OpenGL undefiniert. Bei allen anderen Fehlern wird die Operation ignoriert und der Status bleibt erhalten.

Grüße ... bwbg

[1]: glBufferData
[2]: glGetError
[3]: OpenGL4 Referenz

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

9

21.06.2013, 13:09

Ist es nicht im Grunde eh so, dass ältere Computer nicht zum Spielen benutzt werden?
Und außerdem unterstützten doch alle halbwegs modernen Grafikkarten GL 3.0, oder sehe ich das falsch?

10

21.06.2013, 13:27

Der Geschwindigkeitsvorteil hängt meines Wissens in erster Linie von der verwendeten Hardware ab. Durch die Verwendung der VBOs wird der Flaschenhals von der CPU (bzw. Kommunikation zwischen CPU und GPU) zur GPU hin verlagert. Im Idealfall würde der Geschwindigkeitsvorteil dann nur von der Anzahl der Vertices pro Objekt abhängen (je mehr destso größer der Vorteil gegenüber anderen Methoden). In der Praxis macht aber irgendwann auch die GPU schlapp, dass ist aber von GPU zu GPU sehr verschieden. (bei schwachen, wie z. B. der in dem Open Pandora Handheld verwendeten GPU kann die Verwendung von VBOs sogar zu einer Verlangsammung führen, in diesem Fall so weit ich weiß, weil man dann Shader verwenden muss, die dort deutlich langsammer als die fixed function pipeline sind).
Auf jedem halbwegs modernen PC sollten die Vorteile aber spürbar überwiegen.

Aber was meinst du mit Ebenen? Ebenen für Sprites, Multitexturing, ...?

Werbeanzeige