Autor |
Beitrag |
JungerIslaender
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: 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: 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 StartTime, TimeCount, FrameCount : Cardinal; Frames, DrawTime : Cardinal; procedure SetupGL; procedure Render; procedure ErrorHandler; public DC : HDC; RC : HGLRC; 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); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); end;
procedure TForm1.Init; begin 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
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: 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:
| glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);
glLoadIdentity; 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; 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); 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();
|
Passiert nichts mehr. Und ich verstehe nicht warum?
|
|
Xion
Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: 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
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
JungerIslaender
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Sa 03.12.11 15:31
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; 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); 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();
end; |
Ok Hab das jetzt mit reingepackt. Es passiert trotzdem nichts.
|
|
Xion
Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Sa 03.12.11 17:28
JungerIslaender hat folgendes geschrieben : | Ok Hab das jetzt mit reingepackt. Es passiert trotzdem nichts. |
Hihi, da muss ich lachen...es passiert ziemlich viel, nur wirds nicht angzeigt
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
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Bergmann89
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Sa 03.12.11 18:42
Hey,
Delphi-Quelltext 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.
Delphi-Quelltext 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); glVertex3f(-1.0,-1.0, 0.0); glVertex3f( 0.0, 1.0, 0.0); glVertex3f( 1.0,-1.0, 0.0); glEnd(); glPushMatrix; glTranslatef(0, 2, 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(); glPopMatrix; glPushMatrix; glTranslatef(0, -2, 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(); glPopMatrix; |
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^^
|
|
|