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

Aktuelle Zeit: Do Mär 28, 2024 22:04

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Sep 23, 2015 13:05 
Offline
DGL Member

Registriert: Fr Nov 22, 2013 09:19
Beiträge: 11
Wohnort: Sauerland
Programmiersprache: Delphi XE2
Hallo liebe Community,
Mir ist folgendes Problem beim Erstellen eine Sphere in einem VBO aufgefallen.
Ich habe eine Funktion geschrieben, die eine Geosphere errechnet und in einem VBO speichert.
(Ich benutz die Unit "glVBO" und die darin enthaltene Klasse "TglVBO")

Code:
  1.  
  2. procedure TSphere.GenerateVBO;
  3. const
  4.   STACKS = 16;
  5.   SLICES = 24;
  6. var
  7.   points: TList<TVertex3f>;
  8.   i, j, k, Offset: Integer;
  9.   theta, phi: Extended;
  10. begin
  11.   points := TList<TVertex3f>.Create;
  12.   try
  13.     // North Pole
  14.     points.Add(Vertex3f(0, FRadius, 0));
  15.     for i := 1 to STACKS do
  16.     begin
  17.       theta := i * Pi / STACKS;
  18.       for j := 0 to SLICES-1 do
  19.       begin
  20.         phi := 2 * j * Pi / SLICES;
  21.         points.Add(Vertex3f(
  22.           cos(phi) * sin(theta) * FRadius,
  23.           cos(theta) * FRadius,
  24.           sin(phi) * sin(theta) * FRadius
  25.         ));
  26.       end;
  27.     end;
  28.     // South Pole
  29.     points.Add(Vertex3f(0, -FRadius, 0));
  30.  
  31.     FVBO.VertexCount := points.Count;
  32.     FVBO.IndexCount := points.Count;
  33.  
  34.     for i := 0 to points.Count-1 do
  35.     begin
  36.       FVBO.OpenVertex(i);
  37.       FVBO.Write3f(element_type_vertex, points[i].X, points[i].Y, points[i].Z);
  38.       FVBO.Write3ub(element_type_color, GetRValue(FColor), GetGValue(FColor), GetBValue(FColor));
  39.  
  40.       FVBO.WriteIndexUByte(i, i);
  41.     end;
  42.  
  43.     FVBO.GenerateBuffer;
  44.   finally
  45.     FreeAndNil(points);
  46.   end;
  47. end;
  48.  


Die Sphere wird wie folgt gerendert:

Code:
  1.  
  2. procedure TSphere.Render;
  3. begin
  4.   glPushMatrix;
  5.     glTranslatef(FPosition.X, FPosition.Y, FPosition.Z);
  6.     glRotatef(FRotate.X, 0, 1, 0);
  7.     glRotatef(FRotate.Y, 1, 0, 0);
  8.     glRotatef(FRotate.Z, 0, 0, 1);
  9.  
  10.     FVBO.BindVertexBuffer;
  11.     FVBO.ActivateElement(element_type_vertex);
  12.  
  13.     FVBO.BindIndexBuffer;
  14.  
  15.     glColor3ub(255, 255, 255);
  16.     glDrawElements(GL_POINTS, FVBO.IndexCount-1, GL_UNSIGNED_BYTE, Pointer(FVBO.VertexDataSize));
  17.   glPopMatrix;
  18. end;
  19.  


Beispiel:

Geosphere mit 8 Stacks und 16 Slices.

Bild
https://picload.org/view/pdrpplp/sphere8x16.png.html

Geosphere mit 16 Stacks und 32 Slices.

Bild
https://picload.org/view/pdrppcg/sphere16x32.png.html

Die Anzahl der Stacks und Slices werden mit Konstanten vorgegeben. Sobald mehr als 256 Punkte errechnet werden, werden alle Punkte, die danach folgen, nicht mehr gerendert.
Meine Frage ist, wird dort die maximale Anzahl der möglichen Vertices eines VBOs erreicht, oder könnte das eine andere Ursache haben?

Schon mal Danke für eure Hilfe. :)

