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

Aktuelle Zeit: Fr Jul 18, 2025 07:57

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Frage zur VBO Nutzung
BeitragVerfasst: Sa Jun 20, 2009 16:16 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Moin,

ich will grade ein Programm vom Immediate-Modus auf neuere Techniken umprogrammieren. Dabei sind mir ein paar Fragen gekommen.
Es handelt sich um ein 20x20 Raster, an jeder Position können prinzipiell etwa 10 verschiedene Quads (unterscheiden sich nur in der Textur) sein. In etwa der Hälfte der der Fälle ist keines sichtbar, ansonsten ist eines sichtbar. Entweder es ist ein Objekt (Stein, Kiste ect.) oder ein Item. Wenn es ein Objekt ist, muss das Item nicht gezeichnet werden, da unsichtbar. Es kann immer nur ein Item drauf sein. Deswegen also entweder kein Quad oder ein Quad.

Im Moment wird das alles noch mit glBegin(), glEnd() gemacht. Ich habe mir verschiedene Möglichkeiten überlegt das per VBO zu machen:

1)
Jedes Mal wenn sich etwas verändert Update ich das ganze VBO. Ich gehe jede Position im Raster durch und schaue welche Textur ich rendern müsste. Wenn ich nichts zeichnen muss wird auch nichts ins VBO geschrieben. Dabei wird das ganze auch nach Texturen sortiert weil es sehr wahrscheinlich ist, dass oftmals die gleiche gebraucht wird. Solange sich nichts ändert würde ich in jedem Frame nach einander die Texturen binden und einen zusammenhängenden (da sortiert) Teil des VBOs zeichnen.

2)
Ich schreibe alles was möglich ist unsortiert in das VBO und erstelle immer wenn sich etwas ändert ein Indexarray für jede Textur. Beim Zeichnen würde ich dann für jede Textur deren Indexarray zeichnen.

3)
Ich lasse es so wie es ist, weil es nichts bringt.

4)
Was ganz anderes.

Edit: Hab ganz vergessen zu schreiben, wie oft sich was ändert. Es kann sein, dass sich mehr als 10 Sekunden lang nichts tut. Es kann aber auch genauso gut sein, dass sich innerhalb von 5 Sekunden sehr viele Dinge ändern. Wenn sich etwas ändert, ist es meist so, dass in den nachfolgenden Frames auch etwas verändert wird. Nicht jeden Frame aber etwa alle 100ms.

Was wäre den der beste Weg? Die Performance ist beim normalen Rendern im 500fps Bereich. Wenn aber mehrere Posteffect-Shader angewendet werden kann es auch schonmal auf 100 runtergehen. Man muss aber auch bedenken, dass es schlechtere PCs gibt als meinen.

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 20, 2009 23:32 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Wenn die Daten nur so selten geändert werden, denke ich schon das man von einem VBO profitieren kann.
Beim Immediate-Modus werden, wenn ich das richtig interpretiere die Daten bei jedem Frame neu an die Grafikkarte gesendet. Also solange man nicht dauernd alle Daten in einem VBO ändert, sollte das schon einiges an Geschwindigkeit bringen.

Dann zu den verschiedenen Varianten:
So von der Logik her würde ich sagen, dass es schneller ist ein Index-Array zu ändern, weil da weniger Daten bewegt werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 21, 2009 10:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du könntest die Quads als GL_POINTS mit automatischer Texturkoordinatengenerierung rendern. Aus dem Point wird dann von der Grafikkarte automatisch ein Quad mit den richtigen Texturkoordinaten erzeugt. Das Feature ist glaub ich seit OpenGL 2.0 integriert, davor gab es eine Extension. Dann brauchst du pro Quad nur einen Vertex im VBO haben. Indexbuffer kann aber trotzdem nicht schaden, da du dann nur 2 Byte pro Quad ändern musst.

Code:
  1. glEnable(GL_POINT_SPRITE);
  2. glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);


Die Größe der Quads gibst du dann über die Pointsize an.

Edit: Das ganze funktioniert nur in einer 2D-Ansicht, weil die Point-Sprites natürlich zur Kamera ausgerichtet sind. Aber ich vermute das ist sowieso der Fall.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 22, 2009 11:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Moin,

ich teste grade ein bisschen und habe Probleme das VBO per Indizes zu zeichnen. Ich habe ein VBO mit den Geometriedaten und eines mit den Indexdaten (GL_ELEMENT_ARRAY_BUFFER).
Ich habe jetzt den Startvertex und die Anzahl der Vertices die ich pro Textur rendern muss. Ich hab schon gefühlte 10 Kombinationen aus glDrawArrays, glDrawElements, glDrawRangeElements ect. durchprobiert auber jedesmal kommt was anderes, natürlich nicht das richtige raus. Wenn ich das ganze VBO mit einer Textur zeichne sieht man auch, dass alles soweit stimmt.

Das Zeichnen der Geometrie mit der ersten Textur geht einwandfrei, danach passt es nicht mehr. Was mache ich falsch?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 22, 2009 12:03 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
CAh, blöder Fehler, hatte bei glDrawRangeElements() vergessen, dass ein Integer 4 byte Groß ist, deswegen war der Indexpointer zu klein.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]