1. Kata Pengantar:
Untuk Delphi, jika ingin menggambar harus diolah terlebih dahulu, dan perlu referensi unit lain yang tidak termasuk dalam Delphi, sehingga perlu mendownload Gl.pas secara terpisah. Unit OpenGl yang biasa ditemukan di Internet dienkapsulasi dalam versi 1.0, dan fungsi ini tidak dideklarasikan. Unit Gl.pas dapat ditemukan secara online. Selain itu, diperlukan unit Glaux.pas dan glaux.dll, yang merupakan perpustakaan tambahan. Unduhan akan disediakan di akhir artikel ini.
2. Proses pelaksanaan:
Melukis gambar memerlukan proses berikut. Gambar Window sendiri didasarkan pada bitmap, seperti png, jpg, dll. Saat menggambar, dapat diubah menjadi bmp dan kemudian digambar.
1. Muat gambar bmp: gunakan auxDIBImageLoadA atau fungsi lainnya
2. Konversikan ke tekstur: glGenTextures -> glBindTexture -> glTexImage2D, glTexParameteri digunakan untuk mengatur parameter terkait
3. Gambar tekstur: glBindTexture -> glBegin(GL_QUADS) -> glTexCoord2f -> glVertex2f -> glEnd
3. Menggambar menggunakan fungsi glDrawPixels
glDrawPixels memiliki 5 parameter berikut:
lebar: lebar gambar tabel
height: tinggi gambar tabel
format: format penyimpanan data gambar tabel
atype: tidak diketahui
piksel: penunjuk ke data DIB
Contoh kodenya adalah sebagai berikut:
prosedur TForm1.Draw;var Bmp: TBitmap;mulai Bmp := TBitmap.Create; Bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); // Hapus buffer glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT); / Data gambar TBitmap disimpan terus menerus di memori dalam urutan baris terbalik. Alamat pertama, yaitu alamat buffer gambar, dapat diperoleh melalui TBitmap.ScanLine[TBitmap.Height-1] // Warna gambar bmp adalah disimpan di bgr, jadi Anda harus memilih GL_BGR_EXT sebagai parameter glDrawPixels(Bmp.Width, Bmp.Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, Bmp.ScanLine[Bmp.Height - 1]); SwapBuffers(FDC);
Anda tidak perlu mengaktifkan pemetaan tekstur untuk menggambar gambar menggunakan cara di atas. Anda dapat menggunakan fungsi glPixelZoom untuk memperbesar gambar. Posisi tampilan ada di pojok kiri bawah jendela (saya tidak tahu cara mengubah gambar posisi untuk saat ini.)
3. Gunakan gambar tekstur
Jika Anda ingin mengontrol posisi tampilan dan zoom gambar, Anda dapat menggunakan cara berikut.
1. Menurut prosesnya, pertama-tama kita memuat gambar ke dalam program dan memperoleh informasi gambar yang relevan .
Untuk memuat gambar ke dalam tekstur, silakan merujuk ke situs ini://www.VeVB.COm/article/52125.htm
Memuat bitmap di Delphi sangat sederhana dan dapat dimuat dengan cara berikut:
(1) Muat gambar melalui fungsi auxDIBImageLoadA dari perpustakaan tambahan. Pengembaliannya adalah penunjuk data PTAUX_RGBImageRec, dan format data DIB adalah RGB.
// Struktur data RGB TAUX_RGBImageRec = ukuran rekaman .bmp')); // Bagaimana cara melepaskan p? Baik Dispose maupun Freemem tidak dapat mengoperasikan ujung penunjuk ini;
(2) Muat gambar melalui TBitmap.LoadFromFile. Delphi hadir dengan itu. Dari perbandingan efisiensi, kinerjanya sama dengan auxDIBImageLoadA, tetapi format data DIB adalah BGR dan penunjuk DIB adalah TBitmap.ScanLine[Bmp.Height - 1]
var Bmp: TBitmap;mulai Bmp := TBitmap.Create; TBitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp');
2. Buat tekstur , termasuk glGenTextures dan glBindTexture, di Gl.pas.
// Buat area tekstur glGenTextures(1, @texture); // Ikat area tekstur glBindTexture(GL_TEXTURE_2D, texture); // Gunakan bitmap untuk membuat tekstur gambar glTexImage2D( GL_TEXTURE_2D, // Teksturnya adalah tekstur 2D GL_TEXTURE_2D 0, // Tingkat detail gambar defaultnya adalah 0 3, // Banyaknya komponen data. Karena gambar terdiri dari warna merah, hijau dan biru, maka defaultnya adalah 3 Bmp.Lebar, // Lebar tekstur Bmp.Tinggi, // Tinggi tekstur adalah 0, / / Nilai bordernya adalah 0 secara default GL_BGR_EXT, // Format data bmp menggunakan bgr GL_UNSIGNED_BYTE, // Data pembentuk gambar adalah unsigned byte type Bmp.ScanLine[Bmp.Height - 1] // DIB data penunjuk); // Dua baris berikut membiarkan opengl menggunakan metode pemfilteran yang digunakan OpenGL saat memperbesar tekstur asli (GL_TEXTURE_MAG_FILTER) atau memperkecil tekstur asli (GL_TEXTURE_MIN_FILTER). // GL_LINEAR menggunakan pemfilteran linier untuk memperlancar pemrosesan gambar, tetapi membutuhkan lebih banyak memori dan CPU glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Pemfilteran linier glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Pemfilteran linier
3. Gambar tekstur
Sebelum menggambar tekstur, OpenGL harus diberitahu untuk mengaktifkan pemetaan tekstur glEnable(GL_TEXTURE_2D). Saat dihidupkan, gambar non-tekstur tidak akan berfungsi. Ingatlah untuk menutupnya setelah Anda selesai menggunakannya.
// Berikut ini adalah menggambar, menggunakan segi empat untuk menggambar // Aktifkan pemetaan tekstur jika glIsEnabled(GL_TEXTURE_2D) = 0 lalu glEnable(GL_TEXTURE_2D); // Hapus buffer glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT); := 10; w := 200; Perbesar gambar menjadi 200*200 // Pilih tekstur. Jika beberapa tekstur digunakan dalam adegan, tekstur tidak dapat terikat antara glBegin() dan glEnd() glBindTexture(GL_TEXTURE_2D, texture); dari glTexCoord2f Salah satu parameternya adalah koordinat X. // 0.0 adalah sisi kiri tekstur. 0,5 adalah titik tengah tekstur dan 1,0 adalah sisi kanan tekstur. //Parameter kedua glTexCoord2f adalah koordinat Y. // 0.0 adalah bagian bawah tekstur. 0,5 adalah titik tengah tekstur dan 1,0 adalah bagian atas tekstur. glTexCoord2f(0, 1); glVertex2f(l, t); glTexCoord2f(1, 1); glVertex2f(l + w, t); glTexCoord2f( 0, 0); glVertex2f(l, t + w); glEnd();
Gambar di atas sudah selesai. Berikut ini adalah kode lengkap di Draw. Anda tidak perlu merujuk ke perpustakaan tambahan Glaux.pas.
prosedur TForm1.Draw;var Bmp: TBitmap; tekstur: GLuint; l, t, w: Integer;mulai Bmp := TBitmap.Create; / / Buat area tekstur glGenTextures(1, @texture); Ikat area tekstur glBindTexture(GL_TEXTURE_2D, texture); // Gunakan bitmap untuk membuat tekstur gambar glTexImage2D( GL_TEXTURE_2D, // Teksturnya adalah tekstur 2D GL_TEXTURE_2D 0, // Tingkat detail gambar defaultnya adalah 0 3, / / Banyaknya komponen data. Karena gambar terdiri dari warna merah, hijau dan biru, maka defaultnya adalah 3 Bmp.Lebar, // Lebar tekstur Bmp.Height, // Tinggi tekstur 0, // Nilai default border adalah 0 GL_BGR_EXT, // Format data bmp menggunakan bgr GL_UNSIGNED_BYTE, // Data penyusun gambar adalah tipe byte yang tidak ditandatangani Bmp.ScanLine[Bmp .Height - 1] // DIB data pointer); Dua baris berikut membiarkan opengl menggunakan metode pemfilteran yang digunakan OpenGL saat memperbesar tekstur asli (GL_TEXTURE_MAG_FILTER) atau memperkecil tekstur asli (GL_TEXTURE_MIN_FILTER). // GL_LINEAR menggunakan pemfilteran linier untuk memperlancar pemrosesan gambar, tetapi memerlukan lebih banyak memori dan CPU glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Pemfilteran linier glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Pemfilteran linier// Berikut ini adalah menggambar, menggunakan segi empat untuk menggambar // Aktifkan pemetaan tekstur jika glIsEnabled(GL_TEXTURE_2D) = 0 lalu glEnable(GL_TEXTURE_2D); // Hapus buffer glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT); 10; Perbesar gambar menjadi 200*200 // Pilih tekstur. Jika beberapa tekstur digunakan dalam adegan, tekstur tidak dapat terikat antara glBegin() dan glEnd() glBindTexture(GL_TEXTURE_2D, texture); dari glTexCoord2f Salah satu parameternya adalah koordinat X. // 0.0 adalah sisi kiri tekstur. 0,5 adalah titik tengah tekstur dan 1,0 adalah sisi kanan tekstur. //Parameter kedua glTexCoord2f adalah koordinat Y. // 0.0 adalah bagian bawah tekstur. 0,5 adalah titik tengah tekstur dan 1,0 adalah bagian atas tekstur. glTexCoord2f(0, 1); glVertex2f(l, t); glTexCoord2f(1, 1); glVertex2f(l + w, t); glTexCoord2f( 0, 0); glVertex2f(l, t + w); glEnd(); Bmp.Gratis; SwapBuffers(FDC);akhir;
Kode lengkap untuk contoh ini dapat diunduh di sini.