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

Aktuelle Zeit: Fr Jul 18, 2025 08:16

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Feb 17, 2009 20:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Aug 12, 2008 16:50
Beiträge: 22
Hallo,

Ich bn gerade dabei, mich an de NeHe-Tutorials zu schulen. Leider funktioniert der Teil mit den Displaylisten nicht richtig, obwohl ich sogar Teile davon aus dem Quelltext übernommen habe...
Es zeichnet zwar die Boxen, nicht aber die Deckel und so ganz will mir nicht einleuchten, warum. Es wird wohl an der Funktion glGenLists(2) liegen oder ich habe irgendwo was übersehen, was ich aber nicht glaube, weil ich mir den Code inzwischen eigentlich auch schon ziemlich genau angeschaut habe.

Hier ist er jedenfalls:
Code:
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, DGLOpenGL, ExtCtrls, glBitmap;
  9.  
  10. type
  11.   TForm1 = class(TForm)
  12.     Timer1: TTimer;
  13.     procedure FormCreate(Sender: TObject);
  14.     procedure InitGL;
  15.     procedure FormResize(Sender: TObject);
  16.     procedure FormDestroy(Sender: TObject);
  17.     procedure Render;
  18.     procedure Timer1Timer(Sender: TObject);
  19.     procedure ErrorHandler;
  20.     procedure LoadGLTextures;
  21.   private
  22.     fTexture: TglBitmap2D;
  23.     FrameCount: Cardinal;
  24.   public
  25.     DC: HDC;
  26.     RC: HGLRC;
  27.   end;
  28.  
  29. var
  30.   Form1: TForm1;
  31.   box, top: GLuint;
  32.   xrot, yrot: GLfloat;
  33.   texture: Array[0..0] of Gluint;
  34.   TextureImage: Array[0..0] of TglBitmap2D;
  35.   boxcol: Array[0..4] of Array[0..2] of GLfloat = ((1.0, 0.0, 0.0),(1.0, 0.5, 0.0),
  36.                                                    (1.0, 1.0, 0.0),(0.0, 1.0, 0.0),
  37.                                                    (0.0, 1.0, 1.0));
  38.   topcol: Array[0..4] of Array[0..2] of GLfloat = ((0.5, 0.0, 0.0),(0.5, 0.25, 0.0),
  39.                                                    (0.5, 0.5, 0.0),(0.0, 0.5, 0.0),
  40.                                                    (0.0, 0.5, 0.5));
  41.  
  42. implementation
  43.  
  44. {$R *.dfm}
  45.  
  46. const
  47.   NearClipping = 0.1;
  48.   FarClipping = 100.0;
  49.  
  50. procedure BuildLists;
  51. begin
  52.   box := glGenLists(2);
  53.   glNewList(box, GL_COMPILE);
  54.   glBegin(GL_QUADS);
  55.     glNormal3f(0.0,-1.0,0.0);
  56.     glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0);
  57.     glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0);
  58.     glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0);
  59.     glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0);
  60.  
  61.     glNormal3f(0.0,0.0,1.0);
  62.     glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0);
  63.     glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 1.0);
  64.     glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 1.0);
  65.     glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0);
  66.  
  67.     glNormal3f(0.0,0.0,-1.0);
  68.     glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
  69.     glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0);
  70.     glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, -1.0);
  71.     glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
  72.  
  73.     glNormal3f(1.0,0.0,0.0);
  74.     glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
  75.     glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0);
  76.     glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, 1.0);
  77.     glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0);
  78.  
  79.     glNormal3f(-1.0,0.0,0.0);
  80.     glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
  81.     glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0);
  82.     glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0);
  83.     glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0);
  84.   glEnd;
  85.   glEndList;
  86.   top := box + 1;
  87.   glNewList(top, GL_COMPILE);
  88.   glBegin(GL_QUADS);
  89.     glNormal3f(0.0,1.0,0.0);
  90.     glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0);
  91.     glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0);
  92.     glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0, 1.0);
  93.     glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0);
  94.   glEnd;
  95.   glEndList;
  96.  
  97. end;
  98.  
  99. procedure TForm1.Render;
  100. var
  101.   xloop, yloop: GLuint;
  102. begin
  103.   FormResize(nil);
  104.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  105.   glBindTexture(GL_TEXTURE_2D, texture[0]);
  106.  
  107.   for yloop := 1 to 5 do
  108.   begin
  109.     for xloop := 0 to yloop-1 do
  110.     begin
  111.       glLoadIdentity;
  112.       glTranslatef(1.4+(xloop*2.8)-(yloop*1.4),((6.0-yloop)*2.4)-7.0,-20.0);
  113.       glRotatef(45.0-(2.0*yloop)+xrot,1.0,0.0,0.0);
  114.       glRotatef(45.0+yrot,0.0,1.0,0.0);
  115.       glColor3fv(@boxcol[yloop-1]);
  116.       glCallList(box);
  117.       glColor3fv(@topcol[yloop-1]);
  118.       glCallList(top);
  119.     end;
  120.   end;
  121.   SwapBuffers(DC);
  122. end;
  123.  
  124. procedure TForm1.LoadGLTextures;
  125. begin
  126.   TextureImage[0] := TglBitmap2D.Create(PChar(ExtractFileDir(paramStr(0))+'\Data\cube.bmp'));
  127.   TextureImage[0].FlipVert;
  128.   glGenTextures(1, @texture[0]);
  129.   glBindTexture(GL_TEXTURE_2D, texture[0]);
  130.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  131.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  132.   glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0].Width, TextureImage[0].Height,0, GL_BGR, GL_UNSIGNED_BYTE, TextureImage[0].DataPtr);
  133.   TextureImage[0].Free;
  134. end;
  135.  
  136. procedure TForm1.FormCreate(Sender: TObject);
  137. begin
  138.   DC := GetDC(Handle);
  139.   if not InitOpenGL then Application.Terminate;
  140.   RC := CreateRenderingContext( DC, [opDoubleBuffered], 32, 24, 0,0,0, 0);
  141.   ActivateRenderingContext(DC, RC);
  142.   InitGL;
  143. end;
  144.  
  145. procedure TForm1.InitGL;
  146. begin
  147.   LoadGLTextures;
  148.   BuildLists;
  149.   glEnable(GL_TEXTURE_2D);
  150.   glShadeModel(GL_SMOOTH);
  151.   glClearColor(0.0, 0.0, 0.0, 0.0);
  152.   glClearDepth(1.0);
  153.   glEnable(GL_DEPTH_TEST);
  154.   glDepthFunc(GL_LEQUAL);
  155.   glEnable(GL_LIGHT0);
  156.   glEnable(GL_LIGHTING);
  157.   glEnable(GL_COLOR_MATERIAL);
  158.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  159. end;
  160.  
  161. procedure TForm1.FormResize(Sender: TObject);
  162. begin
  163.   glViewPort(0, 0, ClientWidth, ClientHeight);
  164.   glMatrixMode(GL_PROJECTION);
  165.   glLoadIdentity;
  166.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  167.  
  168.   glMatrixMode(GL_MODELVIEW);
  169.   glLoadIdentity;
  170. end;
  171.  
  172. procedure TForm1.FormDestroy(Sender: TObject);
  173. begin
  174.   fTexture.Free;
  175.   DeactivateRenderingContext;
  176.   DestroyRenderingContext(RC);
  177.   ReleaseDC(Handle, DC);
  178. end;
  179.  
  180. procedure TForm1.Timer1Timer(Sender: TObject);
  181. begin
  182.   inc(FrameCount);
  183.   Render;
  184.   If FrameCount = 20 then
  185.     begin
  186.       ErrorHandler;
  187.       FrameCount := 0;
  188.     end;
  189. end;
  190.  
  191. procedure TForm1.ErrorHandler;
  192. begin
  193.   Form1.Caption := gluErrorString(glGetError);
  194. end;
  195.  
  196. end.
  197.  


