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

Aktuelle Zeit: Fr Jul 18, 2025 11:24

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



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Rund 45000 Dreiecke = 30FPS?
BeitragVerfasst: Di Aug 23, 2005 20:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Hallo.

Habe ein Problem und zwar zeichne ich nicht mehr als
Rund 45000 Dreiecke mit Textur
Texture Font (zum FPS angeben)
Geblendetes QUAD als beenden button
Und habe nur 27-30 FPS
Das ist doch nicht normal?

Hier mal am besten das Zeichnen der Dreiecke ...
Code:
  1. //########################### Render Hightmap ##################################
  2.  
  3.  
  4. procedure TLevel.PaintTriangle(v1,v2,v3: integer);
  5. const
  6.   blue = 7;
  7. var
  8.   Normale: TVertex;
  9.   tex_y, tex_x: single;
  10. begin
  11.  
  12.   Normale := VectorCrossProduct(VectorSubtract(Vertieces[v1], Vertieces[v2]),
  13.                                 VectorSubtract(Vertieces[v2],Vertieces[v3]));
  14.   NormalizeVector(Normale);
  15.   if (Vertieces[v1][1] > 0) OR (Vertieces[v2][1] > 0) OR (Vertieces[v3][1] > 0) then
  16.   begin
  17.  
  18.   glNormal3fv(@Normale[0]);
  19.     glBegin(GL_TRIANGLES);
  20.         if Vertieces[v1][1] <= 1*HeightS then
  21.           glColor3f(0,0,blue/10)
  22.         else
  23.         glColor3f(VertexColor[v1]/100,VertexColor[v1]/100,VertexColor[v1]/100);
  24.  
  25.           glTexCoord2f(1,1);
  26.             glVertex3f(Vertieces[v1][0], Vertieces[v1][1], Vertieces[v1][2]);
  27.         if Vertieces[v2][1] <= 1*HeightS then
  28.           glColor3f(0,0,blue/10)
  29.         else
  30.         glColor3f(VertexColor[v2]/100,VertexColor[v2]/100,VertexColor[v2]/100);
  31.           glTexCoord2f(0,1);
  32.             glVertex3f(Vertieces[v2][0], Vertieces[v2][1], Vertieces[v2][2]);
  33.         if Vertieces[v3][1] <= 1*HeightS then
  34.           glColor3f(0,0,blue/10)
  35.         else
  36.         glColor3f(VertexColor[v3]/100,VertexColor[v3]/100,VertexColor[v3]/100);
  37.           glTexCoord2f(1,0);
  38.             glVertex3f(Vertieces[v3][0], Vertieces[v3][1], Vertieces[v3][2]);
  39.     glEnd();
  40.   end;
  41.  
  42. end;
  43.  
  44. procedure TLevel.RenderHeightmap();
  45. var
  46.   x,z: integer;
  47.   Normale: TVertex;
  48. begin
  49.  
  50.   glBindTexture(GL_TEXTURE_2D,tex[0]);
  51.   glEnable(GL_CULL_FACE);
  52.  
  53.   glBegin(GL_TRIANGLES);
  54.  
  55. glColor3f(0,0,0.<!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->;
  56.           glTexCoord2f(1,1); glVertex3f(0, 1*HeightS, 0);
  57.           glTexCoord2f(1,0); glVertex3f(LevelSize, 1*HeightS, LevelSize);
  58.           glTexCoord2f(0,1); glVertex3f(LevelSize, 1*HeightS, 0);
  59.  
  60.           glTexCoord2f(1,1); glVertex3f(0, 1*HeightS, 0);
  61.           glTexCoord2f(0,1); glVertex3f(0, 1*HeightS, LevelSize);
  62.           glTexCoord2f(1,0); glVertex3f(LevelSize, 1*HeightS, LevelSize);
  63. glColor3f(1,1,1);
  64.  
  65.   glEnd();
  66.   for x := 0 to LevelRes - 2 do
  67.     for z := 0 to LevelRes -2 do
  68.       begin
  69.         Vertieces[0][0] := (x+1)*triangle;    Vertieces[0][1] := LevelDaten[x+1,z]*HeightS;     Vertieces[0][2] := z*triangle;
  70.           VertexColor[0]:= LightMap[x+1, z];
  71.         Vertieces[1][0] := x*triangle;        Vertieces[1][1] := LevelDaten[x,z]*HeightS;       Vertieces[1][2] := z*triangle;
  72.           VertexColor[1]:= LightMap[x, z];
  73.         Vertieces[2][0] := (x+1)*triangle;    Vertieces[2][1] := LevelDaten[x+1,z+1]*HeightS;   Vertieces[2][2] := (z+1)*triangle;
  74.           VertexColor[2]:= LightMap[x+1, z+1];
  75.         Vertieces[3][0] := x*triangle;        Vertieces[3][1] := LevelDaten[x,z+1]*HeightS;     Vertieces[3][2] := (z+1)*triangle;
  76.           VertexColor[3]:= LightMap[x, z+1];
  77.         PaintTriangle(0,1,2);
  78.         PaintTriangle(1,3,2);
  79.       end;
  80.  
  81.  
  82.   glDisable(GL_CULL_FACE);
  83. end;


Das das von den TExturcoordinaten noch nicht passt weiß ich :-P

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 23, 2005 20:36 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
1) Auf jeden Fall VBO benutzen.
2) Zu viele Berechnungen zum Zeichnen. Im Idealfall wird gar nichts mehr berechnet und das Zeichnen beschränkt sich auf glDraw[Range]Elements Aufrufe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 14:25 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
es könnte auch schon helfen mehr triangles pro glbegin/glend block zu haben


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 15:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Ja also ich speichere das jetzt alles ab, so wie ich es brauche.
Dann hab ich ja auch nur noch ein glBegin und glEnd.
Das ist wohl das erste was ich mal mache...

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 18:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
So, habe jetzt erstmal nur dadurch, dass ich keine Berechnungen mehr habe (und momentan auch keine Normalen setze) rund 50 FPS
Danke.

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 18:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 17, 2005 13:19
Beiträge: 98
Wohnort: Jahnsdorf
Was soll die Multiplikation mit 1 bringen? IMHO kann man da auch noch mal sparen (auch wenn der Compiler das bei Source-Optimierung sowieso automatisch entfernt). Bei schnellem Code brauch der Compiler nix mehr "optimieren".

