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

Aktuelle Zeit: Fr Mai 10, 2024 08:37

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Nov 03, 2013 16:36 
Offline
DGL Member

Registriert: Fr Feb 04, 2011 19:05
Beiträge: 13
Hallo zusammen,

ich habe im orthogonalen Modus folgendes Problem:

Wenn ich das Fenster vergrößere / verkleinere wird der Bereich in dem OpenGL zeichnet zwar angepasst (der Hintergrund wird gezeichnet), allerdings bleibt das gezeichnete Viereck gleich groß. Vergrößere ich dieses manuell, so wird es an der alten Fensterkante abgeschnitten. Im Anhang habe ich entsprechende Screenshots hochgeladen.

Folgender Code wird beim Vergrößern ausgeführt:

Code:
  1.   glViewport(0, 0, ClientWidth, ClientHeight);
  2.  
  3.   glMatrixMode(GL_PROJECTION);
  4.   glLoadIdentity;
  5.   glOrtho(0,1024,0,768,0,128);
  6.   glMatrixMode(GL_MODELVIEW);
  7.  
  8.   IdleHandler(Sender, tmpBool);
  9.  


Das sollte meiner Meinung nach richtig sein. Hat jemand eine Idee, wo der Fehler liegen könnte?

Zu meiner Umgebung:

IDE: Lazarus 1.0.12 (64 Bit)
Compiler: fpc 2.6.4
DGL: 4.4 (aktuellste Version)
OS: Win 7 HP 64Bit
Graka: Intel GMA 4500MHD (aktuell 160 MB shared RAM; Treiber Version 8.15.10.2302 - angeblich die aktuellste)
CPU: Intel Core 2 Duo SU7300

Vielen Dank im Voraus

MfG

Wuppertaler


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Nov 03, 2013 16:43 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

wie genau zeichnest du dein Quad? Und wann machst du die Änderung der Projektionsmatrix?

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Nov 03, 2013 16:57 
Offline
DGL Member

Registriert: Fr Feb 04, 2011 19:05
Beiträge: 13
Ich habe hier jetzt mal den gesamten Quelltext eingefügt:

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


Dies entspricht größtenteils den ersten beiden Tutorials (Quickstart + 1) - einige unnötige Befehle habe ich bei der Fehlersuche gelöscht oder auskommentiert. Hier ist die Quadratgröße manuell vergrößert - es handelt sich also um den Quelltext von Screenshot 3.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Nov 03, 2013 17:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Da haben wir den Fehler, sowas hab ich mir schon gedacht. Mit glOrtho sagst du, das dein 2D-Bereich 1024x768 Pixel groß ist, aber beim Zeichnen des Quad rechnest du die Größe des Fensters mit ein. Wenn du ein Bildschirmfüllendes Quad zeichen willst hast du 2 Möglichkeiten:
1. glOrtho auf feste Werte setzen (so wie jetzt) und das Quad mit genau den selben Werten zeichnen (also bei dir 1024x768)
2. glOrtho an die Größe des Fenster anpassen (mit ClientWidth und ClientHeight) und dann auch das Quad abhängig zur Fenstergröße zeichnen.
Welches der beiden Fälle für deine Anwendung besser geeignet ist musst du dann entscheiden, das hängt teilweise von der Anwendung ab. Mit der 2. Methode hättest du das gleiche Verhalten wie bei normalen Oberfläschen-Programmen.

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Nov 03, 2013 17:55 
Offline
DGL Member

Registriert: Fr Feb 04, 2011 19:05
Beiträge: 13
Diese Größenanpassung habe ich wie schon geschrieben nur testweise eingebaut. Der 2. Screenshot zeigt das Ergebnis, wo Zeile 116-121 korrekt sind:

Code:
  1.   glBegin(GL_QUADS);
  2.     glColor3f(1, 0, 0); glVertex3f(   0,   0, 0);
  3.     glColor3f(0, 1, 0); glVertex3f(1024,   0, 0);
  4.     glColor3f(0, 0, 1); glVertex3f(1024, 768, 0);
  5.     glColor3f(1, 1, 0); glVertex3f(   0, 768, 0);
  6.   glEnd;


Dennoch wird der genutzte Zeichenbereich wie in Screenshot 2 gezeigt nicht vergrößert. Bei gluPerspective ist dies übrigens der Fall.

Skaliere ich sowhol in glOrtho, als auch beim Zeichnen wird de fakto ebenfalls nicht skaliert. Das Ergebnis sieht identisch aus. Auch dort habe ich stattdessen einen blauen Rand in dem ich nix rendern kann bzw. wo das gerenderte einfach nicht angezeigt wird, da es für die Graka vermutlich außerhalb des Frustrums liegt. Die genannte Anpassung diente übrigens genau dazu - also dazu im den blauen Bereich etwas zu rendern.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Nov 03, 2013 19:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Prinzipell machst alles richtig, aber da der Fehler ja irgendwo liegen muss würde ich an deiner stelle mal ein breakpoints setzen und schauen ob auch alles richtig aufgerufen wird.

P.S. Die Idle-Funktion kann man auch ohne das @ setzen, zu mindestens bei mir. Ist zwar wahrscheinlich nicht der fehler, aber das was du beschreibst könnte entweder daher kommen, dass der viewport nicht geändert wird, oder du nur einmal zeichnest.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Nov 03, 2013 19:50 
Offline
DGL Member

Registriert: Fr Feb 04, 2011 19:05
Beiträge: 13
Danke - das wars!

Irgendwas hat den Eintrag im Objektinspektor gelöscht. Daher war die Prozedur nicht mehr verknüpft.

Zum @: Dann hast du den Delphi-Kompatibilitätsmodus aktiviert. Standardmäßig wird in Lazarus der Zeiger auf die Prozedur erwartet.


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 » 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.026s | 17 Queries | GZIP : On ]