Könnt ihr mir sagen, was ich falsch gemacht habe?


Zuletzt geändert von Typhox am Mi Feb 18, 2009 07:24, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 17, 2009 23:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
In der Renderschleife kurz vor dem Swapbuffers steht ein "glBegin(GL_QUADS);" bei dem ich kein "glEnd" entdecken kann. Sieht aus, als wär es dort vergessen worden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 18, 2009 07:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Aug 12, 2008 16:50
Beiträge: 22
Hm, gut, das habe ich dort bei meinen Tests irgendwie vergessen^^
Leider ist es nicht der Grund dafür, dass es nicht geht, denn es funktioniert immer noch nicht :(
Trotzdem danke.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 18, 2009 12:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn bestimmte Teile nicht gerendert werden liegts evtl. an einer falschen Renderreihenfolge deiner Eckpunkte. Entweder die einfach mal umdrehen oder Backfaceculling deaktivieren. Ausserdem muss es nicht sein dass gelGenLists hintereinanderliegende IDs liefert, also ist box+1 evtl. keine der von glGenLists erzeugten IDs, also auch hier besser jeweils für box und top ein eigenes glGenLists(1) aufrufen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 18, 2009 14:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Aug 12, 2008 16:50
Beiträge: 22
Gut, vielen Dank, backface-culling hatte ich sowieso aus Sicherheitsgründen deaktiviert und das mit glGenLists wollte ich gerade ausprobieren, vorher jedoch noch was anderes was mir gerade so zufällig eingefallen ist^^
Es lag einfach daran, dass ich die Variable "top" genannt habe und diese wohl im Laufe der Geschichte aufgrund ihres Namens neu zugeordnet oder falsch interpretiert worden ist. Inzwischen heißt sie "topi", und jetzt funktioniert endlich alles :-)
Vielen Dank, ich denke mal, das mit glGenLists() wird mir eventuell noch wann anders weiterhelfen.


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 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.009s | 16 Queries | GZIP : On ]