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

Aktuelle Zeit: Mi Jul 09, 2025 17:04

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Ich seh mein Dreieck nich
BeitragVerfasst: Mi Mär 07, 2007 15:43 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Also irgendwie zerbrech ich mir grad denk Kopf darüber warum ich mein gezeichnetes Dreiekc nicht sehen kann. Im Moment bin och wohl für meinen eigenen Fehler blind und zeig es euch deshalb. Kann mir vielleicht jemand von euch sagen wo hier das Problem liegt? Ich muss ja irgendwo in der Zeichenroutine etwas falsch gemacht haben, denn das Template ist von euch ;-)

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. // GoToFullscreen(1600, 1200, 32, 75);
  157.                      
  158. // OpenGL-Funtionen initialisieren
  159. InitOpenGL;
  160. // Gerätekontext holen
  161. DC := GetDC(Handle);
  162. // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  163. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  164. // Erstellten Renderkontext aktivieren
  165. ActivateRenderingContext(DC, RC);
  166. // Tiefenpuffer aktivieren
  167. glEnable(GL_DEPTH_TEST);
  168. // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
  169. glDepthFunc(GL_LESS);
  170. // Löschfarbe für Farbpuffer setzen
  171. glClearColor(0,0,0,0);
  172. // Displayfont erstellen
  173. BuildFont('MS Sans Serif');
  174. // Idleevent für Rendervorgang zuweisen
  175. Application.OnIdle := ApplicationEventsIdle;
  176. // Zeitpunkt des Programmstarts für FPS-Messung speichern
  177. StartTick := GetTickCount;
  178. end;
  179.  
  180. // =============================================================================
  181. //  TForm1.FormDestroy
  182. // =============================================================================
  183. //  Hier sollte man wieder alles freigeben was man so im Speicher belegt hat
  184. // =============================================================================
  185. procedure TGLForm.FormDestroy(Sender: TObject);
  186. begin
  187. // Renderkontext deaktiveren
  188. DeactivateRenderingContext;
  189. // Renderkontext "befreien"
  190. wglDeleteContext(RC);
  191. // Erhaltenen Gerätekontext auch wieder freigeben
  192. ReleaseDC(Handle, DC);
  193. // Falls wir im Vollbild sind, Bildschirmmodus wieder zurücksetzen
  194. ChangeDisplaySettings(devmode(nil^), 0);
  195. end;
  196.  
  197. //==============================================================================
  198. // Der Render-Abschnitt
  199. //==============================================================================
  200. // Hier werden die Objekte gerendert.
  201. //==============================================================================
  202.  
  203.  
  204.  
  205. // =============================================================================
  206. //  TForm1.ApplicationEventsIdle
  207. // =============================================================================
  208. //  Hier wird gerendert. Der Idle-Event wird bei Done=False permanent aufgerufen
  209. // =============================================================================
  210. procedure TGLForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  211. begin
  212. // In die Projektionsmatrix wechseln
  213. glMatrixMode(GL_PROJECTION);
  214. // Identitätsmatrix laden
  215. glLoadIdentity;
  216. // Viewport an Clientareal des Fensters anpassen
  217. glViewPort(0, 0, ClientWidth, ClientHeight);
  218. // Perspective, FOV und Tiefenreichweite setzen
  219. gluPerspective(60, ClientWidth/ClientHeight, 1, 128);
  220.  
  221. // In die Modelansichtsmatrix wechseln
  222. glMatrixMode(GL_MODELVIEW);
  223. // Identitätsmatrix laden
  224. glLoadIdentity;
  225.  
  226.   glTranslatef(0,0,-6);
  227.  
  228.   glBegin(GL_TRIANGLES);
  229.     glVertex3f(-1,-1, 0);
  230.     glVertex3f( 1,-1, 0);
  231.     glVertex3f( 0, 1, 0);
  232.   glEnd;
  233.  
  234. // Farb- und Tiefenpuffer löschen
  235. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  236.  
  237. ShowText;
  238.  
  239. // Hinteren Puffer nach vorne bringen
  240. SwapBuffers(DC);
  241.  
  242. // Windows denken lassen, das wir noch nicht fertig wären
  243. Done := False;
  244.  
  245. // Nummer des gezeichneten Frames erhöhen
  246. inc(Frames);
  247. // FPS aktualisieren
  248. if GetTickCount - StartTick >= 500 then
  249.  begin
  250.  FPS       := Frames/(GetTickCount-StartTick)*1000;
  251.  Frames    := 0;
  252.  StartTick := GetTickCount
  253.  end;
  254. end;
  255.  
  256. // =============================================================================
  257. //  TForm1.FormKeyPress
  258. // =============================================================================
  259. procedure TGLForm.FormKeyPress(Sender: TObject; var Key: Char);
  260. begin
  261. case Key of
  262.  #27 : Close;
  263. end;
  264. end;
  265.  
  266. end.
  267.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 07, 2007 15:57 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Auf Anhieb würde ich sagen, Du setzt die Farbe nicht für das Dreieck und das wird dann imho schwarz gezeichnet und nachdem Deine ClearColor auch schwarz ist, siehst Du eine invertierte ostfriesische Kriegsflagge.
Generell ist sowieso zu empfehlen, die ClearColor auf was quietschiges zu setzen, um eben solche Effekte zu vermeiden. Die kannst Du wenn das Projekt fertig ist immernoch auf schwarz setzen.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: re
BeitragVerfasst: Mi Mär 07, 2007 16:08 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Mhh ich dachte immer die Standartfarbe von OpenGL zum zeichnen von Objekten ist Weiß? Also ein weißes Quadrat auf schwarzem Grund sollte man, denke ich, sehen können. Könnte der Fehler auch noch woanders liegen?
An der ClearColor liegt es nicht, da hab ich eben ausprobiert.
Ich probier mal das Dreieck zu färben, ob man es dann sieht. Oder liegt es vielleciht an den Koordinaten?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 07, 2007 16:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Hm, meiner Meinung nach liegt da der Hund begraben:

Code:
  1.  
  2. glTranslatef(0,0,-6);  
  3. glBegin(GL_TRIANGLES);    
  4.  glVertex3f(-1,-1, 0);    
  5.  glVertex3f( 1,-1, 0);    
  6.  glVertex3f( 0, 1, 0);  
  7. glEnd;
  8.  
  9. // Farb- und Tiefenpuffer löschen
  10. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //<= HIER!!!
  11.  
  12. ShowText;
  13. // Hinteren Puffer nach vorne bringen
  14. SwapBuffers(DC);
  15.  



Den Buffer zuerst zu löschen und dann nach vorne zu bringen ist imho nicht ganz so günstig, wenn man was sehen will. :)

Das glClear kommt imho an den Anfang der Renderprozedur.
Puffer löschen => neu befüllen => nach vorne bringen


(zumindest wenn mich meine Logik nicht komplett täuscht ;) )

cya,
Deathball


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: re
BeitragVerfasst: Mi Mär 07, 2007 17:25 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Bing und schon sieht man ein buntes Dreieck ^^ Danke für deine Hilfe hab glCLear jetz vor glMatrixMode(GL_MODELVIEW); gesetzt.


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 » Einsteiger-Fragen


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 | 14 Queries | GZIP : On ]