Falls das in Zeile 56-63 eine Berechnung andeuten soll, so bitte vorher einmalig ausführen und dann nur noch das Ergebnis Übergeben.

_________________
Administrator of Project Omorphia
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 18:34 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Mal ne Frage am Rande zum Thema VBO:
Ist es schlimm wenn ich eine Größere Anzahl an VBO's habe?

Ich habe eine Spezielle Objektstruktur, wo jedes Objekt selber ein paar VBO's hat!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 18:50 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Da VBO auf der GraKa liegen, gilt: Allzuviel ist ungesund. Soll heißen: Wenn deine Objekte den ganzen Speicher fressen, werden andere Sachen, eventuell sogar die VBOs selbst in den Clientspeicher ausgelagert. Und das kann dann eine richtig schöne Bremse werden.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 18:52 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die VBO's sollten nicht zu groß sein, damit sie vom Treiber noch vernünftig verwaltet werden können. Ein 32MB Block kann schlecht verschoben werden. Allerdings kostet der Buffer Wechsel, genauer der Aufruf von glVertexPointer ein wenig und daher sollten schon einige hundert Punkte drin sein. Im OpenGL Forum mal danach suchen. Da gibt's ein paar gute Beiträge. Außerdem ist empfohlen glDrawRangeElements zu verwenden, weil der Speichermanager diese Bereichsangaben irgendwie zur Optimierung der Buffer nutzt.
Ich denke eine gute Lösung ist, Buffer von einer konfigurierbaren Größe von OpenGL anzufordern und den Speicher innerhalb dieser Buffer selber zu verwalten. Nicht alle Objekte haben ja zwangsläufig so viele Punkte und da kann man ja auch mehrere Objekte in einen Buffer packen.

Zitat:
Ich habe eine Spezielle Objektstruktur, wo jedes Objekt selber ein paar VBO's hat!

Die Struktur der Objekte sollte eigentlich keinen Einfluß auf solche Dinge wie Hardware Resourcen haben. Da muß eigentlich eine Abstraktionsschicht zwischen.


Zuletzt geändert von LarsMiddendorf am Mi Aug 24, 2005 18:57, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 18:53 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Wenn die sachen gegeneinander beweglich sein müssen, gehts ja nicht anders. Aber das wechseln der VBOs kostet natürlich zeit, ich denke dass ist wie bei texturen: weniger wechsel = besser...

Wenn nun verschiedene Dinge aus den selben Einzelteilen bestehen, ist es denke ich eine frage, wie bequem oder schnell man es haben will, ob man für jedes Ding eine VBO macht (sollte schnell sein), oder für jedes sich wiederholende einzelteil eine VBO macht (sollte weniger aufwand sein) und die dann zusammensetzt. Aber dass muss mann wohl je nach anwendung entscheiden.

P.s. Ich setzte bei meiner Physiksimulation auch starre-Kugel-Objekte aus einer Kugel-VBO zusammen, die ich halt öfters zeichne. Dass ist viel variabler und kostet kaum zeit und spart ne menge aufwand und quellcode!

Edit: Mist, eine minute zu lansam! Und etwas unpräziser :oops: Naja, ich habs halt versucht

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Zuletzt geändert von geo am Mi Aug 24, 2005 18:55, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 18:54 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
hängt davon ab, wie groß die anzahl ist. allgemein ist es meistens (solange der vbo nicht zu groß wird) besser (schneller) möglichst viele triangle pro drawcall zu bearbeiten, nen paar hundert tris/drawcall solltens dann schon möglichst sein.
dazu kommt dann natürlich der overhead beim wechseln der vbos, insofern sollte man es wohl möglichst weit vermeiden, solange es einem nicht die struktur verhunzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 19:42 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Naja, wenn ich jetzt alle Objekte in einen VBO schmeisse muss ich doch falls ein Objekt gelöscht wird, den ganzen VBO neu in den Speicher laden, oder irre ich mich da?

Also um genau zu werden:
Mein Objekt unterstützt einige Zeichenmethoden wie z.b. TriangelStrip, Lines,....
Diese müssen ja soweit ich weiss getrennt voneinander Gespeichert werden, und dann per Funktionsaufruf richtig gezeichnet werden.
Wie groß die einzellnen Objekte werden kann ich bisher nicht sagen, aber es sollten auch kleine Objekte drin sein.

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 20:04 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
Zitat:
Mein Objekt unterstützt einige Zeichenmethoden wie z.b. TriangelStrip, Lines,....
Diese müssen ja soweit ich weiss getrennt voneinander Gespeichert werden, und dann per Funktionsaufruf richtig gezeichnet werden.


wieso müssen die getrennt von einander gespeichert werden?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 21:41 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn du weißt, welches Element wie gezeichnet werden soll, kannst du die auch zusammen speichern. (Also theoretisch. Ich hab mit VBOs noch net gearbeitet)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 24, 2005 21:51 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Grizzly hat geschrieben:
wieso müssen die getrennt von einander gespeichert werden?


Dachte aus diesem Grund:
Code:
  1. glDrawArrays(GL_QUADS, 0, VBOSize);

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.014s | 14 Queries | GZIP : On ]