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

Aktuelle Zeit: Mo Jul 14, 2025 21:59

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



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Okt 30, 2002 09:48 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ja, ich weiss ist ne noob frage, aber ich stehe vor einem Geschwindigkeitsproblem in meinem Spiel.

Ich Rendere, ein würfel zur zeit über GL_QUADS
Also über nen Viereck, wäre es schneller/besser 2 Dreiecke statt 1 Viereck zu verwenden ???

Noch ne frage, wie kann ich nen Cylinder bzw ne Kugel manuel berechnen lassen, samt Texture koordinaten. Da ja gluSphere und gluCylinder ich keinerlei einfluss auf die Texture koordinaten habe.
und die texture über die texture matrix anzusteuern, wäre viel zu aufwendig.

Da ich kein Mathegenie bin, und das trotz vielen versuchen nur wurst rausbekomme bräuchte ich eure hilfe.
Es wird doch irgend ein Mathegenie geben unter euch, der mir mal schnell nen source für cylnder bzw kugel geben kann.

Danke schonmal,
Finalspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 30, 2002 15:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
Ich Rendere, ein würfel zur zeit über GL_QUADS  
Also über nen Viereck, wäre es schneller/besser 2 Dreiecke statt 1 Viereck zu verwenden ???  

Im Normalfall sind GL_TRIANGLES schneller, da die GPU die gesendete Geometrie nich erst noch in Dreiecke zerlegen muss, wie das bei Quads der Fall wäre.
Bei einem Würfel (besonders wenn er als DisplayListe dargestellt wird) ist der Geschwindigkeitsgewinn aber eher vernachlässigbar.

Zitat:
Noch ne frage, wie kann ich nen Cylinder bzw ne Kugel manuel berechnen lassen, samt Texture koordinaten. Da ja gluSphere und gluCylinder ich keinerlei einfluss auf die Texture koordinaten habe.  
und die texture über die texture matrix anzusteuern, wäre viel zu aufwendig.  

Quellcode für die Generation einer Kugel (der stammt nicht von mir...ich hab ihn nur von C nach Delphi konvertiert und leicht abgeändert) :

Code:
  1.  
  2.  
  3. procedure DrawSphere(CX, CY, CZ, Radius : TGLFloat; N : Integer);
  4.  
  5. var
  6.  
  7.  i,j                           : Integer;
  8.  
  9.  theta1,theta2,theta3 : TGLFloat;
  10.  
  11.  X, Y, Z, px, py, pz    : TGLFloat;
  12.  
  13. begin
  14.  
  15. Result := 0;
  16.  
  17. if Radius < 0 then
  18.  
  19.  Radius :=-Radius;
  20.  
  21. if n < 0 then
  22.  
  23.  n := -n;
  24.  
  25. if (n < 4) or (Radius <= 0) then
  26.  
  27.  begin
  28.  
  29.  glBegin(GL_POINTS);
  30.  
  31.  &nbsp;glVertex3f(CX, CY, CZ);
  32.  
  33.  glEnd;
  34.  
  35.  exit;
  36.  
  37.  end;
  38.  
  39. for j := 0 to n div 2 -1 do
  40.  
  41.  begin
  42.  
  43.  theta1 := J*2*PI/N - PI/2;
  44.  
  45.  theta2 := (J+1)*2*PI/n - PI/2;
  46.  
  47.  glBegin(GL_TRIANGLE_STRIP);
  48.  
  49.  for i := 0 to n do
  50.  
  51.  &nbsp;begin
  52.  
  53.  &nbsp;theta3 := i*2*PI/N;
  54.  
  55.  &nbsp;x := cos(theta2) * cos(theta3);
  56.  
  57.  &nbsp;y := sin(theta2);
  58.  
  59.  &nbsp;z := cos(theta2) * sin(theta3);
  60.  
  61.  &nbsp;px := CX + Radius*x;
  62.  
  63.  &nbsp;py := CY + Radius*y;
  64.  
  65.  &nbsp;pz := CZ + Radius*z;
  66.  
  67.  &nbsp;glNormal3f(X,Y,Z);
  68.  
  69.  &nbsp;glTexCoord2f(1-I/n, 2*(J+1)/n);
  70.  
  71.  &nbsp;glVertex3f(px,py,pz);
  72.  
  73.  &nbsp;X := cos(theta1) * cos(theta3);
  74.  
  75.  &nbsp;Y := sin(theta1);
  76.  
  77.  &nbsp;Z := cos(theta1) * sin(theta3);
  78.  
  79.  &nbsp;px := CX + Radius*X;
  80.  
  81.  &nbsp;py := CY + Radius*Y;
  82.  
  83.  &nbsp;pz := CZ + Radius*Z;
  84.  
  85.  &nbsp;glNormal3f(X,Y,Z);
  86.  
  87.  &nbsp;glTexCoord2f(1-i/n, 2*j/n);
  88.  
  89.  &nbsp;glVertex3f(px,py,pz);
  90.  
  91.  &nbsp;end;
  92.  
  93.  glEnd;
  94.  
  95.  end;
  96.  
  97. end;
  98.  
  99.  


