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

Aktuelle Zeit: So Jul 13, 2025 13:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Nov 21, 2005 17:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 21, 2005 16:59
Beiträge: 3
Hallo zusammen!

Hab vor einigen Tagen angefangen mit mit Opengl zu beschäftigen und habe mir jetzt erstmal vorgenommen eine kleine 2D Demo zu basteln. Allerdings gibt es jetzt schon probleme beim einfachen zeichnen. Ich habe mir eure VCL-Template runtergeladen und die ist auch super, allerdings will er nichts zeichnen :( Die Frames werden wie gewünscht ausgegeben, aber von Polygonen keine Spur... Jetzt habe ich in den Soucre Dateien von euch ein paar mal gesehen, dass es immer eine MEthode SetupPixelFormat gibt, habe aber im Online-Wiki keine Infos dazu gefunden. Wozu ist das gut und braucht man diese Methode?
Ich habe auch schon versucht, die Methode zu kopieren und dann aufzurufen, aber das Fenster blieb nach wie vor schwarz...

[edit] achso hab ganz vergessen: Es soll erstmal nur zu Testzwecken ein Dreieck gemalt werden, aber ich denke darauf wärt ihr auch noch gekommen ;) [/edit]

Ich habe allerdings auch das Gefühl, dass ihr warscheinlich noch andere Fehler finden werdet, aber ich kann mir nicht erklären, warum nichts gezeichnet wird....

Hier der Code:
Code:
  1.  
  2. unit Main;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows,
  8.   Messages,
  9.   SysUtils,
  10.   Classes,
  11.   Graphics,
  12.   Controls,
  13.   Forms,
  14.   Dialogs,
  15.   Textures,
  16.   dglOpenGL;
  17.  
  18. type
  19.   TGLForm = class(TForm)
  20.     procedure FormCreate(Sender: TObject);
  21.     procedure FormDestroy(Sender: TObject);
  22.     procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  23.     procedure FormKeyPress(Sender: TObject; var Key: Char);
  24.   private
  25.     { Private-Deklarationen }
  26.   public
  27.     RC        : HGLRC;
  28.     DC        : HDC;
  29.     ShowFPS   : Boolean;
  30.     FontBase  : GLUInt;
  31.     StartTick : Cardinal;
  32.     Frames    : Integer;
  33.     FPS       : Single;
  34.     procedure GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  35.     procedure BuildFont(pFontName : String);
  36.     procedure PrintText(pX,pY : Integer; const pText : String);
  37.     procedure ShowText;
  38.     procedure DrawDot();
  39.   end;
  40.  
  41. var
  42.   GLForm: TGLForm;
  43.   MyTex : Array[0..5] of glUInt;
  44.  
  45. implementation
  46.  
  47. {$R *.dfm}
  48.  
  49. // =============================================================================
  50. //  TForm1.GoToFullScreen
  51. // =============================================================================
  52. //  Wechselt in den mit den Parametern angegebenen Vollbildmodus
  53. // =============================================================================
  54. procedure TGLForm.GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  55. var
  56.  dmScreenSettings : DevMode;
  57. begin
  58. end;
  59.  
  60. // =============================================================================
  61. //  TForm1.BuildFont
  62. // =============================================================================
  63. //  Displaylisten für Bitmapfont erstellen
  64. // =============================================================================
  65. procedure TGLForm.BuildFont(pFontName : String);
  66. var
  67.  Font : HFONT;
  68. begin
  69. // Displaylisten für 256 Zeichen erstellen
  70. FontBase := glGenLists(96);
  71. // Fontobjekt erstellen
  72. Font     := CreateFont(16, 0, 0, 0, FW_MEDIUM, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
  73.                        ANTIALIASED_QUALITY, FF_DONTCARE or DEFAULT_PITCH, PChar(pFontName));
  74. // Fontobjekt als aktuell setzen
  75. SelectObject(DC, Font);
  76. // Displaylisten erstellen
  77. wglUseFontBitmaps(DC, 0, 256, FontBase);
  78. // Fontobjekt wieder freigeben
  79. DeleteObject(Font)
  80. end;
  81.  
  82. // =============================================================================
  83. //  TForm1.PrintText
  84. // =============================================================================
  85. //  Gibt einen Text an Position x/y aus
  86. // =============================================================================
  87. procedure TGLForm.PrintText(pX,pY : Integer; const pText : String);
  88. begin
  89. if (pText = '') then
  90.  exit;
  91. glPushAttrib(GL_LIST_BIT);
  92.  glRasterPos2i(pX, pY);
  93.  glListBase(FontBase);
  94.  glCallLists(Length(pText), GL_UNSIGNED_BYTE, PChar(pText));
  95. glPopAttrib;
  96. end;
  97.  
  98. // =============================================================================
  99. //  TForm1.ShowText
  100. // =============================================================================
  101. //  FPS, Hilfstext usw. ausgeben
  102. // =============================================================================
  103. procedure TGLForm.ShowText;
  104. begin
  105. // Tiefentest und Texturierung für Textanzeige deaktivieren
  106. glDisable(GL_DEPTH_TEST);
  107. glDisable(GL_TEXTURE_2D);
  108. // In orthagonale (2D) Ansicht wechseln
  109. glMatrixMode(GL_PROJECTION);
  110. glLoadIdentity;
  111. glOrtho(0,640,480,0, -1,1);
  112. glMatrixMode(GL_MODELVIEW);
  113. glLoadIdentity;
  114. PrintText(5,15, FloatToStr(FPS)+' fps');
  115. glEnable(GL_DEPTH_TEST);
  116. glEnable(GL_TEXTURE_2D);
  117. end;
  118.  
  119. // =============================================================================
  120. //  TForm1.FormCreate
  121. // =============================================================================
  122. //  OpenGL-Initialisierungen kommen hier rein
  123. // =============================================================================
  124. procedure TGLForm.FormCreate(Sender: TObject);
  125. begin
  126. // Wenn gewollt, dann hier in den Vollbildmodus wechseln
  127. // Muss vorm Erstellen des Kontextes geschehen, da durch den Wechsel der
  128. // Gerätekontext ungültig wird!
  129. // GoToFullscreen(1024, 768, 32, 75);
  130.                      
  131. // OpenGL-Funtionen initialisieren
  132. InitOpenGL;
  133. // Gerätekontext holen
  134. DC := GetDC(Handle);
  135. // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  136. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  137. // Erstellten Renderkontext aktivieren
  138. ActivateRenderingContext(DC, RC);
  139. // Tiefenpuffer aktivieren
  140. glEnable(GL_DEPTH_TEST);
  141. // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) \"durchlassen\"
  142. glDepthFunc(GL_LESS);
  143. // 2D Texturen
  144. glEnable(GL_TEXTURE_2D);
  145. // Löschfarbe für Farbpuffer setzen
  146. glClearColor(0,0,0,0);
  147. // Displayfont erstellen
  148. BuildFont('MS Sans Serif');
  149. // Idleevent für Rendervorgang zuweisen
  150. Application.OnIdle := ApplicationEventsIdle;
  151. // Zeitpunkt des Programmstarts für FPS-Messung speichern
  152. StartTick := GetTickCount;
  153. // Textur namens 'dot.tga' laden
  154. LoadTexture('images\dot.tga', MyTex[0], False); // <--- den Befehl könnt ihr löschen, soweit bin ich noch nich <!-- s:P --><img src=\"{SMILIES_PATH}/icon_razz.gif\" alt=\":P\" title=\"Razz\" /><!-- s:P -->
  155. end;
  156.  
  157. // =============================================================================
  158. //  TForm1.DrawDot
  159. // =============================================================================
  160. //  Hier wird ein Rechteck gemalt und mit der Textur belegt
  161. // =============================================================================
  162. procedure TGLForm.DrawDot(); // Warum wird hier nix gezeichnet???
  163. begin
  164. glTranslatef(-1.5, 0,-6);
  165. glBegin(GL_TRIANGLES);
  166.   glVertex3f(-1,-1, 0);  
  167.   glVertex3f( 1,-1, 0);
  168.   glVertex3f( 0, 1, 0);
  169. glEnd;
  170. end;
  171.  
  172. // =============================================================================
  173. //  TForm1.FormDestroy
  174. // =============================================================================
  175. //  Hier sollte man wieder alles freigeben was man so im Speicher belegt hat
  176. // =============================================================================
  177. procedure TGLForm.FormDestroy(Sender: TObject);
  178. begin
  179. // Renderkontext deaktiveren
  180. DeactivateRenderingContext;
  181. // Renderkontext \"befreien\"
  182. wglDeleteContext(RC);
  183. // Erhaltenen Gerätekontext auch wieder freigeben
  184. ReleaseDC(Handle, DC);
  185. // Falls wir im Vollbild sind, Bildschirmmodus wieder zurücksetzen
  186. ChangeDisplaySettings(devmode(nil^), 0);
  187. end;
  188.  
  189. // =============================================================================
  190. //  TForm1.ApplicationEventsIdle
  191. // =============================================================================
  192. //  Hier wird gerendert. Der Idle-Event wird bei Done=False permanent aufgerufen
  193. // =============================================================================
  194. procedure TGLForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  195. begin
  196. // In die Projektionsmatrix wechseln
  197. glMatrixMode(GL_PROJECTION);
  198. // Identitätsmatrix laden
  199. glLoadIdentity;
  200. // Viewport an Clientareal des Fensters anpassen
  201. glViewPort(0, 0, ClientWidth, ClientHeight);
  202. // 2D Perspektive definieren
  203. glOrtho(0,640,480,0, 0,128);
  204.  
  205. // In die Modelansichtsmatrix wechseln
  206. glMatrixMode(GL_MODELVIEW);
  207. // Identitätsmatrix laden
  208. glLoadIdentity;
  209. // Farb- und Tiefenpuffer löschen
  210. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  211.  
  212. DrawDot();
  213. ShowText;
  214.  
  215. // Hinteren Puffer nach vorne bringen
  216. SwapBuffers(DC);
  217.  
  218. // Windows denken lassen, das wir noch nicht fertig wären
  219. Done := False;
  220.  
  221. // Nummer des gezeichneten Frames erhöhen
  222. inc(Frames);
  223. // FPS aktualisieren
  224. if GetTickCount - StartTick >= 500 then
  225.  begin
  226.  FPS       := Frames/(GetTickCount-StartTick)*1000;
  227.  Frames    := 0;
  228.  StartTick := GetTickCount
  229.  end;
  230. end;
  231.  
  232. // =============================================================================
  233. //  TForm1.FormKeyPress
  234. // =============================================================================
  235.  
  236. procedure TGLForm.FormKeyPress(Sender: TObject; var Key: Char);
  237. begin
  238. case Key of
  239.  #27 : Close;
  240. end;
  241. end;
  242.  
  243. end.
  244.  


