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

Aktuelle Zeit: Fr Jul 18, 2025 07:20

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



Ein neues Thema erstellen Auf das Thema antworten  [ 69 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 21, 2005 21:00 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
Ich poste jetzt mal den GANZEN Quelltext (ich hab noch ein paar Funktionen hinzugefügt):

Code:
  1. unit Engine;
  2.  
  3. interface
  4.  
  5. uses
  6.   classes,
  7.   Windows,
  8.   Messages,
  9.   SysUtils,
  10.   Graphics,
  11.   Controls,
  12.   Forms,
  13.   Dialogs,
  14.   glBMP,
  15.  
  16.   dglOpenGL;
  17.  
  18. type
  19.  
  20.   TEngine = class
  21.     private
  22.       RC: HGLRC;
  23.       DC: HDC;
  24.       StartTick : Cardinal;
  25.       Width: integer;
  26.       Height: integer;
  27.       Frames: integer;
  28.       _Handle: HWND;
  29.       _FPS: single;
  30.       Fullscreen: Boolean;
  31.       // -------------------------------------------------------------------------
  32.       // Initialisieren, \"Killen\" und Rendern
  33.       // -------------------------------------------------------------------------
  34.     public
  35.       function getversion: String;
  36.       procedure init(fHandle:HWND);
  37.       procedure kill;
  38.       procedure BeginRender;
  39.       procedure EndRender;
  40.       procedure GetFPS;
  41.       procedure LoadTexture(Filename: String;glBMP:TGLBMP);
  42.       procedure DrawSkyBox(North,East,South,West,Top,Bottom:TGLBMP;distance:integer);
  43.  
  44.     published
  45.       property Handle: Hwnd read _Handle write _Handle;
  46.       property FPS: single read _FPS write _FPS;
  47.   end;
  48.  
  49.   var
  50.     Textures: array of TGLBMP;
  51.  
  52. implementation
  53.  
  54. function Tengine.getversion: String;
  55. begin
  56. Result := 'Engine 0.01';
  57. end;
  58.  
  59. procedure TEngine.Init(fHandle:HWND);
  60. var
  61. i: integer;
  62. begin
  63. // Wenn gewollt, dann hier in den Vollbildmodus wechseln
  64. // Muss vorm Erstellen des Kontextes geschehen, da durch den Wechsel der
  65. // Gerätekontext ungültig wird!
  66.  
  67. // OpenGL-Funtionen initialisieren
  68. InitOpenGL;
  69. // Gerätekontext holen
  70. DC := GetDC(fHandle);
  71. // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  72. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  73. // Erstellten Renderkontext aktivieren
  74. ActivateRenderingContext(DC, RC);
  75. // Tiefenpuffer aktivieren
  76. glEnable(GL_DEPTH_TEST);
  77. // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) \"durchlassen\"
  78. glDepthFunc(GL_LESS);
  79. // Löschfarbe für Farbpuffer setzen
  80. glClearColor(0,0,0,0);
  81. // Displayfont erstellen
  82. //BuildFont('MS Sans Serif');
  83. // Idleevent für Rendervorgang zuweisen
  84. //Application.OnIdle := ApplicationEventsIdle;
  85. // Zeitpunkt des Programmstarts für FPS-Messung speichern
  86. StartTick := GetTickCount;
  87. end;
  88.  
  89. procedure TEngine.Kill;
  90. begin
  91. // Renderkontext deaktiveren
  92. DeactivateRenderingContext;
  93. // Renderkontext \"befreien\"
  94. wglDeleteContext(RC);
  95. // Erhaltenen Gerätekontext auch wieder freigeben
  96. ReleaseDC(Handle, DC);
  97. // Falls wir im Vollbild sind, Bildschirmmodus wieder zurücksetzen
  98. ChangeDisplaySettings(devmode(nil^), 0);
  99. end;
  100.  
  101. procedure TEngine.BeginRender;
  102. begin
  103. // In die Projektionsmatrix wechseln
  104. glMatrixMode(GL_PROJECTION);
  105. // Identitätsmatrix laden
  106. glLoadIdentity;
  107. // Viewport an Clientareal des Fensters anpassen
  108. glViewPort(0, 0, Width, Height);
  109. // Perspective, FOV und Tiefenreichweite setzen
  110. gluPerspective(60, Width/Height, 1, 128);
  111.  
  112. // In die Modelansichtsmatrix wechseln
  113. glMatrixMode(GL_MODELVIEW);
  114. // Identitätsmatrix laden
  115. glLoadIdentity;
  116. // Farb- und Tiefenpuffer löschen
  117. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  118. end;
  119.  
  120. procedure TEngine.EndRender;
  121. begin
  122. // Hinteren Puffer nach vorne bringen
  123. SwapBuffers(DC);
  124. end;
  125.  
  126. procedure TEngine.GetFPS;
  127. begin
  128. inc(Frames);
  129. // FPS aktualisieren
  130. if GetTickCount - StartTick >= 500 then
  131.  begin
  132.  FPS       := Frames/(GetTickCount-StartTick)*1000;
  133.  Frames    := 0;
  134.  StartTick := GetTickCount
  135.  end;
  136. end;
  137.  
  138. procedure TEngine.LoadTexture(Filename: String;glBMP:TGLBMP);
  139. begin
  140. glBMP := TGLBMP.Create;
  141. glBMP.LoadImage(Filename);
  142. glBMP.GenTexture;
  143. end;
  144.  
  145.  
  146. procedure TEngine.DrawSkyBox(North,East,South,West,Top,Bottom:TGLBMP;distance:integer);
  147. begin
  148. North.Bind;
  149. glBegin(GL_QUADS);
  150.   glTexCoord2f(0,0);
  151.   glVertex3f(-distance,-distance,-distance);
  152.   glTexCoord2f(0,1);
  153.   glVertex3f(-distance,distance,-distance);
  154.   glTexCoord2f(1,1);
  155.   glVertex3f(distance,distance,-distance);
  156.   glTexCoord2f(1,0);
  157.   glVertex3f(distance,-distance,-distance);
  158. glEnd;
  159.  
  160. East.Bind;
  161. glbegin(GL_QUADS);
  162.   glTexCoord2f(0,0);
  163.   glVertex3f(distance,-distance,-distance);
  164.   glTexCoord2f(0,1);
  165.   glVertex3f(distance,distance,-distance);
  166.   glTexCoord2f(1,1);
  167.   glVertex3f(distance,distance,distance);
  168.   glTexCoord2f(1,0);
  169.   glVertex3f(distance,-distance,distance);
  170. glEnd;
  171.  
  172. South.Bind;
  173. glbegin(GL_QUADS);
  174.   glTexCoord2f(0,0);
  175.   glVertex3f(distance,-distance,distance);
  176.   glTexCoord2f(0,1);
  177.   glVertex3f(distance,distance,distance);
  178.   glTexCoord2f(1,1);
  179.   glVertex3f(-distance,distance,distance);
  180.   glTexCoord2f(1,0);
  181.   glVertex3f(-distance,-distance,distance);
  182. glEnd;
  183.  
  184. West.Bind;
  185. glbegin(GL_QUADS);
  186.   glTexCoord2f(0,0);
  187.   glVertex3f(-distance,-distance,distance);
  188.   glTexCoord2f(0,1);
  189.   glVertex3f(-distance,distance,distance);
  190.   glTexCoord2f(1,1);
  191.   glVertex3f(-distance,distance,-distance);
  192.   glTexCoord2f(1,0);
  193.   glVertex3f(-distance,-distance,-distance);
  194. glEnd;
  195.  
  196. West.Bind;
  197. glbegin(GL_QUADS);
  198.   glTexCoord2f(0,0);
  199.   glVertex3f(-distance,-distance,distance);
  200.   glTexCoord2f(0,1);
  201.   glVertex3f(-distance,distance,distance);
  202.   glTexCoord2f(1,1);
  203.   glVertex3f(-distance,distance,-distance);
  204.   glTexCoord2f(1,0);
  205.   glVertex3f(-distance,-distance,-distance);
  206. glEnd;
  207.  
  208. Top.Bind;
  209. glbegin(GL_QUADS);
  210.   glTexCoord2f(0,0);
  211.   glVertex3f(-distance,distance,-distance);
  212.   glTexCoord2f(0,1);
  213.   glVertex3f(-distance,distance,distance);
  214.   glTexCoord2f(1,1);
  215.   glVertex3f(distance,distance,distance);
  216.   glTexCoord2f(1,0);
  217.   glVertex3f(distance,distance,-distance);
  218. glEnd;
  219.  
  220. Bottom.Bind;
  221. glbegin(GL_QUADS);
  222.   glTexCoord2f(0,0);
  223.   glVertex3f(-distance,-distance,distance);
  224.   glTexCoord2f(0,1);
  225.   glVertex3f(-distance,-distance,-distance);
  226.   glTexCoord2f(1,1);
  227.   glVertex3f(distance,-distance,-distance);
  228.   glTexCoord2f(1,0);
  229.   glVertex3f(distance,-distance,distance);
  230. glEnd;      
  231. end;
  232.  
  233. end.


So, des war die Engine (wahrscheinlich hab ich da nen Fehler. Ich hab noch nie ne eigene Unit gemacht!).

Code:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, dglOpenGL, Morph3d, AppEvnts, ExtCtrls, glBMP;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     ApplicationEvents1: TApplicationEvents;
  12.     procedure FormCreate(Sender: TObject);
  13.     procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  14.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  15.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  16.       Shift: TShiftState);
  17.   private
  18.     { Private-Deklarationen }
  19.   public
  20.     { Public-Deklarationen }
  21.   end;
  22.  
  23. var
  24.   Form1: TForm1;
  25.   Engine: TEngine;
  26.   FScreen: Boolean;
  27.   SkyText: array [0..5] of TGLBMP;
  28.  
  29. implementation
  30.  
  31. {$R *.dfm}
  32.  
  33. procedure TForm1.FormCreate(Sender: TObject);
  34. var
  35. Side: integer;
  36. begin
  37. Engine := TEngine.Create;
  38. Engine.init(Form1.Handle);
  39.  
  40. For Side := 0 to 5 do begin
  41. SkyText[Side] := TGLBMP.Create;
  42. SkyText[Side].LoadImage('C:\Dokumente und Einstellungen\Flo\Desktop\OpenGL\skybox'+ IntToStr(Side + 1) + '.bmp');
  43. SkyText[Side].GenTexture;
  44. end;
  45. end;
  46.  
  47. procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
  48.   var Done: Boolean);
  49. begin
  50. Engine.BeginRender;
  51.  
  52. Engine.DrawSkyBox(SkyText[0],SkyText[1],SkyText[2],SkyText[3],SkyText[4],SkyText[5],15);
  53.  
  54. Engine.EndRender;
  55.  
  56. Engine.GetFPS;
  57. Caption := Engine.GetVersion + ' [' + FloatToStr(Engine.FPS) + ' fps]';
  58. Done := False;
  59. end;
  60.  
  61. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  62. begin
  63. Engine.Kill;
  64. end;
  65.  
  66. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  67.   Shift: TShiftState);
  68. begin
  69. close;
  70. end;
  71.  
  72. end.


