1. Vorwort:
Wenn Sie in Delphi Bilder zeichnen möchten, müssen Sie diese zuerst verarbeiten und auf andere Einheiten verweisen, die nicht in Delphi enthalten sind. Daher müssen Sie Gl.pas separat herunterladen. Die im Internet häufig vorkommende OpenGl-Einheit ist in Version 1.0 gekapselt und diese Funktion ist nicht deklariert. Gl.pas-Einheiten können online gefunden werden. Darüber hinaus sind eine Glaux.pas-Unit und glaux.dll erforderlich, bei denen es sich um Hilfsbibliotheken handelt. Ein Download wird am Ende dieses Artikels bereitgestellt.
2. Umsetzungsprozess:
Das Malen von Bildern erfordert die folgenden Prozesse. Die eigene Zeichnung von Windows basiert auf Bitmaps wie PNG, JPG usw. Beim Zeichnen kann sie in BMP konvertiert und dann gezeichnet werden.
1. BMP-Bilder laden: Verwenden Sie auxDIBImageLoadA oder andere Funktionen
2. In Textur konvertieren: glGenTextures -> glBindTexture -> glTexImage2D, glTexParameteri wird zum Festlegen verwandter Parameter verwendet
3. Textur zeichnen: glBindTexture -> glBegin(GL_QUADS) -> glTexCoord2f -> glVertex2f -> glEnd
3. Zeichnen Sie mit der glDrawPixels-Funktion
glDrawPixels hat die folgenden 5 Parameter:
Breite: Breite des Tabellenbildes
Höhe: Höhe des Tabellenbildes
Format: Datenspeicherformat für Tabellenbilder
Atyp: unbekannt
Pixel: Zeiger auf DIB-Daten
Der Beispielcode lautet wie folgt:
procedure TForm1.Draw;var Bmp: TBitmap;begin Bmp := TBitmap.Create; Bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); / / Die Bilddaten von TBitmap werden kontinuierlich in umgekehrter Zeilenreihenfolge im Speicher gespeichert. Die erste Adresse, die die Bildpufferadresse ist, kann über TBitmap.ScanLine[TBitmap.Height-1] // erhalten werden. Die Farbe des BMP-Bildes ist in bgr gespeichert, daher müssen Sie GL_BGR_EXT als Parameter auswählen glDrawPixels(Bmp.Width, Bmp.Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, Bmp.ScanLine[Bmp.Height - 1]); SwapBuffers(FDC;end;
Sie müssen die Texturzuordnung nicht aktivieren, um Bilder mit der oben genannten Methode zu zeichnen. Sie können die Funktion glPixelZoom verwenden, um das Bild zu vergrößern. Die Anzeigeposition befindet sich in der unteren linken Ecke des Fensters (ich weiß nicht, wie ich das Bild ändern soll). Position vorerst.)
3. Verwenden Sie Texturzeichnung
Wenn Sie die Anzeigeposition und den Zoom des Bildes steuern möchten, können Sie die folgenden Methoden verwenden.
1. Gemäß dem Prozess laden wir zunächst das Bild in das Programm und erhalten die relevanten Bildinformationen .
Informationen zum Laden von Bildern in Texturen finden Sie auf dieser Website: //www.VeVB.COm/article/52125.htm
Das Laden einer Bitmap in Delphi ist sehr einfach und kann auf folgende Weise geladen werden:
(1) Laden Sie das Bild über die Funktion auxDIBImageLoadA der Hilfsbibliothek. Die Rückgabe ist ein PTAUX_RGBImageRec-Datenzeiger und das DIB-Datenformat ist RGB.
// RGB-Datenstruktur TAUX_RGBImageRec = Datensatzgröße .bmp')); Wie kann ich p freigeben? Weder Dispose noch Freemem können dieses Zeigerende bedienen.
(2) Laden Sie Bilder über TBitmap.LoadFromFile. Aus einem Effizienzvergleich geht hervor, dass die Leistung die gleiche ist wie bei auxDIBImageLoadA, aber das DIB-Datenformat ist BGR und der DIB-Zeiger ist TBitmap.ScanLine[Bmp.Height - 1]
var Bmp: TBitmap;begin Bmp := TBitmap.Create; TBitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); // etwas tun // Release Bmp.Free;end;
2. Erstellen Sie in Gl.pas eine Textur , einschließlich glGenTextures und glBindTexture.
// Einen Texturbereich erstellen glGenTextures(1, @texture); // Den Texturbereich binden glBindTexture(GL_TEXTURE_2D, Texture); // Verwenden Sie eine Bitmap, um eine Bildtextur zu erstellen glTexImage2D( GL_TEXTURE_2D, // Die Textur ist eine 2D-Textur GL_TEXTURE_2D 0, // Die Bilddetailebene ist standardmäßig auf 0 3, // Die Anzahl der Komponenten der Daten. Da das Bild aus Rot, Grün und Blau besteht, beträgt der Standardwert 3 Bmp.Width, // Die Breite der Textur Bmp.Height, // Die Höhe der Textur beträgt 0, / / Der Wert des Rahmens ist standardmäßig 0. GL_BGR_EXT, // Das Datenformat bmp verwendet bgr GL_UNSIGNED_BYTE, // Die Daten, aus denen das Bild besteht, sind vom vorzeichenlosen Bytetyp Bmp.ScanLine[Bmp.Height - 1] // DIB-Daten Zeiger); // Mit den folgenden beiden Zeilen kann opengl die Filtermethode verwenden, die OpenGL beim Vergrößern der Originaltextur (GL_TEXTURE_MAG_FILTER) oder beim Verkleinern der Originaltextur (GL_TEXTURE_MIN_FILTER) verwendet. // GL_LINEAR verwendet lineare Filterung, um die Bildverarbeitung zu glätten, erfordert jedoch mehr Speicher und CPU glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Lineare Filterung glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3. Textur zeichnen
Vor dem Zeichnen einer Textur muss OpenGL benachrichtigt werden, um die Texturzuordnung glEnable(GL_TEXTURE_2D) zu aktivieren. Wenn diese Option aktiviert ist, funktioniert das Zeichnen ohne Textur nicht. Denken Sie daran, es zu schließen, wenn Sie mit der Verwendung fertig sind.
// Das Folgende ist das Zeichnen eines Vierecks, um ein Bild zu zeichnen. // Aktivieren Sie die Texturzuordnung, wenn glIsEnabled(GL_TEXTURE_2D) = 0, dann glEnable(GL_TEXTURE_2D); // Löschen Sie den Puffer glClear(GL_COLOR_BUFFER_BIT); l := t := 10; w := 200; Vergrößern Sie das Bild auf 200*200 // Wenn in der Szene mehrere Texturen verwendet werden, kann die Textur nicht zwischen glBegin() und glEnd() gebunden werden. glBindTexture(GL_TEXTURE_2D, texture); // Die dritte von glTexCoord2f Ein Parameter ist die X-Koordinate. // 0,0 ist die linke Seite der Textur. 0,5 ist der Mittelpunkt der Textur und 1,0 ist die rechte Seite der Textur. //Der zweite Parameter von glTexCoord2f ist die Y-Koordinate. // 0,0 ist der untere Rand der Textur. 0,5 ist der Mittelpunkt der Textur und 1,0 ist die Oberseite der Textur. glTexCoord2f(0, 1); glTexCoord2f(1, 1); glTexCoord2f(l + w, t + w); 0, 0); glVertex2f(l, t + w); glEnd();
Die obige Zeichnung ist fertig. Das Folgende ist der vollständige Code in Draw. Sie müssen nicht auf die Hilfsbibliothek Glaux.pas verweisen.
procedure TForm1.Draw;var Bmp: TBitmap; texture: GLuint; l, t, w: Integer;begin Bmp := TBitmap.Create; / Texturbereich erstellen glGenTextures(1, @texture); Binden Sie den Texturbereich glBindTexture(GL_TEXTURE_2D, Texture); // Verwenden Sie eine Bitmap, um eine Bildtextur zu erstellen glTexImage2D( GL_TEXTURE_2D, // Die Textur ist eine 2D-Textur GL_TEXTURE_2D 0, // Der Detaillierungsgrad des Bildes ist standardmäßig 0 3, / / Die Anzahl der Komponenten der Daten. Da das Bild aus Rot, Grün und Blau besteht, ist der Standardwert 3 Bmp.Width, //. Die Breite der Textur Bmp.Height, // Die Höhe der Textur ist 0, // Der Wert des Rahmens ist standardmäßig 0 GL_BGR_EXT, // Das Datenformat bmp verwendet bgr GL_UNSIGNED_BYTE, // Die Daten, aus denen das Bild besteht ist der vorzeichenlose Bytetyp Bmp.ScanLine[Bmp .Height - 1] // DIB-Datenzeiger); Mit den folgenden beiden Zeilen kann opengl die Filtermethode verwenden, die OpenGL beim Vergrößern der Originaltextur (GL_TEXTURE_MAG_FILTER) oder beim Verkleinern der Originaltextur (GL_TEXTURE_MIN_FILTER) verwendet. // GL_LINEAR verwendet lineare Filterung, um die Bildverarbeitung zu glätten, erfordert jedoch mehr Speicher und CPU glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Lineare Filterung glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); Das Folgende ist das Zeichnen eines Vierecks, um ein Bild zu zeichnen. // Texturzuordnung aktivieren, wenn glIsEnabled(GL_TEXTURE_2D) = 0, dann glEnable(GL_TEXTURE_2D); // Puffer löschen glClear(GL_COLOR_BUFFER_BIT); l := 10; t := 10; w := 200; Vergrößern Sie das Bild auf 200*200 // Wenn in der Szene mehrere Texturen verwendet werden, kann die Textur nicht zwischen glBegin() und glEnd() gebunden werden. glBindTexture(GL_TEXTURE_2D, texture); // Die dritte von glTexCoord2f Ein Parameter ist die X-Koordinate. // 0,0 ist die linke Seite der Textur. 0,5 ist der Mittelpunkt der Textur und 1,0 ist die rechte Seite der Textur. //Der zweite Parameter von glTexCoord2f ist die Y-Koordinate. // 0,0 ist der untere Rand der Textur. 0,5 ist der Mittelpunkt der Textur und 1,0 ist die Oberseite der Textur. glTexCoord2f(0, 1); glTexCoord2f(1, 1); glTexCoord2f(l + w, t + w); 0, 0); glVertex2f(l, t + w); glEnd(); Bmp.Free; SwapBuffers(FDC);end;
Der vollständige Code für dieses Beispiel kann hier heruntergeladen werden.