Ich bedanke mich im Vorraus

MfG Marius


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 21, 2005 17:56 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 21, 2005 17:11
Beiträge: 10
Wohnort: Siegburg
kann mir mal endlich bitte bitte sagen was ihr für lektüre benutzt???
ich hab über all gesucht aber nix für delphi opengl oder delphigl gefunden ausser euren tutorials!
bitte antwortet mir!
*verzweifel*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 21, 2005 18:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 21, 2005 16:59
Beiträge: 3
was meinst du denn überhaupt?

mit den tutorials im dgl wiki kann man doch schon einiges anfangen...

http://wiki.delphigl.com/index.php/Tutorial


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 21, 2005 18:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Axalus. So läuft das hier nicht ab! Es kann nicht angehen, dass du ständig in anderen Themen deine völlig Themenfremden Fragen postest. Erstelle ein eigenes Thema oder bleib bei dem Thema was ich aus deinem ersten Beitrag erstellt habe. Wenn du konkrete Problem hast, dann kannst du diese im Forum auch stellen und dir wird geholfen. In einem eigenen Thema versteht sich. Für alles andere gibt es noch das Wiki was für genau solche Probleme auch gemacht wurde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 21, 2005 18:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
@der-cain:
Verschieb mal die Zeile "glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);" an den Anfang der Prozedur.
Außerdem füg mal, nur zu Testzwecken (Ich weiss, dass du 2d brauchst), statt glOrtho diese Zeile ein:
Code:
  1. gluPerspective(90, GLForm.ClientWidth/GLForm.ClientHeight, 1, 128);

