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

Aktuelle Zeit: Fr Jul 18, 2025 15:48

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



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: VBO langsamer als glBegin/glEnd?
BeitragVerfasst: Di Sep 11, 2007 16:43 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Hi,

Mir ist es kürzlich schonmal aufgefallen, jetzt hat es sich bestätigt: Meine VBO Implementierung scheint langsamer zu sein als die selbe Szene mit einfachem glBegin/glEnd. Gerendert werden 1000 Partikel - es sind so wenig, da sonst das Durchlaufen der Liste die Performance drückt, und nicht das Rendern selbst. Das VBO leistet ~845FPS, GL_QUADS leistet ~935FPS. Bei höherer Partikelanzahl mindert sich der Abstand zwischen den Zahlen, aber das VBO wird davon nicht schneller. Die Daten des VBO werden in jedem Durchlauf upgedated. Die Berechnungen sind bei beiden Methoden die gleichen. Hier der relevante Code:

Code:
  1.  
  2.     //*********** VBO ************
  3.  
  4.      if FCalcNormals then
  5.      begin
  6.       vMode := GL_T2F_C4F_N3F_V3F;
  7.       vSize := SizeOf(T_T2F_C4F_N3F_V3F_Vertex);
  8.      end else
  9.      begin
  10.       vSize := SizeOf(T_T2F_C4UB_V3F_Vertex);
  11.       vMode := GL_T2F_C4UB_V3F;
  12.      end;
  13.      
  14.      vSize := SizeOf(vMode);
  15.  
  16.      // Calculate the amount of data that will be mapped
  17.      VBOLength := Length(FParticlePointers)*vSize*4;
  18.      
  19.      glBindBufferARB(GL_ARRAY_BUFFER_ARB, FVBO);
  20.      glEnableClientState(GL_VERTEX_ARRAY);
  21.      if (FCurrentVBOLength <= VBOLength) or (FCurrentVBOLength-100*vSize*4 > VBOLength) then
  22.      begin
  23.        WriteLn('Resize');
  24.        // Add some free space to avoid resize all the time
  25.        ResizeVBO(VBOLength+50*vSize*4);
  26.      end;
  27.      //glBufferDataARB(GL_ARRAY_BUFFER_ARB, VBOLength, nil, GL_DYNAMIC_DRAW_ARB);
  28.      VBOPointer := glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); //nil
  29.      
  30.      DataLength := 0;
  31.  
  32.      while NodeIterator <> nil do // Die Initialisierung hab ich rausgelassen,  nicht wundern
  33.      begin
  34.         For k := 0 to 3 do
  35.         begin
  36.           if FCalcNormals then
  37.           begin
  38.             VNPointer := VBOPointer;
  39.             VNPointer^.X := Particle.Position.X + Vectors[k].X;
  40.             VNPointer^.Y := Particle.Position.Y + Vectors[k].Y;
  41.             VNPointer^.Z := Particle.Position.Z + Vectors[k].Z;
  42.             VNPointer^.S := FTextures[Particle.Texture, k, 0];
  43.             VNPointer^.T := FTextures[Particle.Texture, k, 1];
  44.             VNPointer^.R := Particle.Color.X;
  45.             VNPointer^.G := Particle.Color.Y;
  46.             VNPointer^.B := Particle.Color.Z;
  47.             VNPointer^.A := Particle.Opacity;
  48.             VNPointer^.NX:= Normals[k].X;
  49.             VNPointer^.NY:= Normals[k].Y;
  50.             VNPointer^.NZ:= Normals[k].Z;
  51.           end else
  52.           begin
  53.             VPointer := VBOPointer;
  54.             VPointer^.X := Particle.Position.X + Vectors[k].X;
  55.             VPointer^.Y := Particle.Position.Y + Vectors[k].Y;
  56.             VPointer^.Z := Particle.Position.Z + Vectors[k].Z;
  57.             VPointer^.S := FTextures[Particle.Texture, k, 0];
  58.             VPointer^.T := FTextures[Particle.Texture, k, 1];
  59.             VPointer^.R := Round(Particle.Color.X*255);
  60.             VPointer^.G := Round(Particle.Color.Y*255);
  61.             VPointer^.B := Round(Particle.Color.Z*255);
  62.             VPointer^.A := Round(Particle.Opacity*255);
  63.           end;
  64.       {$IFDEF cpux86_64}
  65.           VBOPointer := Pointer(Int64(VBOPointer)+vSize);
  66.       {$ELSE}
  67.       VBOPointer := Pointer(Integer(VBOPointer)+vSize);
  68.           {$ENDIF}
  69.       inc(DataLength);
  70.         end;
  71.  
  72.         if NodeIterator^.Right <> -1 then
  73.           NodeIterator := @FParticleStack[NodeIterator^.Right]
  74.         else
  75.           NodeIterator := nil;
  76.      end;
  77.  
  78.      glUnmapBuffer(GL_ARRAY_BUFFER_ARB);
  79.      glInterleavedArrays(vMode, vSize, nil);
  80.      glDrawArrays(GL_QUADS, 0, DataLength);
  81.      glDisableClientState(GL_VERTEX_ARRAY);
  82.      glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
  83.    
  84.   //*********** glBegin/glEnd ************
  85.  
  86.   glBegin(GL_QUADS);
  87.   while NodeIterator <> nil do
  88.   begin
  89.          if FCalcNormals then
  90.            glNormal3fv(@Normals[k]);
  91.          glColor4f(Color.X, Color.Y, Color.Z, Opacity);
  92.          glTexCoord2fv(@FTextures[Texture, k]);
  93.          glVertex3fv(@Vectors[k]);
  94.  
  95.        NodeIterator^.Value := Particle;
  96.        if NodeIterator^.Right <> -1 then
  97.          NodeIterator := @FParticleStack[NodeIterator^.Right]
  98.        else
  99.          NodeIterator := nil;
  100.   end;
  101.   glEnd;
  102.  


Mach ich was falsch? oder lohnt sich ein VBO erst, wenn man nicht in jedem Zyklus updated?

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 11, 2007 20:08 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Hat sich scheinbar bestätigt:

Habe Berechnung und Rendering entkoppelt, und siehe da: aus 845FPS werden, mit der entsprechenden Anzahl an Berechnungen pro Frame, 4600FPS :) Im Vergleich dazu erreicht das entkoppelte Rendern über Displaylisten ca. 4200FPS, ich bin zufrieden :D

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


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


Wer ist online?

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