Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 04:34

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 35 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 05, 2009 19:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

so hab es jetzt alles mal getestet... mit einem sehr ernüchternden ergebnis... :(

Hier mal meine test ergebnisse:
(VSync war immer aktiviert)


Code:
  1. glBegin(GL_QUADS)
  2.   glTexCoord2f(...);
  3.   glColor4f(...);
  4.   glNormal3f(...);
  5.   glVertex3f(...);
  6.   [..x4..]
  7. glEnd();


Der gute alte immediate mode liefert 60fps.



Code:
  1.         glBindBuffer(bufferType, buffer);
  2.         glBufferData(bufferType, getElementCount() * getElementSize(), getElementArray(), getUpdateMode());


Wenn ich diese 2 Zeilen für JEDES Quad aufrufe, um eben den VBO zu updaten komme ich auf ca. 15fps.
Der Update-Mode ist hierbei GL_DYNAMIC_DRAW. Mit GL_STATIC_DRAW ist es sehr viel langsamer.


Code:
  1.         glBindBuffer(bufferType, buffer);
  2.         glBufferSubData(bufferType, 0, getElementCount() * getElementSize(), getElementArray());


Der VBO wird mit den Zeilen vom vorherigen beispiel (glBufferData()) erstellt und dann mit diesen zwei zeilen ständig geupdated. Liefert: 1fps


Code:
  1.         glBindBuffer(bufferType, buffer);
  2.         GLvoid *buffer = glMapBuffer(bufferType, GL_WRITE_ONLY);
  3.         memcpy(buffer, getElementArray(), getElementCount() * getElementSize());
  4.         glUnmapBuffer(bufferType);


Der VBO wird wieder einmalig via glBufferData() erstellt und dann mit diesen vier zeilen geupdated. Ergebniss: 1fps

VertexArrays hab ich nicht getestet da wir ja beschlossen haben das es die in OpenGL 3.0 nichtmehr gibt.. :)
Aber, ich bin jetzt grad etwas ratlos... mir fällt so direkt keine andere alternative mehr ein.. :(

Eine grundlegende sache.. ich habe in meinem VBO 4 Buffer, einen für die Vertex-Daten, einen für Normal, Color und TexCoords.. sprich ich muß jeden der glBindBuffer/glBufferData aufrufe 4x machen, für jeden array einzeln.. gibt es da evtl eine elegantere methode?

Interleaved arrays möchte ich nur sehr sehr sehr ungern machen, das würde bei mir von der verwaltung des ganzen sehr viel sehr verkomplizieren..

Aya~

EDIT: Unabhängig davon hab ich meine Font-Klasse mal auf VBO umgestellt, also so das alle Quads pro Textur in ein VBO kommen, das hat das ganze dann wie erwartet wieder extrem beschleunigt.. löst aber trotzdem nicht das problem mit einzelnen Quads..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 05, 2009 22:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
2 Triangle in einen VBO zu verpacken ist die 2. höchste Form der ineffizienz(die höchste wäre 1 triangle xD).
Allerdings bleibt klar zu sagen, du wirst es schwer haben, bei so kleinen Daten,bei diesen Umständen und ohne OpenGL3 mit reinem VBO und Texturbinding effektiver als immediate mode zu zeichnen(vieleicht mit Vektorfont statt Bitmapfont ^^).
Bei OpenGL3 würde dir TexturArray das ganze bindingproblem lösen und Vertex Array Object würde dir das ganze VBO binding problem lösen.
Da du aber wohl nicht nur auf OpenGL3 setzen kannst, hilft das mal sage und schreibe 0 weiter.

Ein VBO sollte schon um im Bereich von ~4k Vertice liegen, für die optimale Leistung wird aber wohl kaum in diesem bereich möglich sein aber es gilt, je mehr Vertice durchlaufen werden, des so effizienter wird der draw call.
Ich sagte bereits, dass es sinnvoll ist ein VBO mit einem ganzem Text zu speichern, wieviele Texturbindings du dann machen musst, ist dann eine frage der komplexität des Textes und der Qualität deines Packalgos.
Vieleicht kannst du auch ein Shader verwenden, dann packst du in einen der verwendetden Buffer noch den Sample2D Index noch mit rein, z.B. bei xyzw in das w, da opengl eh für den shader jeden vektor egal welcher größe diesen auf 4 Elemente erweitert, kannst du auch gleich das w selber belegen und nutzen.
Du würdest dann einfach fixen code reinpacken z.B.:
Code:
  1. vec4 texcol1=gl_Position.w*Tex1; vec4 texcol2=min(gl_Position.w,1.0f)*Tex2; vec4 texcol3=min(gl_Position.w,1.0f)*Tex3; color=Tex1+Tex2+Tex3;

Geht sicher auch eleganter aber du bindest halt zwischen 1 bis 3 Texturen und kann dann den ganzen Text mit einmal zeichnen und hast zwischen 2-4 Bind Befehle und ein Draw Call pro Text.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 05, 2009 22:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
@Tak:

Wie schon öffters erwähnt... es geht mir hier NICHT darum wie ich meinen text effizienter zeichnen kann, sondern lediglich darum wie man effizient unter OpenGL3.0/ES einzelne Quads zeichnet.

Das mit dem Text war nur ein beispiel wo es besonders schwer ins gewicht fällt - aber wie man das hier anders lösen kann ist ja klar und auch schon umgesetzt.


Aber in wiefern helfen mir die VertexArrayObjects von OGL 3.0 bei der sache mit einzelnen Quads?

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 06, 2009 01:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Zitat:
Wie schon öffters erwähnt... es geht mir hier NICHT darum wie ich meinen text effizienter zeichnen kann, sondern lediglich darum wie man effizient unter OpenGL3.0/ES einzelne Quads zeichnet.
Achso, hab ich ned mit bekommen ^^.
VAO erlaubt das sammeln aller VBO und VA Befehle in einem Objekt, damit braucht man nur noch ein Bind machen, um alle Buffer zu binden und alle Vertex Flag manipulierenden befehle auszuführen. Quasi die Displaylist aber nur für sehr spezielle Auswahl an Funktionen.

Partikelsysteme: http://lumina.sourceforge.net/Tutorials/Particle_System.html
Alternativ findest du in ShaderX3-7 bzw. Game Programming Gems 6-7 oder GPU Gems 1-3 immer wieder implementierungen, die vollständig auf GPU arbeiten und somit den slowdown durch die binds umgehen.

Text: Das ist ja nun wohl geklärt.

Decals: Ziemlich ähnlich wie bei Text, nur das man halt einzelne Bullet holes und co in eine Textur sammelt und sonnst bleibt es die gleiche Problematik.

Allgemeine Lösung: Virtual Texture, da es nur eine Textur für alles gibt, kann ein VBO in einen zug gerendert werden und decals und so weiter sind dann auch batches in einem vbo.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 06, 2009 09:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hier ist ein ganz interessanter ähnlicher Thread im OpenGL-Forum: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=256256


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 35 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]