OpenGL Delphigl Tutorial 2
spacer
Autor Nachricht
JungerIslaender
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 374

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Sa 03.12.11 02:14 
Ich wollt mich mal in die OpenGL Welt begeben und hab auf delphigl gestöbert und von anfang an die Tutorials gemacht. Dabei ist folgendes bei rausgekommen:
ausblenden volle Höhe Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DGLOpenGL, ExtCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Init;
procedure FormResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure IdleHandler(Sender: TObject; var Done: Boolean);
private { Private declarations }
StartTime, TimeCount, FrameCount : Cardinal; //FrameCounter
Frames, DrawTime : Cardinal; //& Timebased Movement
procedure SetupGL;
procedure Render;
procedure ErrorHandler;
public { Public declarations }
DC : HDC; //Handle auf Zeichenfläche
RC : HGLRC;//Rendering Context
end;

var
Form1: TForm1;

const
NearClipping = 1;
FarClipping = 1000;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
DC:= GetDC(Handle);
if not InitOpenGL then Application.Terminate;
RC:= CreateRenderingContext( DC,
[opDoubleBuffered],
32,
24,
0,0,0,
0);
ActivateRenderingContext(DC, RC);
SetupGL;
Init;
Application.OnIdle := IdleHandler;
end;


procedure TForm1.SetupGL;
begin
glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
glEnable(GL_DEPTH_TEST); //Tiefentest aktivieren
glEnable(GL_CULL_FACE); //Backface Culling aktivieren
end;


procedure TForm1.Init;
begin
//Nichts zu Initialisieren
end;


procedure TForm1.FormResize(Sender: TObject);
var tmpBool : Boolean;
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
IdleHandler(Sender, tmpBool);
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
DeactivateRenderingContext;
DestroyRenderingContext(RC);
ReleaseDC(Handle, DC);
end;


procedure TForm1.Render;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity;

glTranslatef(0, 0, -10);

glBegin(GL_QUADS);
glColor3f(1,0,0); glVertex3f(-1, -1, 0);
glColor3f(1,0,0); glVertex3f( 1, -1, 0);
glColor3f(1,0,0); glVertex3f( 1, 1, 0);
glColor3f(1,0,0); glVertex3f(-1, 1, 0);
glEnd;

SwapBuffers(DC);
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
(* inc(FrameCount);
Render;
If FrameCount = 20 then
begin
ErrorHandler;
FrameCount := 0;
end; *)

end;


procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
begin
StartTime:= GetTickCount;
Render;
DrawTime:= GetTickCount - StartTime;
Inc(TimeCount, DrawTime);
Inc(FrameCount);

if TimeCount >= 1000 then begin
Frames:= FrameCount;
TimeCount:= TimeCount - 1000;
FrameCount:= 0;
Caption:= InttoStr(Frames) + 'FPS';
ErrorHandler;
end;

Done:= false;
end;


procedure TForm1.ErrorHandler;
begin
Form1.Caption := gluErrorString(glGetError);
end;


end.


Funtioniert auch wunderbar.

Sobald ich in TForm1.Render allerdings etwas anderes einfüge, wie z.B. ein Beispiel wie das hier:
ausblenden volle Höhe Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
  // Der Bildschirm wird "gecleart"
glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);

// Die World-Matrix wird zurück gesetzt
glLoadIdentity;
// Kamera leicht weg bewegen vom Objekt (sinngemäß!!!)
glTranslatef( 0, 0, -10);

glColor3f(1,0,0);
glBegin(GL_TRIANGLES);
glVertex3f(-1.0,-1.0, 0.0);
glVertex3f( 0.0, 1.0, 0.0);
glVertex3f( 1.0,-1.0, 0.0);
glEnd();

glLoadIdentity;
// Nun ein kleines Stück darüber ein Dreick zeichnen
glTranslatef( 0, 2, -10);

glColor3f(1,1,1);
glBegin(GL_TRIANGLES);
glVertex3f(-1.0,-1.0, 0.0);
glVertex3f( 0.0, 1.0, 0.0);
glVertex3f( 1.0,-1.0, 0.0);
glEnd();

glLoadIdentity;
glTranslatef( 0, -2, -10); // Und ein kleines Stück darunter!

glColor3f(0,0,1);
glBegin(GL_TRIANGLES);
glVertex3f(-1.0,-1.0, 0.0);
glVertex3f( 0.0, 1.0, 0.0);
glVertex3f( 1.0,-1.0, 0.0);
glEnd();

{ Technisch gesehen würde man dieses Problem eher mit glPopMatrix und }
{ glPushMatrix lösen. Wir setzen hingegen jedesmal die Einheits-Matrix und }
{ dann die Transformations-Matrix mitsamt Camera-Abstand neu! }


Passiert nichts mehr. Und ich verstehe nicht warum?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
EE-Maler
Beiträge: 1754
Erhaltene Danke: 62

Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
BeitragVerfasst: Sa 03.12.11 12:08 
Du darfst ja auch nicht die Initialisierung der Matrix weglassen (Zeile 97-101).

_________________
a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
JungerIslaender Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 374

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Sa 03.12.11 15:31 
ausblenden volle Höhe Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
procedure TForm1.Render;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef( 0, 0, -10);

glLoadIdentity;
// Nun ein kleines Stück darüber ein Dreick zeichnen
glTranslatef( 0, 2, -10);

glColor3f(1,1,1);
glBegin(GL_TRIANGLES);
glVertex3f(-1.0,-1.0, 0.0);
glVertex3f( 0.0, 1.0, 0.0);
glVertex3f( 1.0,-1.0, 0.0);
glEnd();

glLoadIdentity;
glTranslatef( 0, -2, -10); // Und ein kleines Stück darunter!

glColor3f(0,0,1);
glBegin(GL_TRIANGLES);
glVertex3f(-1.0,-1.0, 0.0);
glVertex3f( 0.0, 1.0, 0.0);
glVertex3f( 1.0,-1.0, 0.0);
glEnd();

{ Technisch gesehen würde man dieses Problem eher mit glPopMatrix und }
{ glPushMatrix lösen. Wir setzen hingegen jedesmal die Einheits-Matrix und }
{ dann die Transformations-Matrix mitsamt Camera-Abstand neu! }
end;


Ok Hab das jetzt mit reingepackt. Es passiert trotzdem nichts.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
EE-Maler
Beiträge: 1754
Erhaltene Danke: 62

Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
BeitragVerfasst: Sa 03.12.11 17:28 
user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
Ok Hab das jetzt mit reingepackt. Es passiert trotzdem nichts.

Hihi, da muss ich lachen...es passiert ziemlich viel, nur wirds nicht angzeigt :mrgreen:

Du hast das SwapBuffers am Ende vergessen. Außerdem brauchst du nur einmal LoadIdentity logischerweise...

_________________
a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1572
Erhaltene Danke: 50

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Sa 03.12.11 18:42 
Hey,

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
  glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
glMatrixMode(GL_MODELVIEW);

Das packt man normalerweiße nur ins FormResize, das spart Rechenleistung ;)

Das LoadIdentity kannst du bei deinem 2. Objekt auch weglassen, du musst dann nur mit der aktuellen Position der Matrix rechnen. Wenn du einfach noch ein Stück drüber was zeichnen willst, dann einfach mit glTranslatef(0, 2, 0) 2 Einheiten nach oben verschieben. Für das Dreieck darunter müsstest du dann glTranslatef(0, -4, 0) aufrufen ODER du pushst die Matrix auf den Matrix Stack (glPushMatrix) verschiebst nach oben, zeichnest dein Dreieck, popst die Matrix vom Stack (glPopMatrix), schiebst nach unten (-2 Einheiten) und zeichnest das 2. Dreieck. Der zweite Weg ist zwar etwas kompilizierter, aber normalerweiße macht man das so.
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
  glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef( 0, 0, -10);

glBegin(GL_TRIANGLES); //mittleres Dreick zeichnen
glVertex3f(-1.0,-1.0, 0.0);
glVertex3f( 0.0, 1.0, 0.0);
glVertex3f( 1.0,-1.0, 0.0);
glEnd();

glPushMatrix; //Matrix speichern
glTranslatef(0, 2, 0); //2 Einheiten nach oben
glBegin(GL_TRIANGLES); //oberes Dreick zeichnen
glVertex3f(-1.0,-1.0, 0.0);
glVertex3f( 0.0, 1.0, 0.0);
glVertex3f( 1.0,-1.0, 0.0);
glEnd();
glPopMatrix; //Matrix laden

glPushMatrix; //Matrix speichern
glTranslatef(0, -2, 0); //2 Einheiten nach unten
glBegin(GL_TRIANGLES); //unteres Dreick zeichnen
glVertex3f(-1.0,-1.0, 0.0);
glVertex3f( 0.0, 1.0, 0.0);
glVertex3f( 1.0,-1.0, 0.0);
glEnd();
glPopMatrix; //Matrix laden


Für einen Anfänger würde ich zuerst die Matrix-Tutorials empfehlen. Die kommen in der Tutorialliste erst relativ spät, sind aber die absolute Grundlage für jegliche Bewegung und Positionierung in OpenGL.

MfG Bergmann.

_________________
Ich weiß nicht viel lern aber dafür umso schneller^^
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home