Pemrograman grafis OPENGL
OPENGL adalah grafik tiga dimensi dan pustaka model. Karena kinerjanya yang luar biasa dalam grafik tiga dimensi, banyak bahasa tingkat tinggi saat ini menyediakan antarmuka dengan OPENGL, seperti: VC, DELPHI, C++Builder, dll. Menggunakan OPENGL dapat sangat mengurangi kesulitan pengguna dalam mengembangkan grafik dan gambar, memungkinkan pengguna menghasilkan iklan komersial tingkat tinggi, CAD grafis, animasi tiga dimensi, simulasi grafis, serta koleksi film dan televisi.
1. Fungsi OPENGL
OPENGL awalnya merupakan perpustakaan perangkat lunak grafis di stasiun kerja. Karena penerapannya yang luas di bidang komersial, militer, medis, dirgantara, dan bidang lainnya, grafik yang memenuhi kebutuhan pengguna kini dapat dikembangkan pada komputer kelas bawah. OPENGL tidak hanya dapat menggambar gambar dasar, tetapi juga menyediakan sejumlah besar fungsi dan prosedur untuk memproses gambar grafik.
1. Transformasi grafis
Ini adalah dasar dari tampilan grafis dan produksi. Desain animasi dan tampilan animasi tidak dapat dipisahkan dari transformasi grafis. Transformasi grafis secara matematis diwujudkan dengan perkalian persegi panjang. Transformasi umumnya mencakup terjemahan, rotasi, dan penskalaan. Menurut properti tampilan grafik: transformasi sudut pandang, transformasi model, transformasi proyeksi, transformasi kliping dan transformasi area pandang, dll.
2. Efek pencahayaan
Warna suatu benda yang tidak bercahaya disebabkan oleh benda yang memantulkan cahaya luar, yaitu iluminasi. Dalam grafik tiga dimensi, jika pencahayaan digunakan secara tidak tepat, grafik tiga dimensi akan kehilangan arti tiga dimensi yang sebenarnya. OPENGL membagi pencahayaan menjadi: cahaya pancaran, cahaya sekitar, cahaya tersebar, cahaya pantulan, dll.
3. Pemetaan tekstur
Pemetaan tekstur memungkinkan Anda menambahkan tekstur dunia nyata ke permukaan tiga dimensi. Misalnya: persegi panjang tidak bisa mewakili suatu objek di dunia nyata. Jika diisi dengan tekstur "penting", maka akan menjadi realistis.
4. Efek khusus grafis
Fungsi blending, fungsi anti-aliasing, dan fungsi kabut dapat menangani transparansi dan tembus cahaya grafik tiga dimensi, membuat objek menjadi halus, menggunakan segmen garis untuk menghaluskan dan memberikan efek kabut.
5. Efek khusus gambar
Fungsi dasar untuk memproses bitmap: menggambar gambar, menyalin dan menyimpan gambar, memetakan dan mentransfer, menskalakan gambar, dll. Fungsi operasi bitmap dapat menjelaskan proses pembentukan karakter Cina pada level paling bawah dari gambar aslinya.
2. Buat aplikasi OPENGL
1. Prinsip umum
A. Tambahkan unit pendukung OPENGL yang digunakan: OpenGL;
B menginisialisasi OPENGL selama acara OnCreate formulir;
C menginisialisasi OPENGL selama acara OnPaing di jendela;
D menginisialisasi OPENGL selama acara OnResize di jendela;
E menginisialisasi OPENGL selama acara OnDestroy di jendela;
2. Contoh sederhana
A Buat FILE proyek->Aplikasi baru
B Tambahkan kode di acara OnCreate:
Prosedur TfrmMain.FormCreate(Pengirim: TObject);
var
pfd:TPixelFormatDescriptor; //Setel tabel deskripsi
Format Piksel:Bilangan Bulat;
mulai
ControlStyle:=ControlStyle+[csOpaque];
IsiChar(pfd,ukuran(pfd),0);
dengan pfd lakukan
mulai
nUkuran:=ukuran(TPixelFormatDescriptor);
nVersi:=1;
dwFlags:=PFD_DRAW_TO_WINDOW atau
PFD_SUPPORT_OPENGL atau PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
akhir;
PixelFormat:=PilihPixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Kanvas.Handle);
w:=Lebar Klien;
h:=Tinggi Klien;
akhir;
Kode C di acara OnDestroy
prosedur TfrmMain.FormDestroy(Pengirim: TObject);
mulai
wglDeleteContext(hrc);
akhir;
Kode D dalam acara OnPaint
prosedur TfrmMain.FormPaint(Pengirim: TObject);
mulai
wglMakeCurrent(Canvas.Handle,hrc);
glClearColor(1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT);
Gambar Saya;
glFlush;
SwapBuffers(Canvas.Handle);
akhir;
Kode E dalam acara OnResize
prosedur TfrmMain.FormResize(Pengirim: TObject);
mulai
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort(0,0,Lebar Klien,Tinggi Klien);
Gambar Saya;
akhir;
Kode F dalam fungsi MyDraw (dideklarasikan oleh pengguna di kelas window)
prosedur TfrmMain.MyDraw;
mulai
glPushMatrix;
Bola:=gluNewQuadric;
gluQuadricDrawStyle(Bola,GLU_LINE);
gluSphere(Bola,0,5,25,25);
glPopMatrix;
SwapBuffers(Canvas.handle);
gluDeleteQuadric(Bola);
akhir;
Terlampir adalah kode asli program ini:
satuan MainFrm;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir,
Dialog, OpenGL;
jenis
TfrmMain = kelas(TForm)
prosedur FormCreate(Pengirim: TObject);
prosedur FormDestroy(Pengirim: TObject);
prosedur FormPaint(Pengirim: TObject);
prosedur FormResize(Pengirim: TObject);
pribadi
{Deklarasi pribadi}
jam:HGLRC;
w,h:glFloat;
Bola:GLUquadricObj;
publik
{Pernyataan publik}
prosedur Gambar Saya;
akhir;
var
frmUtama: TfrmUtama;
pelaksanaan
{$R *.dfm}
procedure TfrmMain.FormCreate(Pengirim: TObject);
var
pfd:TPixelFormatDescriptor;
Format Piksel:Bilangan Bulat;
mulai
ControlStyle:=ControlStyle+[csOpaque];
IsiChar(pfd,ukuran(pfd),0);
dengan pfd lakukan
mulai
nUkuran:=ukuran(TPixelFormatDescriptor);
nVersi:=1;
dwFlags:=PFD_DRAW_TO_WINDOW atau
PFD_SUPPORT_OPENGL atau PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
akhir;
PixelFormat:=PilihPixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Kanvas.Handle);
w:=Lebar Klien;
h:=Tinggi Klien;
akhir;
prosedur TfrmMain.FormDestroy(Pengirim: TObject);
mulai
wglDeleteContext(hrc);
akhir;
prosedur TfrmMain.FormPaint(Pengirim: TObject);
mulai
wglMakeCurrent(Canvas.Handle,hrc);
glClearColor(1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT);
Gambar Saya;
glFlush;
SwapBuffers(Canvas.Handle);
akhir;
prosedur TfrmMain.MyDraw;
mulai
glPushMatrix;
Bola:=gluNewQuadric;
gluQuadricDrawStyle(Bola,GLU_LINE);
gluSphere(Bola,0,5,25,25);
glPopMatrix;
SwapBuffers(Canvas.handle);
gluDeleteQuadric(Bola);
akhir;
prosedur TfrmMain.FormResize(Pengirim: TObject);
mulai
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort(0,0,Lebar Klien,Tinggi Klien);
Gambar Saya;
akhir;
akhir.
3. Konvensi tentang variabel dan fungsi OPENGL
1. Konvensi perpustakaan OPENGL
Ini memiliki total tiga perpustakaan: perpustakaan dasar, perpustakaan praktis, dan perpustakaan tambahan. Di DELPHI, perpustakaan dasar diimplementasikan oleh unit OpenGL. Di lingkungan Windows, perpustakaan tambahan umumnya tidak digunakan.
2. Konvensi konstan OPENGL
Konstanta OPENGL menggunakan huruf kapital, dimulai dengan "GL", dan menggunakan garis bawah untuk memisahkan kata, seperti: GL_LINES yang artinya menggunakan pustaka dasar untuk menggambar garis lurus.
3. Konvensi penamaan fungsi OPENGL
A Bagian pertama dimulai dengan gl atau wgl, seperti gl di glColor3f.
B Bagian kedua adalah fungsi yang dinyatakan dalam bahasa Inggris, dengan huruf pertama dari kata tersebut dikapitalisasi.
Bagian ketiga dari C adalah angka, yang mewakili parameter fungsi.
Bagian keempat dari D adalah huruf kecil yang menunjukkan jenis fungsinya.
bilangan bulat b9-bit
bilangan bulat s16-bit
bilangan bulat i32-bit
nomor titik mengambang f32-bit
nomor floating point d64-bit
bilangan bulat tak bertanda ub9-bit
Contoh: glVertex2f(37,40); {dua bilangan floating point 32-bit sebagai parameter}
glVertex3d(37,40,5); {Tiga bilangan floating point 64-bit sebagai parameter}
p[1..3]:array glFloat;
glVertes3fv(p); {3f mewakili tiga bilangan floating point, v mewakili pemanggilan array sebagai input koordinat titik}
4. Inisialisasi OPENGL
1. Struktur DESKRIPTOR PIXELFORMAT
Ini terutama menggambarkan properti piksel, seperti mode warna piksel dan komposisi warna merah, hijau, dan biru.
tagPIXELFORMATDESCRIPTOR = catatan yang dikemas
nUkuran: Kata;
nVersi: Kata;
dwBendera: DWORD;
iPixelType: Byte;
cColorBits: Byte;
crRedBits: Byte;
crRedShift: Byte;
cGreenBits: Byte;
cGreenShift: Byte;
cBlueBits: Byte;
cBlueShift: Byte;
cAlphaBits: Byte;
cAlphaShift: Byte;
cAccumBits: Byte;
cAccumRedBits: Byte;
cAccumGreenBits: Byte;
cAccumBlueBits: Byte;
cAccumAlphaBits: Byte;
cDepthBits: Byte;
cStencilBits: Byte;
cAuxBuffers: Byte;
iLayerType: Byte;
bDicadangkan: Byte;
dwLayerMask: DWORD;
dwVisibleMask: DWORD;
dwDamageMask: DWORD;
akhir;
TPixelFormatDescriptor = tagPIXELFORMATDESCRIPTOR;
dwFlags mewakili atribut format titik:
Grafik PFD_DRAW_TO_WINDOW digambar pada layar atau permukaan perangkat
PFD_DRAW_TO_BITMAP menggambar bitmap di memori
PFD_SUPPORT_GDI mendukung gambar GDI
PFD_SUPPORT_OPENGL mendukung fungsi OPENGL
PFD_DOUBLEBUFFER menggunakan buffering ganda
Tembolok stereo PFD_STEREO
PFD_NEED_PALLETTE menggunakan palet RGBA
PFD_GENERIC_FORMAT memilih format gambar yang didukung oleh GDI
PFD_NEED_SYSTEM_PALETTE menggunakan palet perangkat keras yang didukung OPENGL
iPixelType menyetel mode warna piksel: PFD_TYPE_RGBA atau PFD_TYPE_INDEX..
cColorBits mengatur bit warna. Jika 9, berarti ada 256 warna yang mewakili warna titik.
cRedBits, cGreenBits, cBlueBits Saat menggunakan RGBA, jumlah bit yang digunakan untuk tiga warna primer.
cRedShitfs, cGreenShifts, cBlueShifts Saat menggunakan RGBA, jumlah digit yang dapat disesuaikan untuk tiga warna primer.
cAlphaBits, cAlphaShifts Saat menggunakan RGBA, jumlah bit yang digunakan oleh Alpha dan jumlah bit yang dapat disesuaikan.
cAccumBits menetapkan jumlah total bit di area buffer akumulasi.
cAccumRedBits, cAccumGreenBits, dan cAccumBlueBits menetapkan jumlah total tiga bidang warna primer di area buffer akumulasi.
cAccumAlphaBits menetapkan jumlah total bit Alpha dalam buffer akumulasi.
cDepthBits mengatur kedalaman buffer konsentrasi.
cStencilBits mengatur kedalaman cache Stencil.
cAuxBuffers mengacu pada ukuran buffer tambahan.
iLayerType menentukan jenis lapisan.
bReserved tidak digunakan dan harus nol.
dwLayerMask menentukan topeng overlay.
dwDamageMask mengatur apakah mode piksel yang sama dibagikan dalam cache bingkai yang sama.
2. Langkah-langkah inisialisasi OPENGL
A Gunakan Canvas.Handle untuk mendapatkan pegangan jendela.
B Buat variabel TPixelFormatDescriptor untuk menentukan format piksel.
C Gunakan fungsi ChoosePixelFormat untuk memilih format piksel.
D Gunakan fungsi SetPixelFormat agar format piksel dapat diterapkan.
E Gunakan fungsi wglCreateContext untuk membuat tabel deskripsi terjemahan.
F Gunakan fungsi wglMakeCurrent untuk menggunakan tabel deskripsi terjemahan yang dibuat sebagai tabel deskripsi terjemahan saat ini.
3. Pelepasan sumber daya
A Gunakan prosedur wglDeleteContext untuk menghapus tabel konteks piksel.
B Gunakan prosedur ReleaseDC untuk melepaskan memori jendela.
Di acara OnDestroy jendela:
mulai
jika hrc<>batal maka
wglHapusSaat Ini(hrc);
jika hdc<>batal maka
RilisDC(Menangani,hdc);
akhir;
5. Menggambar grafik dasar OPENGL
1. Warna grafis
Perhatikan pengaturan warna latar belakang. Pengaturan warna biasanya terkait dengan variabel deskripsi piksel, yaitu anggota iPixelType dalam definisi TPixelFormatDescriptor.
iPixelType:=PFD_TYPE_COLORINDEX;
Maka Anda hanya dapat menggunakan prosedur glIndexd, glIndexf, glIndexi, glIndexs, glIndexv, glIndexfv, glIndexiv, glIndexsv untuk mengatur warna grafis.
iPixelType:=PFD_TYPE_RGBA;
Selanjutnya anda hanya bisa menggunakan glColor3b, glColor3f, glColor4b, glColor4f, glColor4fv untuk mengatur warna grafisnya.
Warna latar belakang Grafik: warna layar dan jendela, yaitu warna buffer warna. Untuk mengubah warna latar belakang grafik, pertama-tama Anda harus menggunakan prosedur glClearColor untuk mengatur warna latar belakang, lalu gunakan prosedur glClear untuk menyegarkan jendela dan layar dengan warna latar belakang ini.
prosedur glClearColor(merah:GLClampf,hijau:GLClampf,biru:GLClampf,alpha:GLClampf);
prosedur glClear(topeng:GLBitField);
merah, hijau, biru, dan alfa adalah warna latar belakang yang akan disetel, dan nilainya 0 hingga 1. Mask adalah cara untuk menyegarkan warna background.
Contoh: Atur jendela pewarnaan menjadi hijau
glClearColor(0,1,0,1);
glClear(GL_COLOR_BUFFER_BIT);
Arti dan Arti Topeng:
GL_COLOR_BUFFER_BIT menyetel buffer warna saat ini
GL_DEPTH_BUFFER_BIT menyetel buffer kedalaman saat ini
GL_ACCUM_BUFFER_BIT menyetel buffer akumulasi saat ini
GL_STENCIL_BUFFER_BIT menyetel buffer STENCIL (templat) saat ini
Jendela gambar diatur menjadi abu-abu
glClearColor(0.3,0.3,0.3,1);
glClear(GL_COLOR_BUFFER_BIT);
B warna grafis
Gunakan glClear3f dan glClear4f untuk mengatur warna gambar grafik. Jika menggunakan tiga parameter, berarti mengatur masing-masing tiga warna lampu merah, biru, dan hijau. Jika empat parameter digunakan, parameter keempat mewakili nilai RGBA.
Contoh pengaturan warna gambar saat ini menjadi biru:
glColor3f(0,0,1);
Atur warna plot menjadi putih:
glColor3f(1,1,1);
2. Menggambar grafik sederhana
Gambarlah grafik sederhana, seperti titik, garis, poligon, dll., antara prosedur glBegin dan glEnd.
glBegin(mode:GLenum);{Proses menggambar}glEnd;
Nilai modus:
GL_POINTS menarik banyak poin
GL_LINES menggambar beberapa garis, menggambar garis lurus setiap dua titik
GL_LINE_STRIP menggambar polyline
GL_LINE_LOOP menggambar poligon tertutup yang terhubung ujung ke ujung
GL_TRIANGLES menggambar segitiga
GL_TRIANGLE_STRIP menggambar segitiga, menggambar segitiga setiap tiga titik
GL_TRIANGLE_FAN menggambar segitiga
GL_QUADS menggambar segi empat
GL_QUAD_STRIP menggambar garis segi empat, satu garis segi empat digambar untuk setiap empat titik
GL_POLYGON menggambar poligon
Contoh menggambar tiga titik:
mulai
glPushMatrix;
glMulai(GL_POINT);
glVertex2f(0.1,0.1);
glVertex2f(0,5,0,5);
glVertex2f(0.1,0.3);
akhir;
SwapBuffers(Canvas.Handle);
akhir;
Jika Anda mengubah GL_POINT menjadi GL_LINES, Anda akan menggambar garis. Poin ketiga tidak valid. Melakukan glColor3f(0,0,1) sebelum glVertex2f akan mengubah warna garis menjadi hijau dua Garis lurus.
Gunakan prosedur glPointSize untuk mengatur ukuran titik; gunakan prosedur glLineWidth untuk mengatur lebar garis.
Gunakan prosedur glLineStipple untuk mengatur templat garis putus-putus, dan gunakan prosedur glEnable(GL_LINE_STIPPLE) dan parameter terkait untuk mengaktifkan gambar menggambar garis putus-putus. Prosedur glDisable(GL_LINE_STIPPLE) dan parameter terkait mematikan garis putus-putus.
prosedur glLineStipple(faktor:GLint,pola:GLushort);
Faktor parameter mewakili jumlah pengulangan Pola pola garis putus-putus. Nilai faktornya adalah 1255. Pola adalah barisan biner.
glLineStipple(1,0,0x11C);{0x11C direpresentasikan sebagai 10001110, 0 berarti tidak menarik poin, 1 berarti menarik poin}
Contoh: mulai
glColor3f(1,0,0);
glLebarGaris(2);
glLineStipple(1,$11C);
glEnable(GL_LINE_STIPPLE);
glMulai(GL_LINES);
glVertex2f(-0.9,0.3);
glVertex2f(0.9,0.3);
akhir;
glNonaktifkan(GL_LINE_STIPPLE);
glColor3f(1,0,1);
glLineStipple(2,$11C);
glEnable(GL_LINE_STIPPLE);
glMulai(GL_LINES);
glVertex2f(-0.9,0.1);
glVertex2f(0.9,0.1);
akhir;
glNonaktifkan(GL_LINE_STIPPLE);
SwapBuffers(Canvas.Handle);
akhir;
Gambar poligon mirip dengan gambar garis titik. Anda perlu mengubah parameter menjadi GL_POLYGON, GL_QUADS, GL_TRANGLES.
Sisi-sisi poligon hanya berpotongan pada titik sudutnya
Poligon B harus berupa poligon cembung. Jika poligon cekung, pengguna hanya dapat melipatnya menjadi poligon cembung untuk mempercepat gambar.
Contoh: glBegin(GL_POLYGON);
glVertex2f(-0.9,0.3);
glVertex2f(0.9,0.3);
glVertex2f(0,9,-0,6);
glVertex2f(0,5,-0,6);
glVertex2f(-0,9,-0,2);
akhir;
Poligon memiliki sisi depan dan belakang, dan proses yang terkait dengannya adalah:
glPolygonMode mengontrol mode gambar depan dan belakang poligon
glFrontface menentukan muka depan poligon
glCullFace menampilkan poligon yang diatur untuk menghilangkan wajah
glPolygonStripple membentuk gaya isian poligon
3. Permukaan kuadrat sederhana
Silinder, cincin, dan bola semuanya merupakan permukaan kuadrat.
Sebuah silinder
gluCylinder(qobj:GLUquadricObj,baseRadius:GLdouble,topRadius:GLdouble,tinggi:GLdouble,
irisan:GLint,tumpukan:GLint);
qobj menentukan permukaan kuadrat, baseRadius adalah jari-jari dasar silinder; topRadius adalah jari-jari atas silinder yang ditarik; tinggi adalah tinggi silinder; irisan adalah jumlah garis pemisah di sekitar sumbu Z; garis pemisah sepanjang sumbu Z.
Jika baseRadius dan topRadius tidak sama, Anda dapat menggambar frustum dan kerucut.
prosedur TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
mulai
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluCylinder(qObj,0.5,0.1,0.2,10,10);
akhir;
Membawa
gluDisk(qobj:GLUquadricObj,innerRadius:GLdouble,outerRadius:GLdouble,slices:GLint,
loop:GLint);
prosedur TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
mulai
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluDisk(qObj,0.2,0.5,10,5);
SwapBuffers(Canvas.Handle);
akhir;
C setengah lingkaran
gluPartialDisk(qobj:GLUquadricObj,innerRadius:GLdouble,outerRadius:GLdouble,slices:GLint,
loop:GLint,startAngle:GLdouble,sweepAngle:GLdouble);
startAngle, menyapuAngle adalah sudut awal dan sudut akhir setengah lingkaran.
prosedur TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
mulai
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluPartialDisk(qObj,0.2,0.5,10,5,90,190);
SwapBuffers(Canvas.Handle);
akhir;
D bola
fungsi gluSphere(qObj:GLUquadricObj,radius:GLdouble,irisan:GLint,tumpukan:GLint);
prosedur TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
mulai
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
{ siluet[ silu(:)5et ]n.siluet, garis besar}
gluSphere(qObj,0.5,20,20);
SwapBuffers(Canvas.Handle);
akhir;
E Tentang proses permukaan kuadrat
gluNewQuadric membuat objek permukaan kuadrat baru
gluDeleteQuadric menghapus objek permukaan kuadrat
gluQuadricDrawStyle menentukan jenis permukaan kuadrat yang akan digambar
gluQuadricNormal menetapkan vektor normal permukaan kuadrat
gluQuadricOrientation mengatur apakah permukaan kuadrat diputar secara internal atau diputar secara eksternal
gluQuadricTexture mengatur apakah permukaan kuadrat menggunakan tekstur
F Langkah-langkah umum untuk menggambar permukaan kuadrat
Pertama-tama tentukan objek GLUquadricObj;
Kedua, buat objek permukaan gluNewQuadric;
Atur kembali properti permukaan kuadrat (gluQuadricDrawStyle, gluQuadricTexture)
Menggambar permukaan kuadrat (gluCylinder, gluSphere, gluDisk, gluPartialDisk)
6. Transformasi di OPENGL
Transformasi adalah dasar desain animasi, termasuk terjemahan grafis, rotasi, penskalaan, dan operasi lainnya, yang diimplementasikan secara matematis melalui matriks.
1 proses glLoadIdentity
Mampu mengubah matriks saat ini menjadi matriks identitas.
2 proses glLoadMatrix
Mampu mengatur matriks yang ditentukan sebagai matriks saat ini.
prosedur glLoadmatrixd(m:GLdouble);
prosedur glLoadmatrixf(m:GLfloat);
m mewakili matriks 4X4, kode berikut mendefinisikan dan menjadikannya matriks saat ini
M:array[1..4,1..4] dari GLfloat;
glLoadMatrix(@M);
3 proses glMultMatrix
Mampu mengalikan momen saat ini dengan matriks yang ditentukan dan menggunakan hasilnya sebagai momen saat ini.
prosedur glMultMatrixd(M:GLdouble);
prosedur glMultMatrixf(M:GLfloat);
4 glPushMatrix dan glPopmatrix
glPushMatrix dapat memasukkan momen saat ini ke dalam tumpukan matriks, dan glPopMatrix dapat mengeluarkan momen saat ini dari tumpukan matriks.
glPushMatrix dapat mengingat posisi matriks saat ini, dan glPopmatrix dapat mengembalikan posisi sebelumnya.
Catatan: glPushMatrix dan glPopMatrix harus ditempatkan di luar glBegin dan glEnd.
5 Transformasi proyeksi
GlOrtho dapat membuat matriks proyeksi ortografik, mengalikan momen saat ini dengan matriks proyeksi ortografik, dan menggunakan hasilnya sebagai matriks arus.
fungsi glOrtho(kiri:GLdouble,kanan:GLdouble,bawah:GLdouble,atas:GLdouble,
dekat:GLdouble,jauh:GLdouble);
prosedur TfrmMain.FormResize(Pengirim: TObject);
var
nRentang:GLfloat;
mulai
nRentang:=50,0;
w:=Lebar Klien;
h:=Tinggi klien;
jika h=0 maka
jam:=1;
glViewPort(0,0,w,h);
jika w<=h maka
glOrtho(-nRentang,nRentang,-nRentang*h/w,nRentang*h/w,
-nRentang,nRentang)
kalau tidak
glOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,
-nRentang,nRentang);
mengecat ulang;
akhir;
B glOrtho2D hanya mendefinisikan bagian depan, belakang, kiri dan kanan volume tampilan ortografis.
procedure glOrtho(kiri:GLdouble,kanan:GLdouble,bawah:GLdouble,atas:GLdouble);
Prosedur C glMatrixMode
Kemampuan untuk mengatur jenis matriks operasi saat ini
prosedur glMatrixMode(mode:GLenum);
Nilai modus:
GL_MODELVIEW menetapkan bahwa operasi matriks selanjutnya adalah tumpukan matriks model
GL_PROJECTION menetapkan bahwa operasi matriks selanjutnya adalah tumpukan matriks proyeksi
GL_TEXTURE menetapkan bahwa operasi matriks selanjutnya adalah tumpukan matriks tekstur
D glFrustum proses
Buat matriks proyeksi miring perspektif dan kalikan matriks saat ini dengan matriks proyeksi miring. Hasilnya adalah matriks saat ini.
prosedur glFrustum(kiri:GLdouble,kanan:GLdouble,bawah:GLdouble,atas:GLdouble,
selanjutnya:GLdouble,jauh:GLdouble);
Parameter ini menentukan bidang kliping kiri, kanan, atas, bawah, depan, dan belakang dari proyeksi miring.
E gluProses perspektif
Mampu menentukan volume tampilan piramida empat sisi dengan sumbu Z sebagai garis tengahnya.
prosedur gluPerspektif(fovy:GLdouble,aspek:GLdouble,zNear:GLdouble,zFar:GLdouble);
fovy mendefinisikan perspektif bidang xoz, aspek mendefinisikan rasio dalam arah x dan y, zNear dan zFar masing-masing menentukan jarak dari sudut pandang ke bidang kliping dan bidang kliping belakang.
prosedur TfrmMain.FormResize(Pengirim: TObject);
var
aspek:GLfloat;
mulai
w:=Lebar Klien;
h:=Tinggi Klien;
jika h=0 maka
jam:=1;
glViewPort(0,0,clientWidth,Clientheight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
aspek:=w/h;
gluPerspective(30.0,aspek,1.0,50.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
akhir;
6 Matriks transformasi geometri
Transformasi postur gerak suatu benda tiga dimensi mengacu pada translasi, rotasi, dan penskalaan benda tersebut.
Proses glTranslate dapat memindahkan asal koordinat ke (x, y, z), sintaks deklarasinya:
procedure glTranslated(x:GLdouble,y:GLdouble,z:GLdouble);
prosedur glTranslatef(x:GLdouble,y:GLdouble,z:GLdouble);
B glRotate dapat memutar objek ke sudut tertentu. Sintaks deklarasinya adalah:
prosedur glRotated(sudut:GLdouble,x:GLdouble,y:GLdouble,z:GLdouble);
prosedur glRotatef(sudut:GLdouble,x:GLdouble,y:GLdouble,z:GLdouble);
Diantaranya, sudut adalah sudut rotasi, dan sumbu pusat rotasi adalah garis yang menghubungkan dua titik (0,0,0) dan (x,y,z).
C glScale dapat menskalakan sistem koordinat, dan sintaks deklarasinya adalah:
prosedur glScaled(x:GLdouble,y:GLdoble,z:GLdouble);
prosedur glScalef(x:GLdouble,y:GLdoble,z:GLdouble);
Nilai x, y, dan z yang lebih besar dari 1 melambangkan pembesaran, dan nilai yang kurang dari 1 melambangkan pengurangan.
Contoh kode asli:
satuan MainFrm;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir,
Dialog, OpenGL, ExtCtrls;
jenis
TfrmMain = kelas(TForm)
Pengatur Waktu1: Pengatur Waktu;
prosedur FormCreate(Pengirim: TObject);
prosedur FormDestroy(Pengirim: TObject);
prosedur FormPaint(Pengirim: TObject);
procedure FormKeyDown(Pengirim: TObject; var Kunci: Word;
Pergeseran: TShiftState);
prosedur FormResize(Pengirim: TObject);
procedure Timer1Timer(Pengirim: TObject);
procedure FormClose(Pengirim: TObject; var Action: TCloseAction);
pribadi
{Deklarasi pribadi}
jam:HGLRC;
w,h:Bilangan Bulat;
lintang, bujur: GLfloat;
radius:GLganda;
publik
{Pernyataan publik}
prosedur Gambar Saya;
prosedur InisialisasiGL(var lebar:GLsizei;tinggi:GLsizei);
akhir;
var
frmUtama: TfrmUtama;
pelaksanaan
{$R *.dfm}
procedure TfrmMain.FormCreate(Pengirim: TObject);
var
pfd:TPixelFormatDescriptor;
Format Piksel:Bilangan Bulat;
mulai
ControlStyle:=ControlStyle+[csOpaque];
IsiChar(pfd,ukuran(pfd),0);
dengan pfd lakukan
mulai
nUkuran:=ukuran(TPixelFormatDescriptor);
nVersi:=1;
dwFlags:=PFD_DRAW_TO_WINDOW atau
PFD_SUPPORT_OPENGL atau PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cWarnaBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
akhir;
PixelFormat:=PilihPixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Kanvas.Handle);
w:=ClientRect.Kanan;
h:=ClientRect.Bawah;
InisialisasiGL(w,h);
akhir;
prosedur TfrmMain.FormDestroy(Pengirim: TObject);
mulai
wglDeleteContext(hrc);
akhir;
prosedur TfrmMain.FormPaint(Pengirim: TObject);
mulai
wglMakeCurrent(Canvas.Handle,hrc);
glClearColor(1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT);
Gambar Saya;
glFlush;
akhir;
prosedur TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
mulai
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
glDiputar(0.5,0.0,1.0,0.0);
glRotated(-lintang,1.0,0.0,0.0);
glrotated(bujur,0.0,0.0,1.0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluSphere(qObj,0.5,20,20);
SwapBuffers(Canvas.Handle);
akhir;
{prosedur TfrmMain.FormResize(Pengirim: TObject);
var
nRentang:GLfloat;
mulai
nRentang:=50,0;
w:=Lebar klien;
h:=Tinggi klien;
jika h=0 maka
jam:=1;
glViewPort(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
jika w<=h maka
glOrtho(-nRentang,nRentang,-nRentang*h/w,nRentang*h/w,
-nRentang,nRentang)
kalau tidak
glOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,
-nRentang,nRentang);
glMatrixMode(GL_MODELVIEW);
glBebanidentitas;
mengecat ulang;
akhir;
}
procedure TfrmMain.FormKeyDown(Pengirim: TObject; var Key: Word;
Pergeseran: TShiftState);
mulai
jika Kunci=VK_ESCAPE maka
Menutup;
jika Kunci=VK_UP maka
glRotatef(-5,1.0,0.0,0.0);
jika Kunci=VK_DOWN maka
glRotatef(5,1.0,0.0,0.0);
jika Kunci=VK_LEFT maka
glRotatef(-5,0.0,1.0,0.0);
jika Kunci=VK_RIGHT maka
glRotatef(5.0,0.0,1.0,0.0);
mengecat ulang;
akhir;
prosedur TfrmMain.FormResize(Pengirim: TObject);
mulai
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort(0,0,clientWidth,clientHeight);
mengecat ulang;
membatalkan;
akhir;
prosedur TfrmMain.InitializeGL(var lebar: GLsizei; tinggi: GLsizei);
var
maxObjectSize,aspek:GLfloat;
dekat_pesawat:GLdouble;
mulai
glClearindex(0);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
aspek:=1.0;
gluPerspective(45.0,aspek,3.0,7.0);
glmatrixMode(GL_MODELVIEW);
dekat_pesawat:=0,3;
maxObjectSize:=0,3;
radius:=dekat_pesawat+maxObjectSize/2.0;
garis lintang:=0,3;
garis bujur:=0,6;
akhir;
prosedur TfrmMain.Timer1Timer(Pengirim: TObject);
mulai
timer1.Enabled:=false;
Gambar Saya;
Menghasilkan;
Timer1.Diaktifkan:=benar;
akhir;
procedure TfrmMain.FormClose(Pengirim: TObject; var Action: TCloseAction);
mulai
timer1.Enabled:=false;
jika hrc<>batal maka
wglDeleteContext(hrc);
akhir;
akhir.
7. Pencahayaan dan tekstur OPENGL
Semuanya dimaksudkan untuk meningkatkan efek tiga dimensi dan efek warna. Pencahayaan dapat meningkatkan kecerahan dan efek tiga dimensi pada grafik, dan tekstur dapat membuat grafik lebih realistis. Melalui penggunaan pencahayaan, tampilan suatu objek dapat diekspresikan secara kuat, dan tekstur dapat membuat objek tersebut menampilkan tampilan yang beragam.
1 Proses dan aplikasi pencahayaan dan sumber cahaya
Prosedur glIndex membuat warna dalam tabel indeks warna menjadi warna saat ini.
prosedur glIndexd(c:GLdouble);
prosedur glIndexf(c:GLdouble);
prosedur glIndexi(c:GLdouble);
prosedur glIndexs(c:GLdouble);
Parameter C adalah nilai indeks. Jika prosedur glIndex digunakan, anggota iPixelType dalam struktur TPiexlFormatDescriptor diatur ke PFD_TYPE_COLORINDEX.
B prosedur glShadeModel
Proses glShadeModel menyetel mode pengisian, nilai: GL_SMOOTH.
prosedur glShadeModel(mode:GLenum);
Catatan: Dua proses di atas hanya dapat digunakan di luar glBegin....glEnd.
Prosedur C glLight mendefinisikan sumber cahaya
prosedur glLightf(cahaya:GLenum,pname:GLenum,param:GLfloat);
prosedur glLighti(cahaya:GLenum,pname:GLenum,param:GLfloat);
Parameter light mendefinisikan sumber cahaya, nilainya dapat berupa: GL_LIGHT0....GL_LIGHTN, nilai N kurang dari GL_MAX_LIGHT.
Parameter pname menentukan parameter sumber cahaya:
GL_AMBIENT komponen intensitas cahaya sekitar
GL_DIFFUSE komponen intensitas cahaya yang tersebar
GL_SPECULAR komponen intensitas cahaya yang dipantulkan
GL_POSITION posisi sumber cahaya
GL_SPOT_DIRECTION Arah fokus sumber cahaya
Indeks sumber cahaya GL_SPOT_EXPONENT
Arah sumber cahaya GL_SPOT_CUTOFF
GL_CONSTANT_ATTENUATION faktor peluruhan konstan ringan
GL_LINEAR_ATTENUATION faktor redaman sekunder ringan
Mengaktifkan dan mematikan sumber cahaya menggunakan prosedur glEnable() dan glDisable()
glEnable(GL_LIGHTING); //Aktifkan sumber cahaya
glDisable(GL_LIGHTING); //Matikan sumber cahaya
glEnable(GL_LIGHT0); //Aktifkan sumber cahaya ke-0
glDisable(GL_LIGHT0); //Matikan sumber cahaya ke-0
Contoh pengaturan sumber cahaya:
var
arah:Array[1..4] dari GLfloat:={0.0,1.0,0.0,0.0};
glLightfv(GL_LIGHT0,GL_SPOT_CUTOFF,60);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,arah);
2 Bahan dan model pencahayaan
Prosedur glMaterial menetapkan parameter material
procedure glMaterialf(wajah:GLenum,pname:GLenum,param:GLfloat);
prosedur glMateriali(wajah:GLenum,pname:GLenum,param:GLfloat);
procedure glMaterialfv(wajah:GLenum,pname:GLenum,param:GLfloat);
procedure glMaterialiv(wajah:GLenum,pname:GLenum,param:GLfloat);
Parameter face menentukan permukaan objek, dan nilainya adalah: GL_FRONT, GL_BACK, GL_FRONT_BACK.
pname,param tidak diperkenalkan dalam materi ini.
B proses glLightModel
prosedur glLightModelf(pname:GLenum,param:GLfloat);
Parameter pname adalah parameter model sumber cahaya, yang dapat mengambil nilai GL_LIGHT_MODEL_AMBIENT,
GL_LIGHT_MODEL_LOCAL_VIEWER,GL_LIGHT_MODEL_TWO_SIDE.
Contoh kode:
prosedur TfrmMain.SetLighting;
var
MaterialAmbient:array[1..4] dari GLfloat;
MaterialDiffuse:Array[1..4] dari GLfloat;
MaterialSpecular:Array[1..4] dari GLfloat;
AmbientLightPosition:Array[1..4] dari GLfloat;
LightAmbient:Array[1..4] dari GLfloat;
Kecemerlangan Bahan: GLfloat;
mulai
MaterialAmbient[1]:=0,5;
MaterialAmbient[2]:=0,8;
MaterialAmbient[1]:=0,2;
MaterialAmbient[1]:=1.0;
MaterialDiffuse[1]:=0,4;
MaterialDiffuse[2]:=0,8;
MaterialDiffuse[3]:=0,1;
MaterialDiffuse[4]:=1.0;
MaterialSpecular[1]:=1.0;
MaterialSpecular[2]:=0,5;
MaterialSpecular[3]:=0,1;
MaterialSpecular[4]:=1.0;
kecemerlangan material:=50.0;
Posisi Cahaya Sekitar[1]:=0,5;
Posisi Cahaya Sekitar[2]:=1.0;
Posisi Cahaya Sekitar[3]:=1.0;
Posisi Cahaya Sekitar[4]:=0,0;
Suasana Cahaya[1]:=0,5;
Suasana Cahaya[2]:=0,2;
Suasana Cahaya[3]:=0,8;
Suasana Cahaya[4]:=1.0;
glMaterialfv(GL_FRONT,GL_AMBIENT,@MaterialAmbient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,@MaterialDiffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,@MaterialSpecular);
glMaterialfv(GL_FRONT,GL_SHININESS,@MaterialShininess);
glLightfv(GL_LIGHT0,GL_POSITION,@AmbientLightPosition);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@LightAmbient);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLShadeModel(GL_SMOOTH);
akhir;
3 Penerapan tekstur
GlTexImage1D mendefinisikan peta tekstur satu dimensi.
prosedur glTexImage1D(target:GLenum,level:GLint,komponen:GLint,lebar:GLsizei,
batas:GLint,format:GLenum,ketik:GLenum,piksel:GLvoid);
Nilai target parameternya adalah GL_TEXTURE_1D yang didefinisikan sebagai pemetaan tekstur, level adalah level gambar tekstur dengan resolusi multi-level, lebar adalah lebar tekstur, nilainya 2n, dan nilai n adalah 32, 64, 129 , dll. Perbatasan adalah batas tekstur, dan nilainya 0 atau 1, Piksel adalah lokasi tekstur dalam memori. Komponen menentukan pencampuran dan penyesuaian RGBA:
1Pilih bahan B
2Pilih bahan B dan A
3Pilih bahan R, G, B
4Pilih bahan R,G,B,A
B glTexImage2D mendefinisikan pemetaan tekstur dua dimensi
prosedur glTexImage2D(target:GLenum,level:GLint,komponen:GLint,lebar:GLsizei,
batas:GLint,format:GLenum,ketik:GLenum,piksel:GLvoid);
Jika target parameternya adalah GL_TEXTURE_2D, artinya pemetaan tekstur dua dimensi, tinggi adalah tinggi tekstur, dan parameter lain dalam fungsinya sama dengan glTexImage1D Nilai parameter komponen sama seperti di atas.
Contoh kode:
prosedur TfrmMain.SetTextures;
var
bit:Array[1..64,1..64,1..64] dari GLubyte;
bmp:TBitmap;
i,j:Bilangan Bulat;
mulai
bmp:=TBitmap.Buat;
bmp.LoadFromFile('d:/dsoft/1119/01/logon.bmp');
untuk i:=1 hingga 64 lakukan
untuk j:=1 hingga 64 lakukan
mulai
bit[i,j,1]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
bit[i,j,2]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
bit[i,j,3]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
bit[i,j,4]:=255;
akhir;
{0 mewakili tingkat bayangan warna tunggal, GL_RGBA mewakili nilai campuran
64X64 mewakili tinggi dan lebar tekstur, 0 mewakili tanpa batas,
GL_RGBA mewakili tipe tekstur, GL_UNSIGNED_TYPE mewakili tipe data, @Generation Object Address}
GLTEXIMAGE2D (GL_TEXTURE_2D, 0, GL_RGBA, 64,64,0, GL_RGBA,
Gl_unsigned_byte,@bits);
Glenable (GL_TEXTURE_2D);
akhir;
C GlTExParameter Prosedur Mengatur Parameter Tekstur
Prosedur GlTExParameterf (Target: Glenum, PName: Glenum, Param: GlFloat);
Prosedur GlTExparameteri (target: glenum, pname: glenum, param: glfloat);
Target parameter mewakili GL_TEXTURE_1D atau GL_TEXTURE_2D, dan param adalah nilai tekstur.
D GLTEXENV Fungsi mengatur parameter lingkungan dari tekstur
fungsi gltexenvf (target: glenum, pname: glenum, param: glfloat);
fungsi gltexenvi (target: glenum, pname: glenum, param: glfloat);
Target parameter adalah GL_TEXTURE_ENV,
PNAME PARAMETER adalah nilai parameter tekstur, dan nilainya adalah GL_TEXTURE_ENV_MODE
Parameter parameter adalah nilai lingkungan, dan nilainya adalah GL_Modulate, GL_DECAL dan GL_BLEND.
Kode sampel untuk program ini:
unit mainfrm;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir,
Dialog, OpenGL, extctrls;
jenis
TfrmMain = kelas(TForm)
Pengatur Waktu1: Pengatur Waktu;
prosedur FormCreate(Pengirim: TObject);
prosedur FormDestroy(Pengirim: TObject);
Prosedur FormPaint (Pengirim: Tobject);
Prosedur FormKeyDown (Pengirim: Tobject; Var Key: Word;
Pergeseran: TShiftState);
Prosedur Formresize (Pengirim: Tobject);
procedure Timer1Timer(Pengirim: TObject);
procedure FormClose(Pengirim: TObject; var Action: TCloseAction);
pribadi
{Deklarasi pribadi}
HRC: HGLRC;
W, H: Integer;
lintang, bujur: Glfloat;
Radius: Gldouble;
publik
{Pernyataan publik}
Pengaturan Prosedur;
Prosedur Pengendapan;
Prosedur MyDraw;
Prosedur Initializegl (Lebar Var: Glsizei; Tinggi: Glsizei);
akhir;
var
frmmain: tfrmmain;
pelaksanaan
{$R *.dfm}
Prosedur tfrmmain.FormCreate (pengirim: tobject);
var
PFD: tpixelformattdescriptor;
Pixelformat: Integer;
mulai
ControlStyle: = ControlStyle+[CsOPaque];
Fillchar (PFD, sizeof (PFD), 0);
dengan PFD lakukan
mulai
nsize: = sizeof (tpixelformattdescriptor);
nversion: = 1;
dwflags: = pfd_draw_to_window atau
Pfd_support_opengl atau pfd_doublebuffer;
ipixeltype: = pfd_type_rgba;
ccolorbits: = 24;
CDEPTHBITS: = 32;
ilayertype: = pfd_main_plane;
akhir;
Pixelformat: = choosepixelformat (canvas.handle,@pfd);
Setpixelformat (canvas.handle, pixelformat,@pfd);
hrc: = wglcreateContext (canvas.handle);
w: = clientrect.right;
h: = clientrect.bottom;
Initializegl (w, h);
akhir;
Prosedur tfrmmain.Formdestroy (pengirim: tobject);
mulai
wgldeleteContext (HRC);
akhir;
Prosedur tfrmmain.FormPaint (pengirim: tobject);
mulai
wglmakecurrent (Canvas.handle, HRC);
Glclearcolor (1,1,1,1);
Glcolor3f (1,0,0);
GLCLEAR (GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT);
Pengaturan;
Mydraw;
Setlight;
Glflush;
akhir;
Prosedur tfrmmain.mydraw;
var
QOBJ: Gluquadricobj;
mulai
Glpushmatrix;
GLCLEAR (GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT);
Glcolor3f (1,0,0);
glrotated (0,5,0,0,1,0,0,0);
glrotated (-latitude, 1.0.0.0.0.0);
Glrotated (bujur, 0,0,0,0,1,0);
qobj: = glunewquadric;
gluquadricdrawstyle (qobj, glu_line);
GLUSPHERE (QOBJ, 0,5,20,20);
Swapbuffer (canvas.handle);
Setlight;
Pengaturan;
akhir;
{Prosedur tfrmmain.FormResize (pengirim: tobject);
var
nrange: glfloat;
mulai
nrange: = 50.0;
W: = ClientWidth;
H: = ClientHeight;
Jika h = 0 lalu
h: = 1;
Glviewport (0,0, w, h);
GLMATRIXMODE (GL_PROQUECTION);
Glloadidentity;
Jika w <= h maka
Glortho (-nrange, nrange, -nrange*h/w, nrange*h/w,
-nrange, nrange)
kalau tidak
Glortho (-nrange*h/w, nrange*h/w, -nrange, nrange,
-nrange, nrange);
GLMATRIXMODE (GL_MODELVIEW);
Glloadidentity;
mengecat ulang;
akhir;
}
Prosedur tfrmmain.FormKeyDown (pengirim: tobject; var Key: word;
Pergeseran: TShiftState);
mulai
Jika kunci = vk_escape maka
Menutup;
Jika kunci = vk_up maka
GlrotateF (-5,1.0.0.0.0.0);
Jika kunci = vk_down maka
GlrotateF (5,1.0.0.0.0.0);
Jika Key = VK_LEFT maka
GlrotateF (-5,0.0,1.0.0.0);
Jika Key = VK_RIGHT maka
GlrotateF (5.0.0.0.1.0.0.0);
mengecat ulang;
akhir;
Prosedur tfrmmain.FormResize (pengirim: Tobject);
mulai
GLMATRIXMODE (GL_PROQUECTION);
Glloadidentity;
Glfrustum (-1.0,1.0, -1.0,1.0,3.0,7.0);
Glviewport (0,0, ClientWidth, ClientHeight);
mengecat ulang;
membatalkan;
akhir;
Prosedur tfrmmain.initializeGl (lebar var: glsizei; tinggi: glsizei);
var
MaxObjectSize, Aspek: GlFloat;
near_plane: gldouble;
mulai
GlclearIndex (0);
Glcleardepth (1.0);
glenable (gl_depth_test);
GLMATRIXMODE (GL_PROQUECTION);
Aspek: = 1.0;
Gluperspective (45.0, Aspek, 3.0,7.0);
GLMATRIXMODE (GL_MODELVIEW);
near_plane: = 0.3;
MaxObjectSize: = 0.3;
Radius: = near_plane+maxObjectSize/2.0;
Latitude: = 0.3;
Longitude: = 0,6;
akhir;
Prosedur tfrmmain.timer1Timer (pengirim: tobject);
mulai
timer1.Enabled:=false;
Mydraw;
Menghasilkan;
Timer1.enabled: = true;
akhir;
Prosedur tfrmmain.formclose (pengirim: tobject; var action: tcloseaction);
mulai
timer1.Enabled:=false;
Jika HRC <> null maka
wgldeleteContext (HRC);
akhir;
Prosedur tfrmmain.setlighting;
var
Materialambient: array [1..4] dari glfloat;
MaterialDiffuse: Array [1..4] dari GlFloat;
Materialspecular: array [1..4] dari glfloat;
Ambientlightposition: array [1..4] dari glfloat;
Lightambient: Array [1..4] dari GlFloat;
Materialshininess: Glfloat;
mulai
Materialambient [1]: = 0,5;
Materialambient [2]: = 0.8;
Materialambient [1]: = 0.2;
Materialambient [1]: = 1.0;
MaterialDiffuse [1]: = 0.4;
MaterialDiffuse [2]: = 0.8;
MaterialDiffuse [3]: = 0.1;
MaterialDiffuse [4]: = 1.0;
Materialspecular [1]: = 1.0;
Materialspecular [2]: = 0,5;
Materialspecular [3]: = 0.1;
Materialspecular [4]: = 1.0;
Materialshininess: = 50.0;
Ambientlightposition [1]: = 0,5;
Ambientlightposition [2]: = 1.0;
Ambientlightposition [3]: = 1.0;
AmbientlightPosition [4]: = 0.0;
Lightambient [1]: = 0,5;
Lightambient [2]: = 0.2;
Lightambient [3]: = 0.8;
Lightambient [4]: = 1.0;
GLMATERIALFV (GL_FRONT, GL_ambient,@materialambient);
GLMATERIALFV (GL_FRONT, GL_DIFFUSE,@MaterialDiffuse);
GLMATERIALFV (GL_FRONT, GL_Specular,@materialspecular);
GLMATERIALFV (GL_FRONT, GL_SHININES,@materialshininess);
Gllightfv (GL_LIGHT0, GL_POSISI,@AmbientlightPosition);
GllightModelFv (GL_LIGHT_MODEL_AMBIENT,@Lightambient);
glenable (gl_light);
glenable (gl_light0);
Glshademodel (Gl_smooth);
akhir;
Prosedur tfrmmain.setextures;
var
bit: array [1..64,1..64,1..64] dari glubyte;
BMP: tbitmap;
I, J: Integer;
mulai
BMP: = tbitmap.create;
BMP.LoadFromFile ('D: /dsoft/1119/02/logon.bmp');
untuk i: = 1 hingga 64 lakukan
untuk j: = 1 hingga 64 lakukan
mulai
bit [i, j, 1]: = glbyte (getRvalue (bmp.canvas.pixels [i, j]));
bit [i, j, 2]: = glbyte (getRvalue (bmp.canvas.pixels [i, j]));
bit [i, j, 3]: = glbyte (getRvalue (bmp.canvas.pixels [i, j]));
bit [i, j, 4]: = 255;
akhir;
GlpixelStorei (GL_UNPACK_Alignment, 4);
GLTEXPARAMETERI (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
GLTEXPARAMETERI (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
GLTEXPARAMETERI (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
{0 mewakili tingkat naungan warna tunggal, GL_RGBA mewakili nilai campuran
64x64 mewakili tinggi dan lebar tekstur, 0 tidak mewakili perbatasan,
GL_RGBA mewakili tipe tekstur, GL_UNSIGNED_TYPE mewakili tipe data, @Generation Object Address}
GLTEXIMAGE2D (GL_TEXTURE_2D, 0, GL_RGBA, 64,64,0, GL_RGBA,
Gl_unsigned_byte,@bits);
Glenable (GL_TEXTURE_2D);
GLTEXENVF (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
akhir;
akhir.