Und, hier die Testunit!


Zuletzt geändert von LH_Freak am Di Mai 24, 2005 19:24, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 21, 2005 21:07 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Poste mal bitte das vollständige ausführbare Projekt als Anhang (zip). Müßte eigentlich mit der Größe noch hinkommen. Das ist sicherlich einfacher als jetzt den ganzen Quelltext durchzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 21, 2005 21:47 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
Okay, hier.


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 22, 2005 11:03 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
Der Fehler liegt hier:

glViewPort(0, 0, Width, Height);
// Perspective, FOV und Tiefenreichweite setzen
gluPerspective(60, Width/Height, 1, 128);

width und height wurden nicht initialisiert.

außerdem sollte vll. auch besser GL_TEXTURE_2D enabled werden :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 22, 2005 11:16 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
Danke, hab ich geändert. Des Bild bleibt aber trotzdem schwarz!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 22, 2005 13:44 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
auf was hast du die gesetzt?
Bei zu kleinen werten sind die außerhalb des blickfelds soweit ich das sehe
bei 800 sieht man immerhin eine seite


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 22, 2005 14:04 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
Ich hab Width und Height dekliniert!
Die kann man dann im Programm vorm initialisiern eingeben!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 22, 2005 15:14 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
???
ich kann grad nich ganz folgen, was du damit sagen willst


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 22, 2005 15:33 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
Grizzly hat geschrieben:
width und height wurden nicht initialisiert.

außerdem sollte vll. auch besser GL_TEXTURE_2D enabled werden :wink:


So, und das hab ich gemacht!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 22, 2005 15:56 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
und dann wollte ich wissen, auf welchen wert du width + height gesetzt hast

weil bei entsprechenden werten sollte er was anzeigen (tut er bei mir jedenfalls)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 22, 2005 16:00 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
1024 x 768


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 23, 2005 13:14 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
Juhu, ich hab's hinbekommen!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 23, 2005 13:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Und wie? Nach diesem Kampf interessiert mich die Lösung schon!

_________________
"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: So Jan 23, 2005 13:26 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
ich hab das in die Engine-unit eingefügt:

Code:
  1.       property fWidth: integer read _Width write _Width;
  2.       property fHeight: integer read _Height write _Height;


und dann in FormCreate:

Code:
  1. Engine := TEngine.Create;
  2. Engine.Handle := Form1.Handle;
  3.  
  4. Engine.fWidth := ClientWidth;
  5. Engine.fHeight := ClientHeight;
  6.  
  7. Engine.init;


Zuletzt geändert von LH_Freak am Di Mai 24, 2005 19:26, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 23, 2005 13:33 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
jetzt geht des Texturenzeichnen nicht!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 69 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5  Nächste
Foren-Übersicht » Programmierung » OpenGL


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.017s | 15 Queries | GZIP : On ]