Szene rendern

3D-Visualisierung mit der Open Graphics Library (OpenGL)
Antworten
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Szene rendern

Beitrag von Glocke » So Mai 05, 2013 7:23 pm

Hi, ich habe das OpenGL-Tutorial von Kerli. Sehr, sehr schön :) Das meiste was ich so gefunden hatte war sehr GLUT-bezogen, ich bin aber irgendwie SDL-Fan ^^

Auf jeden Fall frage ich mich nun, "wie" ich eine Szene am performantesten rendern sollte. Bisher war ich von der Verwendung von glBegin und glEnd im Zusammenhang mit glVertex3f usw. ausgegangen. Nach "näherem Googeln" bin ich auf "DisplayList" und "VBO" gestoßen. Nun meine Fragen:
  • Wie sollte ich nun rendern, wenn ich auf Geschwindigkeit wert lege?
  • Sollte ich bezüglich der Objekte meiner Szene unterscheiden, ob sie aktuell überhaupt sichtbar sind, oder erledigt das OpenGL für mich? Immerhin kennt es ja meine "Blickrichtung" (glFrustum etc.). Von der 2D-Programmierung bin ich gewöhnt zu unterscheiden, was sichtbar ist (und gezeichnet werden sollte) und was außerhalb des Sichtbereichs liegt.
Vielen Dank im Vorraus!

LG Glocke :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8721
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Szene rendern

Beitrag von Xin » So Mai 05, 2013 7:39 pm

Glocke hat geschrieben:Auf jeden Fall frage ich mich nun, "wie" ich eine Szene am performantesten rendern sollte. Bisher war ich von der Verwendung von glBegin und glEnd im Zusammenhang mit glVertex3f usw. ausgegangen.
Das gehört vermutlich zu den langsamsten Vorgängen.
Glocke hat geschrieben:Nach "näherem Googeln" bin ich auf "DisplayList" und "VBO" gestoßen. Nun meine Fragen:
  • Wie sollte ich nun rendern, wenn ich auf Geschwindigkeit wert lege?
DisplayListen übernehmen Eingaben in die Grafikkarte. Du kannst danach eine solche Liste aus der Grafikkarte rufen und Dir damit ein Objekt zeichnen lassen. Vertex Buffer Objekts(?) sind - wenn ich das gerade richtig in Erinnerung habe - Array Blocke, wo Du zum Beispiel einen Körper in Form von Dreiecken beschreibst, die in einem Array hintereinander stehen. Statt also pro Dreieck dreimal glVertex3f aufzurufen, sagst Du der Grafikkarte "Schau her, hier sind Dreiecke und zwar so und soviele, zieh's Dir rein."
Glocke hat geschrieben:[*] Sollte ich bezüglich der Objekte meiner Szene unterscheiden, ob sie aktuell überhaupt sichtbar sind, oder erledigt das OpenGL für mich? Immerhin kennt es ja meine "Blickrichtung" (glFrustum etc.). Von der 2D-Programmierung bin ich gewöhnt zu unterscheiden, was sichtbar ist (und gezeichnet werden sollte) und was außerhalb des Sichtbereichs liegt.[/list]
OpenGL ist genauso blöd, wie alles andere auch. Du musst selbst überlegen, welche Objekte Du zeichnen möchtest und welche nicht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Szene rendern

Beitrag von Glocke » So Mai 05, 2013 7:50 pm

Xin hat geschrieben:
Xin hat geschrieben:Vertex Buffer Objekts(?) sind - wenn ich das gerade richtig in Erinnerung habe - Array Blocke, wo Du zum Beispiel einen Körper in Form von Dreiecken beschreibst, die in einem Array hintereinander stehen. Statt also pro Dreieck dreimal glVertex3f aufzurufen, sagst Du der Grafikkarte "Schau her, hier sind Dreiecke und zwar so und soviele, zieh's
Dir rein."

Okay, also sollte ich mit VBOs zeichnen, richtig?
Xin hat geschrieben:OpenGL ist genauso blöd, wie alles andere auch. Du musst selbst überlegen, welche Objekte Du zeichnen möchtest und welche nicht.
Okay das wollte ich noch bestätigt haben :D

LG Glocke :)

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Szene rendern

Beitrag von Kerli » Mo Mai 06, 2013 3:02 pm

Du solltest auf jeden Fall mit Vertex Buffer Objects arbeiten. Im Gegensatz zu glVertex/glTexCoord/... werden mit VBOs die Daten nur einmal (sofern sie sich nicht ändern) auf die Grafikkart geladen (in den VRAM) und können dann mit sehr wenig Aufwand gezeichnet werden. Du kannst außerdem auch einen Index Buffer verwenden, was dir bei Mehrfachverwendung von Vertices Speicher sparen hilft, vor allem wenn pro Vertex viele Daten wie Farbe, mehrere Texturkoordinaten, usw. verwendet werden.
Vor ein paar Jahren habe ich bei meiner Engine einmal von glVertex/... auf VBOs umgestellt und plötzlich war es möglich 1 Million Dreiecke mit 30fps zu Zeichnen wo vorher nicht einmal 1fps möglich war (Ich weiß nicht ob die Zahlen genau stimmen, aber der Effekt war enorm).
Es ist immer effizienter Blöcke von Speicher zu kopieren als einzelne Werte, dh. glVertex wird immer am Langsamsten sein. Es gibt noch die Möglichkeit die Koordinaten und andere benötigte Daten aus einem Speicherblock im allgemeinen RAM zu zeichen, was zwar deutlich schneller als mit glVertex/... ist, da nur mehr ein großer Speicherblock kopiert werden muss mit sehr wenigen API Aufrufen an den Treiber, aber am schnellsten ist immer ein VBO bei dem das Übertragen der Daten auf die GPU in jedem Frame wegfällt.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Szene rendern

Beitrag von Glocke » Di Mai 07, 2013 1:09 pm

Kerli hat geschrieben:Du solltest auf jeden Fall mit Vertex Buffer Objects arbeiten.
Kannst du mir da ein Tutorial empfehlen, was qualitativ mit deinen OpenGL-Tutorials vergleichbar ist? :)
Kerli hat geschrieben:Vor ein paar Jahren habe ich bei meiner Engine einmal von glVertex/... auf VBOs umgestellt und plötzlich war es möglich 1 Million Dreiecke mit 30fps zu Zeichnen wo vorher nicht einmal 1fps möglich war (Ich weiß nicht ob die Zahlen genau stimmen, aber der Effekt war enorm).
Das kann ich mir gut vorstellen ... :D

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Szene rendern

Beitrag von Kerli » Mi Mai 08, 2013 2:31 pm

Glocke hat geschrieben:Kannst du mir da ein Tutorial empfehlen, was qualitativ mit deinen OpenGL-Tutorials vergleichbar ist? :)
Freut mich dass meine Tutorials gefallen. Auch wenn ich schon lange nichts mehr aktualisiert und erweitert habe :P

Ein paar Links habe ich noch ausgraben/finden können (alle Englisch):

http://www.opengl.org/wiki/Tutorials (C, SDL)
http://www.swiftless.com/opengltuts/opengl4tuts.html
http://www.opengl.org/wiki/Vertex_Specification
http://openglbook.com/the-book/

Es ist nicht alles mit der SDL gemacht sondern teilweise auch mit glut/etc. aber die relevanten Teile direkt mit OpenGL funktionieren eh trotzdem gleich. Mit OpenGL 3 gibt es jetzt übrigens auch Vertex Array Objects to quasi alle benötigten Einstellungen für VBOs kapseln.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten