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

Aktuelle Zeit: Fr Mär 29, 2024 15:51

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Sep 26, 2014 00:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 17, 2003 09:07
Beiträge: 24
Wohnort: Regensburg
Hallo miteinander,

ich möchte nach längerer Pause wieder in OpenGL einsteigen und habe mir die aktuelle dlgOpenGL.pas
und von http://wiki.delphigl.com/index.php/Template-Liste die Templates für API und VCL und geholt.

das VCL-Template (OpenGL15_Template) scheint eigentlich ganz gut zu funktionieren,
die Kommentierung der Zeile 156 habe ich zurückgenommen:
// GoToFullscreen(1600, 1200, 32, 75);
um in den Vollbildmodus zu wechseln. Leider ist es nicht ganz, was ich erwartet habe:
Die Grafikauflösung wird zwar geändert, ich erhalte nur ein schwarzes Fenster in das gezeichnet wird,
nur ist es leider kein Vollbild.

Weiß jemand eventuell, was hier angepasst werden muss, bzw. gibt es eventuell schon
neuere Templates, die von mir gefundenen scheinen ja doch schon etwas betagter zu sein ?
Das API-template habe ich leider gar nicht mehr zum Laufen bekommen.

Ich verwende derzeit Win7/64bit. Delphi 2007.

_________________
Jetzt reicht´s - her mir der Flex !


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 26, 2014 19:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe gerade folgen Code ein bisschen geändert, ich habe eine Auflösung von 640x480 mit meiner Animation.

Getestet mit Lazarus 1.3 und Win7 64bit. Unter Linux wird es nicht laufen, da die Unit Windows vorausgesetzt wird.
Mit Delphi müsste es gehen.

Code:
  1. procedure GoToFullScreen(Form: TForm; pWidth, pHeight, pBPP, pFrequency: word);
  2. var
  3.   dmScreenSettings: DevMode;
  4. begin
  5.   // Fenster vor Vollbild vorbereiten
  6.   Form.WindowState := wsMaximized;
  7.   Form.BorderStyle := bsNone;
  8.   ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  9.   with dmScreenSettings do begin
  10.     dmSize := SizeOf(dmScreenSettings);
  11.     dmPelsWidth := pWidth;                    // Breite
  12.     dmPelsHeight := pHeight;                  // Höhe
  13.     dmBitsPerPel := pBPP;                     // Farbtiefe
  14.     dmDisplayFrequency := pFrequency;         // Bildwiederholfrequenz
  15.     dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
  16.   end;
  17.   if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then begin
  18.     MessageBox(0, 'Konnte Vollbildmodus nicht aktivieren!', 'Error', MB_OK or MB_ICONERROR);
  19.     exit;
  20.   end;
  21. end;    


Hier rufe ich GoTuFullScreen auf:

Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   GoToFullScreen(self, 640, 480, 32, 60); // Der Aufruf.
  4.  
  5.   OpenGLControl := TOpenGLControl.Create(Self);
  6.  
  7.   OpenGLControl.Parent := Self;
  8.   Self.Align := alClient;
  9.   OpenGLControl.Align := alClient;
  10.  
  11.   InitOpenGL;
  12.   OpenGLControl.MakeCurrent;
  13.   ReadExtensions;
  14.   ReadImplementationProperties;
  15.  
  16.   InitScene;
  17. end;


Nachtrag: Ich habe es mit einem alten Delphi6-Programm getestet, das Bild bleibt schwarz.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 26, 2014 21:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 17, 2003 09:07
Beiträge: 24
Wohnort: Regensburg
Hallo Mathias,

wenn ich Self.Align := alClient; vor GoToFullscreen(1600, 1200, 32, 75); eingefüge,
klappt es nun auch bei mir mit Fullscreen :D Danke für den Tipp.

Einen kleinen Schönheitsfehler habe ich allerdings noch, die Windows7 Taskbar und der Startbutton müssen noch verschwinden.
Das Zeichnen eines bunten Dreiecks funktioniert aber schon prima:

Code:
  1.  
  2. // =============================================================================
  3. //   OpenGL1.5 - VCL Template (opengl15_vcl_template.zip)
  4. // =============================================================================
  5. //   Copyright © 2003 by DGL - http://www.delphigl.com
  6. // =============================================================================
  7. //   Contents of this file are subject to the GNU Public License (GPL) which can
  8. // =============================================================================
  9. //   History :
  10. //    Version 1.0 - Initial Release                            (Sascha Willems)
  11. // =============================================================================
  12.  
  13. unit OpenGL15_MainForm;
  14.  
  15. interface
  16.  
  17. uses
  18.   Windows,
  19.   Messages,
  20.   SysUtils,
  21.   Classes,
  22.   Graphics,
  23.   Controls,
  24.   Forms,
  25.   Dialogs,
  26.  
  27.   dglOpenGL;
  28.  
  29. type
  30.   TGLForm = class(TForm)
  31.     procedure FormCreate(Sender: TObject);
  32.     procedure FormDestroy(Sender: TObject);
  33.     procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  34.     procedure FormKeyPress(Sender: TObject; var Key: Char);
  35.   private
  36.     { Private-Deklarationen }
  37.   public
  38.     RC        : HGLRC;
  39.     DC        : HDC;
  40.     ShowFPS   : Boolean;
  41.     FontBase  : GLUInt;
  42.     StartTick : Cardinal;
  43.     Frames    : Integer;
  44.     FPS       : Single;
  45.     procedure GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  46.     procedure BuildFont(pFontName : String);
  47.     procedure PrintText(pX,pY : Integer; const pText : String);
  48.     procedure ShowText;
  49.   end;
  50.  
  51. var
  52.   GLForm: TGLForm;
  53.  
  54. implementation
  55.  
  56. {$R *.dfm}
  57.  
  58. // =============================================================================
  59. //  TForm1.GoToFullScreen
  60. // =============================================================================
  61. //  Wechselt in den mit den Parametern angegebenen Vollbildmodus
  62. // =============================================================================
  63. procedure TGLForm.GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  64. var
  65.  dmScreenSettings : DevMode;
  66. begin
  67. // Fenster vor Vollbild vorbereiten
  68. WindowState := wsMaximized;
  69. BorderStyle := bsNone;
  70. ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  71. with dmScreenSettings do
  72.  begin
  73.  dmSize              := SizeOf(dmScreenSettings);
  74.  dmPelsWidth         := pWidth;                    // Breite
  75.  dmPelsHeight        := pHeight;                   // Höhe
  76.  dmBitsPerPel        := pBPP;                      // Farbtiefe
  77.  dmDisplayFrequency  := pFrequency;                // Bildwiederholfrequenz
  78.  dmFields            := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
  79.  end;
  80. if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then
  81.  begin
  82.  MessageBox(0, 'Konnte Vollbildmodus nicht aktivieren!', 'Error', MB_OK or MB_ICONERROR);
  83.  exit
  84.  end;
  85. end;
  86.  
  87. // =============================================================================
  88. //  TForm1.BuildFont
  89. // =============================================================================
  90. //  Displaylisten für Bitmapfont erstellen
  91. // =============================================================================
  92. procedure TGLForm.BuildFont(pFontName : String);
  93. var
  94.  Font : HFONT;
  95. begin
  96. // Displaylisten für 256 Zeichen erstellen
  97. FontBase := glGenLists(96);
  98. // Fontobjekt erstellen
  99. Font     := CreateFont(16, 0, 0, 0, FW_MEDIUM, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
  100.                        ANTIALIASED_QUALITY, FF_DONTCARE or DEFAULT_PITCH, PChar(pFontName));
  101. // Fontobjekt als aktuell setzen
  102. SelectObject(DC, Font);
  103. // Displaylisten erstellen
  104. wglUseFontBitmaps(DC, 0, 256, FontBase);
  105. // Fontobjekt wieder freigeben
  106. DeleteObject(Font)
  107. end;
  108.  
  109. // =============================================================================
  110. //  TForm1.PrintText
  111. // =============================================================================
  112. //  Gibt einen Text an Position x/y aus
  113. // =============================================================================
  114. procedure TGLForm.PrintText(pX,pY : Integer; const pText : String);
  115. begin
  116. if (pText = '') then
  117.  exit;
  118. glPushAttrib(GL_LIST_BIT);
  119.  glRasterPos2i(pX, pY);
  120.  glListBase(FontBase);
  121.  glCallLists(Length(pText), GL_UNSIGNED_BYTE, PChar(pText));
  122. glPopAttrib;
  123. end;
  124.  
  125. // =============================================================================
  126. //  TForm1.ShowText
  127. // =============================================================================
  128. //  FPS, Hilfstext usw. ausgeben
  129. // =============================================================================
  130. procedure TGLForm.ShowText;
  131. begin
  132. // Tiefentest und Texturierung für Textanzeige deaktivieren
  133. glDisable(GL_DEPTH_TEST);
  134. glDisable(GL_TEXTURE_2D);
  135. // In orthagonale (2D) Ansicht wechseln
  136. glMatrixMode(GL_PROJECTION);
  137. glLoadIdentity;
  138. glOrtho(0,640,480,0, -1,1);
  139. glMatrixMode(GL_MODELVIEW);
  140. glLoadIdentity;
  141. PrintText(5,15, FloatToStr(FPS)+' fps');
  142. glEnable(GL_DEPTH_TEST);
  143. glEnable(GL_TEXTURE_2D);
  144. end;
  145.  
  146. // =============================================================================
  147. //  TForm1.FormCreate
  148. // =============================================================================
  149. //  OpenGL-Initialisierungen kommen hier rein
  150. // =============================================================================
  151. procedure TGLForm.FormCreate(Sender: TObject);
  152. begin
  153. // Wenn gewollt, dann hier in den Vollbildmodus wechseln
  154. // Muss vorm Erstellen des Kontextes geschehen, da durch den Wechsel der
  155. // Gerätekontext ungültig wird!
  156. Self.Align := alClient;
  157.  
  158. GoToFullscreen(1600, 1200, 32, 75);
  159.  
  160. // OpenGL-Funtionen initialisieren
  161.  
  162. InitOpenGL;
  163. // Gerätekontext holen
  164. DC := GetDC(Handle);
  165. // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  166. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  167. // Erstellten Renderkontext aktivieren
  168. ActivateRenderingContext(DC, RC);
  169. // Tiefenpuffer aktivieren
  170. glEnable(GL_DEPTH_TEST);
  171. // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
  172. glDepthFunc(GL_LESS);
  173. // Löschfarbe für Farbpuffer setzen
  174. glClearColor(0,0,0,0);
  175. // Displayfont erstellen
  176. BuildFont('MS Sans Serif');
  177. // Idleevent für Rendervorgang zuweisen
  178. Application.OnIdle := ApplicationEventsIdle;
  179. // Zeitpunkt des Programmstarts für FPS-Messung speichern
  180. StartTick := GetTickCount;
  181.  
  182. end;
  183.  
  184. // =============================================================================
  185. //  TForm1.FormDestroy
  186. // =============================================================================
  187. //  Hier sollte man wieder alles freigeben was man so im Speicher belegt hat
  188. // =============================================================================
  189. procedure TGLForm.FormDestroy(Sender: TObject);
  190. begin
  191. // Renderkontext deaktiveren
  192. DeactivateRenderingContext;
  193. // Renderkontext "befreien"
  194. wglDeleteContext(RC);
  195. // Erhaltenen Gerätekontext auch wieder freigeben
  196. ReleaseDC(Handle, DC);
  197. // Falls wir im Vollbild sind, Bildschirmmodus wieder zurücksetzen
  198. ChangeDisplaySettings(devmode(nil^), 0);
  199. end;
  200.  
  201. // =============================================================================
  202. //  TForm1.ApplicationEventsIdle
  203. // =============================================================================
  204. //  Hier wird gerendert. Der Idle-Event wird bei Done=False permanent aufgerufen
  205. // =============================================================================
  206. procedure TGLForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  207. begin
  208. // In die Projektionsmatrix wechseln
  209. glMatrixMode(GL_PROJECTION);
  210. // Identitätsmatrix laden
  211. glLoadIdentity;
  212. // Viewport an Clientareal des Fensters anpassen
  213. glViewPort(0, 0, ClientWidth, ClientHeight);
  214. // Perspective, FOV und Tiefenreichweite setzen
  215. gluPerspective(60, ClientWidth/ClientHeight, 1, 128);
  216.  
  217. // In die Modelansichtsmatrix wechseln
  218. glMatrixMode(GL_MODELVIEW);
  219. // Identitätsmatrix laden
  220. glLoadIdentity;
  221. // Farb- und Tiefenpuffer löschen
  222. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  223.  
  224. ShowText;
  225.  
  226. // Zum Test ein buntes Dreieck malen (von ShowText ist glOrtho noch drin);
  227. glBegin(GL_TRIANGLES);
  228.   glColor3f(1, 0, 0); glVertex3f(320 - 50,240-50, 0);
  229.   glColor3f(0, 0, 1); glVertex3f(320 + 50,240-50, 0);
  230.   glColor3f(0, 1, 0); glVertex3f(320 +  0,240+50, 0);
  231. glEnd;
  232.  
  233.  
  234. // Hinteren Puffer nach vorne bringen
  235. SwapBuffers(DC);
  236.  
  237. // Windows denken lassen, das wir noch nicht fertig wären
  238. Done := False;
  239.  
  240. // Nummer des gezeichneten Frames erhöhen
  241. inc(Frames);
  242. // FPS aktualisieren
  243. if GetTickCount - StartTick >= 500 then
  244.  begin
  245.  FPS       := Frames/(GetTickCount-StartTick)*1000;
  246.  Frames    := 0;
  247.  StartTick := GetTickCount
  248.  end;
  249. end;
  250.  
  251. // =============================================================================
  252. //  TForm1.FormKeyPress
  253. // =============================================================================
  254. procedure TGLForm.FormKeyPress(Sender: TObject; var Key: Char);
  255. begin
  256.   case Key of
  257.    #27 : Close;
  258.   end;
  259. end;
  260.  
  261. end.

_________________
Jetzt reicht´s - her mir der Flex !


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 26, 2014 23:10 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Einen kleinen Schönheitsfehler habe ich allerdings noch, die Windows7 Taskbar und der Startbutton müssen noch verschwinden.


Bei mir kommt keine Taskbar, ich habe den ganzen BS zur Verfügung.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 27, 2014 00:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 17, 2003 09:07
Beiträge: 24
Wohnort: Regensburg
Hallo Mathias,

ich hab mir mal Lazarus geholt und mein Projekt importiert - hier funktioniert es tatsächlich einwandfrei
mit dem Vollbildmodus. Ich denke es liegt wohl an den Delphi-Libraries ?
Ich werde dann wohl nach Lazarus konvertieren :wink:

Allerdings war ich von der erzeugten EXE-File echt geschockt - 15,9 MB
Ich hoffe das kann man mit den Projekteinstellungen & Co noch deutlich herunterschrauben.
Eigentlich wollte ich als Endziel irgendwann einmal an die 64k-Grenze für EXE-Files kommen. :shock:

Naja, der erste Schritt hat ja trotzdem schonmal geklappt :D

_________________
Jetzt reicht´s - her mir der Flex !


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 27, 2014 02:42 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Da war ich das 1. mal auch erschrocken. Es sind die Debuggereinstellungen und schon ist die exe etwa 10x kleiner.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Vollbildmodus auch unter Linux ?
BeitragVerfasst: Fr Okt 03, 2014 20:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Der Vollbild-Modus klappt unter Windows gut.

Interessant währe eine Lösung, welche auch unter anderen Plattformen geht, z.B. Linux.

Auch währe interessant, wen man eine Liste von den unterstützen Auflösungen ermitteln könnte.

_________________
OpenGL


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