{
Tekstur dapat sangat menghemat waktu CPU. Haha, tapi bagian ini memakan banyak waktu: (
Karena perpustakaan tambahan OpenGL digunakan, hanya sedikit orang yang menggunakan fungsi perpustakaan ini sekarang, tetapi saya masih menemukannya. Berkat zdcnow (Efek Magnetik), dia memberi saya versi Delphi dari perpustakaan tambahan ini. Sebelum mempelajari bagian ini, silakan unduh file glaux.dll dan Glaux.pas secara online dan tambahkan ke proyek.
Oke kita lanjutkan perjalanan OPENGL.
Pertama kita perlu menambahkan unit SysUtils, karena kita akan menggunakan operasi file di bagian ini, dan kita juga perlu menambahkan unit Glaux.
Kemudian kita tambahkan beberapa variabel yaitu xrot, yrot dan zrot, berdasarkan pelajaran pertama. Variabel-variabel ini digunakan untuk memutar kubus di sekitar sumbu X, Y, dan Z. texture[] mengalokasikan ruang penyimpanan untuk suatu tekstur. Jika Anda membutuhkan lebih dari satu tekstur, sebaiknya ubah angka 1 menjadi angka yang Anda perlukan.
}
VAR
h_RC: HGLRC; // Rendering Konteks (tabel deskripsi bayangan).
h_DC: HDC; // Konteks Perangkat (tabel deskripsi perangkat)
h_Wnd: HWND; // pegangan jendela
h_Instance: HINST; // Contoh Program (contoh).
kunci : Array[0..255] Dari Boolean; // Array untuk rutinitas keyboard
xrot, // Jumlah rotasi X (baru)
yrot, // Jumlah rotasi Y (baru)
zrot : GLfloat; // Jumlah rotasi Z (baru)
Tekstur : Array[0..1] Of GLuint; // Menyimpan tekstur (baru)
{Kemudian muat kedua proses di opengl32.dll, kita perlu menggunakannya}
Prosedur glGenTextures(n: GLsizei; Var tekstur: GLuint);
bukagl32;
Prosedur glBindTexture(target: GLenum; tekstur: GLuint);
bukagl32;
{Selanjutnya kita perlu menambahkan fungsi baru untuk memasukkan kembali gambar. Tipe pengembalian fungsi ini didefinisikan di Glaux.pas sebagai berikut:
TAUX_RGBImageRec= catatan
ukuranX, ukuranY: GLint;
data: penunjuk;
akhir;
PTAUX_RGBIImageRec= ^TAUX_RGBIImageRec;
Arti spesifiknya akan dijelaskan nanti}
Fungsi LoadBmp(nama file: pchar): PTAUX_RGBIImageRec;
Var
BitmapFile : Thandle; // pegangan file
Mulai
//Selanjutnya periksa apakah nama file telah diberikan
Jika Nama File = '' Lalu // Pastikan nama file diberikan.
hasil := Nihil; // Jika tidak diberikan, kembalikan NULL
//Kemudian periksa apakah file tersebut ada.
BitmapFile := FileOpen(Nama file, fmOpenWrite); //Coba buka file
//Jika kita dapat membuka file tersebut, jelas file tersebut ada.
Jika BitmapFile > 0 Lalu // Apakah file tersebut ada?
Mulai
//Tutup berkasnya.
FileClose(BitmapFile); //Tutup pegangan
//auxDIBImageLoad(Nama file) membaca data gambar dan mengembalikannya.
hasil := auxDIBImageLoadA(nama file); //Muat bitmap dan kembalikan penunjuk
Akhir
Kalau tidak
//Jika kami tidak dapat membuka file, kami akan mengembalikan NiL.
hasil := Nihil; // Jika pemuatan gagal, kembalikan NiL.
Akhir;
//Selanjutnya buat fungsi baru untuk memuat peta tekstur
Fungsi LoadTexture: boolean;
//Variabel status. Kami menggunakan ini untuk melacak apakah bitmap dapat dimuat dan apakah tekstur dapat dibuat.
// Status diatur ke FALSE secara default (menunjukkan bahwa tidak ada yang dimuat atau dibuat).
//Variabel TextureImage tipe PTAUX_RGBImageRec menyimpan rekaman gambar bitmap.
//Catatan ini berisi lebar, tinggi dan data bitmap.
Var
Status: boolean;
TextureImage : Array[0..1] Dari PTAUX_RGBIimageRec;
Mulai
Status := salah;
ZeroMemory(@TextureImage, sizeof(TextureImage)); // Setel penunjuk ke NULL
TextureImage[0] := LoadBMP('Tekstur.bmp');
Jika TextureImage[0] <> Nihil Lalu
Mulai
Status := BENAR; // Atur Status ke BENAR
//Sekarang gunakan data di TextureImage[0] untuk membuat tekstur.
//glGenTextures(1, texture[0]) memberitahu OpenGL bahwa kita ingin membuat nama tekstur
//(Jika Anda ingin memuat banyak tekstur, tambah jumlahnya).
//glBindTexture(GL_TEXTURE_2D, texture[0]) memberitahu OpenGL untuk mengikat nama tekstur texture[0] ke target tekstur.
//Tekstur 2D hanya memiliki tinggi (pada sumbu Y) dan lebar (pada sumbu X).
//Fungsi utama memberikan nama tekstur pada data tekstur.
//Dalam contoh ini kami memberi tahu OpenGL bahwa memori di &texture[0] tersedia.
//Tekstur yang kita buat akan disimpan di area memori yang ditunjuk oleh &tekstur[0].
glGenTextures(1, tekstur[0]); // Membuat tekstur
glBindTexture(GL_TEXTURE_2D, texture[0]); //Gunakan tekstur khas yang dihasilkan dari data bitmap
//Ke bawah kita membuat tekstur aslinya.
//Baris berikut memberitahu OpenGL bahwa tekstur ini adalah tekstur 2D (GL_TEXTURE_2D).
//Angka nol mewakili tingkat detail gambar, yang biasanya dibiarkan nol.
//Angka tiga adalah banyaknya komponen data. Karena gambar terdiri dari tiga komponen: data merah, data hijau, dan data biru.
//TextureImage[0].sizeX adalah lebar tekstur.
//Jika Anda mengetahui lebarnya, Anda dapat mengisinya di sini, namun komputer dapat dengan mudah mengetahuinya untuk Anda.
// TextureImage[0].sizey adalah tinggi tekstur.
//Angka nol adalah nilai batas, biasanya nol.
// GL_RGB memberitahu OpenGL bahwa data gambar terdiri dari data warna merah, hijau, dan biru.
//GL_UNSIGNED_BYTE berarti data yang menyusun gambar bertipe unsigned byte.
//Akhirnya... TextureImage[0].data memberitahu OpenGL sumber data tekstur.
//Contoh ini menunjuk pada data yang disimpan dalam record TextureImage[0].
// Menghasilkan tekstur
glTexImage2D(GL_TEXTURE_2D, 0, 3, Gambar Tekstur[0].ukuranX,
Gambar Tekstur[0].ukuranY, 0, GL_RGB, GL_UNSIGNED_BYTE,
TeksturGambar[0].data);
//Dua baris berikut memberitahu OpenGL saat menampilkan gambar,
//Bila lebih besar dari tekstur asli yang diperbesar (GL_TEXTURE_MAG_FILTER)
// Atau metode pemfilteran yang digunakan OpenGL saat tekstur diperkecil ke ukuran lebih kecil dari tekstur aslinya (GL_TEXTURE_MIN_FILTER).
//Biasanya saya menggunakan GL_LINEAR dalam kedua kasus. Hal ini memungkinkan tekstur muncul dengan mulus dari jauh hingga sangat dekat dengan layar.
//Penggunaan GL_LINEAR memerlukan CPU dan kartu grafis untuk melakukan lebih banyak operasi.
//Jika mesin Anda lambat, Anda mungkin harus menggunakan GL_NEAREST.
//Bila tekstur yang difilter diperbesar, terlihat sangat mosaik (mosaik).
//Anda juga dapat menggabungkan kedua metode pemfilteran ini. Gunakan GL_LINEAR bila dekat dan GL_NEAREST bila jauh.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Pemfilteran linier
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Pemfilteran linier
Akhir;
//Sekarang kita melepaskan memori yang sebelumnya digunakan untuk menyimpan data bitmap.
//Pertama-tama kita periksa apakah data bitmap disimpan di.
//Jika sudah, periksa apakah data sudah tersimpan.
//Jika sudah disimpan, hapus.
//Kemudian lepaskan struktur gambar TextureImage[0] untuk memastikan bahwa semua memori dapat dilepaskan.
Jika ditugaskan(TextureImage[0]) Lalu // Apakah teksturnya ada
Jika ditugaskan(TextureImage[0].data) Lalu // Apakah gambar tekstur ada
TextureImage[0].data := Nihil; // Lepaskan memori yang ditempati oleh gambar tekstur
TextureImage[0] := Nihil; // Lepaskan struktur gambar
//Akhirnya kembalikan variabel status. Jika semuanya OK, maka variabel Status mempunyai nilai TRUE. Kalau tidak, SALAH
hasil := Status; // Status Pengembalian
Akhir;