Mit freundlichen Grüßen,
Robocolder


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 23, 2015 13:09 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Hast du einen Link zur Klasse? Dort würde ich die Limitierung suchen.
Zwar hat ein VBO auch Größenbeschränkungen, aber die sind deutlich weiter oben zu finden und sollten eigentlich von der GPU abhängig sein.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 23, 2015 13:11 
Offline
DGL Member

Registriert: Fr Nov 22, 2013 09:19
Beiträge: 11
Wohnort: Sauerland
Programmiersprache: Delphi XE2
Ich habe diese glVBO-Klasse von Lossy eX verwendet.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 23, 2015 13:21 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Was ist den die Initialisierung von VertexCount des VBO?
Da gibst du ja eine Größe an. Diese ist zwar dynamisch, aber muss vor dem Befüllen korrekt gesetzt werden. Wobei dann eigentlich die Klasse selber eine Exception schmeißen sollte :/

Ansonsten schau dir mal den Aufruf GenerateBuffer() an. Vielleicht siehst du da die falschen Werte direkt?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 25, 2015 15:15 
Offline
DGL Member

Registriert: Fr Nov 22, 2013 09:19
Beiträge: 11
Wohnort: Sauerland
Programmiersprache: Delphi XE2
Alle Vertices werden zuerst errechnet in dann in einer TList gespeichert. Nach der Berechnung wird die Anzahl der errechneten Vertices im VBO gesetzt und diese dann im VBO gespeichert.

Das passiert hier:

Code:
  1.  
  2. ...
  3.  
  4.   points := TList<TVertex3f>.Create;  // Kugel errechnen
  5.   try
  6.     // North Pole
  7.     points.Add(Vertex3f(0, FRadius, 0));
  8.     for i := 1 to STACKS do
  9.     begin
  10.       theta := i * Pi / STACKS;
  11.       for j := 0 to SLICES-1 do
  12.       begin
  13.         phi := 2 * j * Pi / SLICES;
  14.         points.Add(Vertex3f(
  15.           cos(phi) * sin(theta) * FRadius,
  16.           cos(theta) * FRadius,
  17.           sin(phi) * sin(theta) * FRadius
  18.         ));
  19.       end;
  20.     end;
  21.     // South Pole
  22.     points.Add(Vertex3f(0, -FRadius, 0));
  23.  
  24.     FVBO.VertexCount := points.Count;  // Anzahl der Vertices setzen
  25.  
  26.     j := 0;
  27.     for i := 0 to points.Count-1 do
  28.     begin
  29.       if j >= STACKS then
  30.         j := 0;
  31.       FVBO.OpenVertex(i);
  32.       FVBO.Write3f(element_type_vertex, points[i].X, points[i].Y, points[i].Z);
  33.       FVBO.Write2f(element_type_texture_coord, (j/STACKS), (points[i].Y+FRadius)/(FRadius*2));
  34.       inc(j);
  35.     end;
  36.  
  37. ...
  38.  


In der Funktion GenerateBuffer() konnte ich auf Anhieb nichts finden. :(


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 25, 2015 19:51 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Ich muss gestehen, dass ich die Klasse nicht wirklich verstehe. Ich hätte die API anders verwendet.
Eine Kleinigkeit ist mir aufgefallen:
Der IndexCount im Beispiel wird nicht um 1 reduziert. Es ist ja die Anzahl der Elemente. Erklärt aber dein Problem nicht.
Das Beispiel funktioniert bei dir? Hast du mal probiert die Punkte zu verbinden und Quads zu nehmen?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 30, 2015 09:06 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Code:
  1. glDrawElements(GL_POINTS, FVBO.IndexCount-1, GL_UNSIGNED_BYTE, Pointer(FVBO.VertexDataSize));

Du solltest am besten kein Byte als Index größe nehmen, sonnst hast du nur 256 Elemente.
Wenn du auf Triangle gehst wird es auch mit Short bald knapp werden, nimm am besten GL_UNSIGNED_INT.

edit:
Code:
  1. FVBO.WriteIndexUByte(i, i);

Die Zeile solltest du dann auch anpassen.

_________________
"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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.115s | 17 Queries | GZIP : On ]