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

Aktuelle Zeit: Fr Jul 18, 2025 00:40

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: GL_QUADS Problem
BeitragVerfasst: Di Mai 09, 2006 14:00 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Hallo erstmal :wink:
Ich hab da so ein Problem mit GL_QUADS. Wenn ich ein Quadrat zeichnen will wird dieses nicht ausgegeben. Ersetze ich den Befehl hingegen durch GL_LINE_STRIP (es sind immernoch dieselben Koords, hab nur den Befehl geändert), werden die Linien
korrekt ausgegeben. Ich benutze dglOpenGL.pas, das Template (minimal verändert) aus den Einsteiger Tuts und Delphi7. Im Template hab ich nur den ErrorHandler als funktion deklariert, damit ich die Fehlermeldung gleich hinter der fps Anzeige ausgeben kann. Anbei der Code:

Code:
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, dglOpenGL;
  9.  
  10. type
  11.   TForm1 = class(TForm)
  12.     procedure FormCreate(Sender: TObject);
  13.     procedure IdleHandler(Sender: TObject; var Done: Boolean);
  14.     procedure FormResize(Sender: TObject);
  15.     procedure FormDestroy(Sender: TObject);
  16.   private { Private declarations }
  17.     StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter
  18.     Frames, DrawTime                  : Cardinal; //& Timebased Movement
  19.     procedure SetupGL;
  20.     procedure Init;
  21.     procedure Render;
  22.     function ErrorHandler: string;
  23.   public    { Public declarations }
  24.     DC                                : HDC;  //Handle auf Zeichenfläche
  25.     RC                                : HGLRC;//Rendering Context
  26.   end;
  27.  
  28. var
  29.   Form1: TForm1;
  30.   NearClipping: integer;
  31.   FarClipping: integer;
  32.  
  33. implementation
  34.  
  35. {$R *.dfm}
  36.  
  37. procedure TForm1.FormCreate(Sender: TObject);
  38. begin
  39.   DC:= GetDC(Handle);
  40.   if not InitOpenGL then Application.Terminate;
  41.   RC:= CreateRenderingContext( DC,
  42.                                [opDoubleBuffered],
  43.                                32,
  44.                                24,
  45.                                0,0,0,
  46.                                0);
  47.   ActivateRenderingContext(DC, RC);
  48.   SetupGL;
  49.   Init;
  50.   Application.OnIdle := IdleHandler;
  51. end;
  52.  
  53. procedure TForm1.Init;
  54. begin
  55.   NearClipping := 1;
  56.   FarClipping  := 1000;
  57. end;
  58.  
  59. procedure TForm1.SetupGL;
  60. begin
  61.   glClearColor(0.0, 0.0, 0.3, 0.0); //Hintergrundfarbe
  62.   glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  63.   glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
  64. end;
  65.  
  66. procedure TForm1.FormResize(Sender: TObject);
  67. var tmpBool : Boolean;
  68. begin
  69.   glViewport(0, 0, ClientWidth, ClientHeight);
  70.   glMatrixMode(GL_PROJECTION);
  71.   glLoadIdentity;
  72.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  73.  
  74.   glMatrixMode(GL_MODELVIEW);
  75.   glLoadIdentity;
  76.   IdleHandler(Sender, tmpBool);
  77. end;
  78.  
  79. procedure TForm1.FormDestroy(Sender: TObject);
  80. begin
  81.   DeactivateRenderingContext;
  82.   DestroyRenderingContext(RC);
  83.   ReleaseDC(Handle, DC);
  84. end;
  85.  
  86. procedure TForm1.Render;
  87. begin
  88.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  89.  
  90.   glMatrixMode(GL_PROJECTION);
  91.   glLoadIdentity;
  92.   gluPerspective(60, ClientWidth/ClientHeight, NearClipping, FarClipping);
  93.  
  94.   glTranslatef(0, 0, -5);
  95.  
  96.   glMatrixMode(GL_MODELVIEW);
  97.   glLoadIdentity;
  98.  
  99.   glBegin(GL_LINE_STRIP);
  100.    glColor3f(1,0,0); glVertex3f(-1, -1, 0);
  101.    glColor3f(0,1,0); glVertex3f(-1, 1, 0);
  102.    glColor3f(0,0,1); glVertex3f(1, 1, 0);
  103.    glColor3f(1,1,0); glVertex3f(1, -1, 0);
  104.   glEnd;
  105.  
  106.  { glBegin(GL_TRIANGLES);
  107.     glVertex3f(-1, 0, 0);
  108.     glVertex3f(0, 1, 0);
  109.     glVertex3f(1, 0, 0);
  110.   glEnd;
  111.  }
  112.  
  113.   SwapBuffers(DC);
  114. end;
  115.  
  116. function TForm1.ErrorHandler;
  117. begin
  118.   result := gluErrorString(glGetError);
  119. end;
  120.  
  121. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  122. begin
  123.   StartTime:= GetTickCount;
  124.   Render;
  125.   DrawTime:= GetTickCount - StartTime;
  126.   Inc(TimeCount, DrawTime);
  127.   Inc(FrameCount);
  128.  
  129.   if TimeCount >= 1000 then begin
  130.     Frames:= FrameCount;
  131.     TimeCount:= TimeCount - 1000;
  132.     FrameCount:= 0;
  133.     Caption:= InttoStr(Frames) + 'FPS '+ErrorHandler;
  134.     ErrorHandler;
  135.   end;
  136.  
  137.   Done:= false;
  138. end;
  139.  
  140. end.
  141.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 09, 2006 14:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hallo.

Also für mich schreit es danach, dass du bei deinen Koordinaten eine falsche Reihenfolge benutzt hast. Üblich ist eine Reihenfolge gegen den Uhrzeigersinn. und wenn du dir deine Koordinaten mal im Kopf vorstellst. Na was passiert dann. Genau. Die sind mit dem Uhrzeigersinn. Somit siehst du in deinem Falle nur eine ausgeblendete Rückseite. Also nichts.

Du kannst ...
1: GL_CULL_FACE deaktivieren. Damit würden sowohl vorder als auch Rückseite gezeichnet werden. Nicht unbedingt optimal.

2: die Vorderseite zur Rückseite deklarieren was aber alle anderen externen Units und Entwickler verwirren könnte. Auch nicht so dolle.

3: die Reihenfolge der Punkte verändern. Und damit solltest du deine Fläche sehen. Wenn ich gerade nicht total verwirrt bin. Bin mir da heute absolut nicht sicher. ;-)

Code:
  1. glBegin(GL_LINE_STRIP);
  2.   glColor3f(1,0,0); glVertex3f(-1, -1, 0);
  3.   glColor3f(1,1,0); glVertex3f(1, -1, 0);
  4.   glColor3f(0,0,1); glVertex3f(1, 1, 0);
  5.   glColor3f(0,1,0); glVertex3f(-1, 1, 0);
  6. glEnd;

Das sollte es eigentlich gewesen sein.

PS: Herzlich Willkommen im Forum.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: hui
BeitragVerfasst: Di Mai 09, 2006 14:53 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Tatsächlich, du hast Recht.
Jetz gehts es auch. Für die zukunft merke ich mir dann gegen den Uhrzeigersinn ^^
Ich hab mich grad eben noch mal Member Forum vorgestellt, da ich hier sicher noch sehr oft etwas posten werde:
Ausserdem find ich ein bisschen persönliches immer toll.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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 ]