und hier der Code für einen Zylinder.Aber Achtung!Nur Texturenkoordinaten für die Seitenwände...der Code kann noch Fehler enthalten, da ich ihn nur mal zu Testzwecken erstellt habe, dafür aber keine weitere Verwendung hatte :

Code:
  1.  
  2.  
  3. function Sin1(grad : Single) : Single;
  4.  
  5. begin
  6.  
  7.  &nbsp;Sin1 := sin(grad * Pi / 180);
  8.  
  9. end;
  10.  
  11.  
  12.  
  13. function Cos1(grad : Single) : Single;
  14.  
  15. begin
  16.  
  17.  &nbsp;Cos1 := cos(grad * Pi / 180);
  18.  
  19. end;
  20.  
  21.  
  22.  
  23. procedure GenerateCylinder(pRadius, pHeight : Single;pSides, pHeightSegments : Integer);
  24.  
  25. var
  26.  
  27.  Coords : array of record
  28.  
  29.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x,z : Single;
  30.  
  31.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end;
  32.  
  33.  i,j &nbsp; &nbsp;: Integer;
  34.  
  35.  y &nbsp; &nbsp; &nbsp;: Single;
  36.  
  37.  DDiff &nbsp;: Single;
  38.  
  39.  HDiff &nbsp;: Single;
  40.  
  41. begin
  42.  
  43. SetLength(Coords, pSides+1);
  44.  
  45. DDiff := 360/pSides;
  46.  
  47. HDiff := pHeight/pHeightSegments;
  48.  
  49. y &nbsp; &nbsp; := 0;
  50.  
  51. for i := 0 to pSides do
  52.  
  53.  begin
  54.  
  55.  Coords[i].x := RadToDeg(Sin1(i*DDiff))*pRadius;
  56.  
  57.  Coords[i].z := RadToDeg(Cos1(i*DDiff))*pRadius;
  58.  
  59.  end;
  60.  
  61. glBegin(GL_TRIANGLES);
  62.  
  63. for j := 0 to pHeightSegments-1 do
  64.  
  65.  begin
  66.  
  67.  for i := 0 to pSides-1 do
  68.  
  69.  &nbsp;begin
  70.  
  71.  &nbsp;glTexCoord2f(i/pSides*4, &nbsp; &nbsp; j/pHeightSegments); &nbsp; &nbsp; glVertex3f(Coords[i].x, &nbsp; y, &nbsp; &nbsp; &nbsp; Coords[i].z);
  72.  
  73.  &nbsp;glTexCoord2f((i+1)/pSides*4, j/pHeightSegments); &nbsp; &nbsp; glVertex3f(Coords[i+1].x, y, &nbsp; &nbsp; &nbsp; Coords[i+1].z);
  74.  
  75.  &nbsp;glTexCoord2f((i+1)/pSides*4, (j+1)/pHeightSegments); glVertex3f(Coords[i+1].x, y+HDiff, Coords[i+1].z);
  76.  
  77.  &nbsp;// -----------------------------------------------
  78.  
  79.  &nbsp;glTexCoord2f(i/pSides*4, &nbsp; &nbsp; (j+1)/pHeightSegments); glVertex3f(Coords[i].x, &nbsp; y+HDiff, Coords[i].z);
  80.  
  81.  &nbsp;glTexCoord2f((i+1)/pSides*4, (j+1)/pHeightSegments); glVertex3f(Coords[i+1].x, y+HDiff, Coords[i+1].z);
  82.  
  83.  &nbsp;glTexCoord2f(i/pSides*4, &nbsp; &nbsp; j/pHeightSegments); &nbsp; &nbsp; glVertex3f(Coords[i].x, &nbsp; y, &nbsp; &nbsp; &nbsp; Coords[i].z);
  84.  
  85.  &nbsp;// ---- Deckel ------------------------------------
  86.  
  87.  &nbsp;glVertex3f(Coords[i].x, pHeight, Coords[i].z);
  88.  
  89.  &nbsp;glVertex3f(0, pHeight, 0);
  90.  
  91.  &nbsp;glVertex3f(Coords[i+1].x, pHeight, Coords[i+1].z);
  92.  
  93.  &nbsp;// ---- Boden ------------------------------------
  94.  
  95.  &nbsp;glVertex3f(Coords[i].x, 0, Coords[i].z);
  96.  
  97.  &nbsp;glVertex3f(0, 0, 0);
  98.  
  99.  &nbsp;glVertex3f(Coords[i+1].x, 0, Coords[i+1].z);
  100.  
  101.  &nbsp;end;
  102.  
  103.  y := y +HDiff;
  104.  
  105.  end;
  106.  
  107. glEnd;
  108.  
  109. end;
  110.  
  111.  

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


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 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]