Schreib mir dann mal, obs geht.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 21, 2005 18:15 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Im Orthomodus bewegst du dich mit - aus dem sichtbaren Bereich.
Probier es mal mit:
Code:
  1. procedure TGLForm.DrawDot(); // Warum wird hier nix gezeichnet???
  2. begin
  3.   glTranslatef(150, 150,-6);
  4.   glBegin(GL_TRIANGLES);
  5.     glVertex3f(-10,-10, 0);
  6.     glVertex3f( 10,-10, 0);
  7.     glVertex3f( 0, 10, 0);
  8.   glEnd;
  9. end;

Oder das was La Boda geschrieben hat.

Übrigens versuch mal ein 1 Pixel grosses Dreieck auf einem 640*480 grossen Fenster zu sehen ;)
Im Orthomodus definierst du die Grösse der "Weltkoordinaten"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 21, 2005 18:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Jetzt wos i0n0s schreibt, fällts mir auch auf.
Code:
  1. glOrtho(0,640,480,0, 0,128);

Hier musst du nicht die \"Auflösung\" eingeben, das machst du mit glViewport.
Hier gibst du praktisch die Weltkoordinaten an mit denen du einen Obejkte später verschiebst. Und in der Tat ist ein ein Pixel großes Dreieck ziemlich verloren in so ner großen, schwarzen Fläche \";)\"

Recht angenehme Werte wären also
Code:
  1. glOrtho(-10, 10, -10, 10, 0,128);

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 21, 2005 18:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 21, 2005 16:59
Beiträge: 3
juhu danke ionos und boda das war die lösung.... scheint ale müsste ich mir die sache mit der kamera nochmal ansehen *g*

also erstmal vielen Dank, ich meld mich dann wieder :P


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 21, 2005 18:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Cain: Habe bei dir mal die Pascaltags hinzugefügt. Das ist für Delphicode besser als die Codetags.

Zu deiner Frage. Wenn die Methode kein GL oder WGL voranstehen hat oder sonst von OpenGL Handelt, dann ist die Wahrscheinlichkeit groß, dass diese Methode von Windows stammt oder eine eigene ist. Für den Fall, dass diese von Windows stammt gibt es die MSDNs und da findet man auch eine Beschreibung zu SetPixelFormat. Aber in deinem Fall brauchst du dich darum nicht zu kümmern, da der Aufruf von SetupPixelFormat bereits in der Methode CreateRenderContext statt findet. Diese Methode stammt aus dem OpenGL Header und erstellt ohne Umwege einen gültigen Context.

Zu dem warum du nichts siehst.

In dem ShowText setzt du noch einmal den 2D Modus. Den setzt du aber bereits in ApplicationOnIdle. Den ViewPort und das glOrtho solltest du eigentlich auch nur setzen, wenn sich die Größe des Fenster ändert. Also würde es bei einem fixen Fenster genügen, wenn du dies direkt nach dem Initialisieren deines RCs setzt.

Sonst Hat i0n0s recht. Das Greieck verschiebst du in den unsichtbaren bereich. Du könntest das Translate auch erst mal komplett weg lassen.

Angaben bei glOrtho: Das kommt immer darauf an was man vor hat. Ich verwende bei glOtho IMMER die Auflösung des Viewports. Ich will aber auch IMMER Pixelgenau zeichnen. Wenn du das nicht vorhättest würden auch andere Werte funktionieren. Kommt da auch drauf an wie du es gerne am liebsten hast.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 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 ]