1. Vorwort:
Delphi unterstützt standardmäßig OpenGl. Sie können die Einheit „uses OpenGL“ verwenden, um darauf zu verweisen, und dann können Sie OpenGL-Funktionen verwenden. OpenGl ist plattformübergreifend und wird von Windows seit langem unterstützt und in das System integriert. Opengl32.dll ist in system32 vorhanden und erfordert keine zusätzliche Installation. Obwohl Windows selbst über d3d verfügt, sind seine Funktionen begrenzt und es gibt relativ wenige entsprechende Lernmaterialseiten.
Normalerweise unterstützt OpenGL nur die folgenden geometrischen Grundformen: Punkte, Linien und Polygone . Als grundlegende Grafikelemente können keine Flächen oder übergeordnete Grafiken (z. B. Kugeln) gezeichnet werden. Sie lassen sich aber mithilfe von Polygonen perfekt simulieren. Werfen Sie einen lässigen Blick auf moderne 3D-Spiele und Sie werden feststellen, dass sie fast ausschließlich aus Dreiecken aufgebaut sind. Daher sind wir an diese Einschränkung nicht gebunden.
2. Initialisierung
Bevor Sie OpenGL verwenden, müssen Sie einige entsprechende Parameter festlegen. Der allgemeine Prozess ist:
„Passendes Pixelformat festlegen“ (ChoosePixelFormat, SetPixelFormat)
„Erstellen Sie einen neuen OpenGL-Rendering-Kontext“ (wglCreateContext)
„OpenGL-bezogene Parameter festlegen“, „Zeichnen“ (glBegin, glEnd)
„OpenGL-Renderingkontext löschen“ (wglDeleteContext)
procedure TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;begin With pfd do begin nSize := sizeof(TPIXELFORMATDESCRIPTOR); // size nVersion := 1; // version dwFlags := PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; // Doppelpufferung unterstützen iPixelType := PFD_TYPE_RGBA; // bevorzugte Farbtiefe cRedBits := 0; // Farbbits (ignoriert) := 0; cBlueBits := 0; cBlueShift := 0; cAlphaBits := 0; // kein Alpha-Puffer cAccumRedBits := 0; // Akkumulationsbits (ignoriert) cAccumBlueBits := 0; = 0; cDepthBits := 16; // Tiefenpuffer cStencilBits := 0; // kein Schablonenpuffer cAuxBuffers := PFD_MAIN_PLANE; // Hauptebene := 0; dwDamageMask := 0; = GetDC(Handle); pixelFormat := ChoosePixelFormat(FDC, @pfd); if pixelFormat = 0 then Exit; if not SetPixelFormat(FDC, @pfd) then Exit; wglMakeCurrent(FDC, FHRC); zu Der schwarze Parameter ist RGBA glClearColor(0, 0, 0, 0); //Orthografische Projektion der Ansichtsprojektionsmatrix festlegen glMatrixMode(GL_PROJECTION); //Setzen Sie die aktuell angegebene Matrix auf die Identitätsmatrix zurück glLoadIdentity; //Geben Sie OpenGL an, um in diesem Bereich zu zeichnen glViewPort(0, 0, ClientWidth, ClientHeight); Setze den Bereich des Weltkoordinatensystems gluOrtho2D(0, ClientWidth, ClientHeight, 0); Schalten Sie das Matrixtransformationsobjekt auf die Modellansichtstransformation um glMatrixMode(GL_MODELVIEW); //Setzen Sie die aktuell angegebene Matrix auf die Identitätsmatrix zurück glLoadIdentity;end;
3. Zeichnen
Die Grundelemente von OpenGL sind Punkte, Linien, Polygone usw. Jedes Mal, wenn Sie zeichnen, müssen Sie glBegin() und glEnd() verwenden. Zum Beispiel die folgende Zeichenfunktionsprozedur Draw;
procedure TForm1.Draw;begin // Puffer löschen glClear(GL_COLOR_BUFFER_BIT oder GL_DEPTH_BUFFER_BIT); // Puffer löschen glColor3ub(0, 255, 0); // OpenGL anweisen, Dreiecke zu zeichnen glVertex2f(200, 300) ; //Übertragen Sie die drei Scheitelpunktkoordinaten des Dreiecks an OpenGL glVertex2f(400, 300); glVertex2f(300, 150); //Beenden Sie das Zeichnen von Grundelementen. SwapBuffers(FDC); //Tauschen Sie den Inhalt des Doppelpuffers, wodurch die gerade gezeichneten Grafiken auf den Bildschirm kopiert werden. Ende;
4. Denken Sie abschließend daran, loszulassen . Der gesamte Code lautet wie folgt:
Unit Unit1;Schnittstellen: Windows, Nachrichten, SysUtils, Varianten, Klassen, Grafiken, Steuerelemente, Formulare, Dialoge, OpenGL;Typ TForm1 = Klasse(TForm) Prozedur FormCreate(Sender: TObject); Prozedur FormPaint( Sender: TObject); procedure FormResize(Sender: TObject); private { Private Deklarationen } FDC: HDC; FHRC: HGLRC; procedure Draw; public { Öffentliche Deklarationen } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Draw;begin // Puffer löschen glClear(GL_COLOR_BUFFER_BIT); // Puffer löschen glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES);//OpenGL mitteilen, dass das Dreieck gezeichnet werden soll glVertex2f(200, 300); //Übertragen Sie die drei Scheitelpunktkoordinaten des Dreiecks nach OpenGL glVertex2f(300, 150); glEnd; // Beende die Bild-Yuan-Zeichnung. SwapBuffers(FDC); //Tauschen Sie den Inhalt des Doppelpuffers, wodurch die gerade gezeichneten Grafiken auf den Bildschirm kopiert werden. end;procedure TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;begin With pfd do begin nSize := sizeof(TPIXELFORMATDESCRIPTOR); // size nVersion := 1; // version dwFlags := PFD_SUPPORT_OPENGL PFD_DRAW_TO_WINDOW oder PFD_DOUBLEBUFFER; // Doppelpufferung unterstützen iPixelType := PFD_TYPE_RGBA; // bevorzugte Farbtiefe cRedBits := 0; // Farbbits (ignoriert) ; cGreenShift := 0; cBlueBits := 0; cBlueShift := 0; cAlphaShift := 0; cAccumRedBits := 0; // Akkumulationsbits (ignoriert) = 0; cAccumAlphaBits := 0; cDepthBits := 16; cStencilBits := 0; // keine Hilfspuffer iLayerType := 0; dwVisibleMask := 0; ; FDC := GetDC(Handle); := ChoosePixelFormat(FDC, @pfd); wenn nicht SetPixelFormat(FDC, @pfd) dann Exit; wglMakeCurrent(FDC, FHRC); Die Farbe ist Schwarz und der Parameter ist RGBA glClearColor(0, 0, 0, 0); //Orthografische Projektion der Ansichtsprojektionsmatrix festlegen glMatrixMode(GL_PROJECTION); //Setzen Sie die aktuell angegebene Matrix auf die Identitätsmatrix zurück glLoadIdentity; //Geben Sie OpenGL an, um in diesem Bereich zu zeichnen glViewPort(0, 0, ClientWidth, ClientHeight) ; //Legen Sie den Bereich des Weltkoordinatensystems fest gluOrtho2D(0, ClientWidth, ClientHeight, 0); Schalten Sie das Matrixtransformationsobjekt auf die Modellansichtstransformation um glMatrixMode(GL_MODELVIEW); //Setzen Sie die aktuell angegebene Matrix auf die Identitätsmatrix zurück glLoadIdentity;end;procedure TForm1.FormDestroy(Sender: TObject);begin wglMakeCurrent(FDC, FHRC); FHRC); ReleaseDC(Handle, FDC);Ende;Prozedur TForm1.FormPaint(Sender: TObject);begin Draw;end;procedure TForm1.FormResize(Sender: TObject);begin //Den Zeichenbereich neu angeben, wenn sich die Größe des Fensters ändert glClearColor(0, 0, 0, 0); glMatrixMode(GL_PROJECTION ) ; glLoadIdentity; glViewPort(0, 0, ClientWidth, ClientHeight); gluOrtho2D(0, ClientWidth, ClientHeight, 0); glMatrixMode(GL_MODELVIEW);glLoadIdentity;end;end.
Klicken Sie hier, um den vollständigen Code herunterzuladen