1. Kata Pengantar:
Delphi mendukung OpenGl secara default. Anda dapat menggunakan unit penggunaan OpenGL untuk mereferensikannya, dan kemudian Anda dapat menggunakan fungsi OpenGL. OpenGl adalah lintas platform, dan Windows telah lama mendukung dan mengintegrasikannya ke dalam sistem. Opengl32.dll ada di system32 dan tidak memerlukan instalasi tambahan. Meskipun Windows sendiri memiliki d3d, namun kemampuannya terbatas dan halaman materi pembelajaran terkait relatif sedikit.
Biasanya OpenGL hanya mendukung bentuk geometris dasar berikut: titik, garis, dan poligon . Tidak ada permukaan atau grafik tingkat tinggi (seperti bola) yang dapat digambar sebagai elemen grafis dasar. Tapi mereka bisa disimulasikan dengan sempurna menggunakan poligon. Lihatlah game 3D modern dengan santai dan Anda akan melihat bahwa game tersebut hampir seluruhnya dibuat dari segitiga. Oleh karena itu, kami tidak terikat dengan batasan ini.
2. Inisialisasi
Sebelum menggunakan OpenGL, Anda perlu mengatur beberapa parameter terkait. Proses umumnya adalah:
"Setel format piksel yang cocok" (ChoosePixelFormat, SetPixelFormat)
"Buat konteks rendering OpenGL baru" (wglCreateContext)
"Setel parameter terkait OpenGL", "Menggambar" (glBegin, glEnd)
"Hapus konteks rendering OpenGL" (wglDeleteContext)
prosedur TForm1.FormCreate(Pengirim: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;mulai Dengan pfd mulai nSize := sizeof(TPIXELFORMATDESCRIPTOR); // ukuran nVersion := 1; // versi dwFlags := PFD_SUPPORT_OPENGL atau PFD_DRAW_TO_WINDOW atau PFD_DOUBLEBUFFER; // mendukung buffering ganda iPixelType := PFD_TYPE_RGBA; // jenis warna cColorBits := 24; // kedalaman warna yang diinginkan cRedBits := 0; := 0; cBita Biru := 0; cPergeseran Biru := 0; cAlphaBits := 0; cAlphaShift := 0; // tidak ada buffer alfa cAccumBits := 0; cAccumRedBits := 0; // tidak ada buffer akumulasi, cAccumGreenBits := 0; = 0; cDepthBits := 16; // penyangga kedalaman cStencilBits := 0; // tidak ada buffer stensil cAuxBuffers := 0; // tidak ada buffer tambahan iLayerType := PFD_MAIN_PLANE; // lapisan utama bReserved := 0; = DapatkanDC(Menangani); pixelFormat := ChoosePixelFormat(FDC, @pfd); jika pixelFormat = 0 maka Keluar; jika tidak SetPixelFormat(FDC, pixelFormat, @pfd) maka Keluar; ke Parameter hitam adalah RGBA glClearColor(0, 0, 0, 0); //Mengatur tampilan proyeksi transformasi matriks proyeksi ortografik glMatrixMode(GL_PROJECTION); //Mengatur ulang matriks yang ditentukan saat ini ke matriks identitas glLoadIdentity //Tentukan OpenGL untuk menggambar di area ini glViewPort(0, 0, ClientWidth, ClientHeight); // Tetapkan rentang sistem koordinat dunia gluOrtho2D(0, ClientWidth, ClientHeight, 0); Mengalihkan objek transformasi matriks ke transformasi tampilan model glMatrixMode(GL_MODELVIEW); //Reset matriks yang ditentukan saat ini ke matriks identitas glLoadIdentity;end;
3. Menggambar
Primitif dasar OpenGL adalah titik, garis, poligon, dll. Setiap kali menggambar, Anda perlu menggunakan glBegin() dan glEnd(). Misalnya, prosedur fungsi menggambar berikut Menggambar;
procedure TForm1.Draw;begin // Hapus buffer glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT); // Hapus buffer glColor3ub(0, 255, 0); ; //Transmisikan tiga koordinat titik sudut segitiga ke OpenGL glVertex2f(400, 300); SwapBuffers(FDC); //Tukar konten buffer ganda, yang akan menyalin grafik yang baru saja digambar ke layar. akhir;
4. Terakhir, ingatlah untuk melepaskan . Seluruh kodenya adalah sebagai berikut:
unit Unit1;antarmukamenggunakan Windows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir, Dialog, OpenGL;ketik TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject procedure FormPaint(); Pengirim: TObject); prosedur FormResize(Pengirim: TObject); pribadi { Deklarasi pribadi } FDC: HDC; FHRC: HGLRC; prosedur Draw; public { Deklarasi publik } end;var Form1: TForm1;implementasi{$R *.dfm}prosedur TForm1.Draw;begin // Hapus buffer glClear(GL_COLOR_BUFFER_BIT atau GL_DEPTH_BUFFER_BIT); // Hapus buffer glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES);//Beri tahu OpenGL bahwa segitiga akan digambar glVertex2f(200, 300); //Transfer tiga koordinat titik segitiga ke OpenGL glVertex2f(400, 300); glEnd; //Akhiri gambar gambar yuan. SwapBuffers(FDC); //Tukar isi buffer ganda, yang akan menyalin grafik yang baru saja digambar ke layar. akhir;prosedur TForm1.FormCreate(Pengirim: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;mulai Dengan pfd mulai nSize := sizeof(TPIXELFORMATDESCRIPTOR); // ukuran nVersion := 1; // versi dwFlags := PFD_SUPPORT_OPENGL atau PFD_DRAW_TO_WINDOW atau PFD_DOUBLEBUFFER; // mendukung buffering ganda iPixelType := PFD_TYPE_RGBA; // jenis warna cColorBits := 24; // kedalaman warna yang diinginkan cRedBits := 0; ; cPergeseran Hijau := 0; cBits Biru := 0; cBlueShift := 0; cAlphaBits := 0; cAlphaShift := 0; // tidak ada buffer alfa cAccumBits := 0; = 0; cAccumAlphaBits := 0; cDepthBits := 16; cStencilBits := 0; // tidak ada buffer stensil cAuxBuffers := 0; // tidak ada buffer tambahan iLayerType := PFD_MAIN_PLANE; // lapisan utama bReserved := 0; ; FDC := DapatkanDC(Menangani); := ChoosePixelFormat(FDC, @pfd); jika pixelFormat = 0 maka Keluar; jika tidak SetPixelFormat(FDC, pixelFormat, @pfd) maka Keluar; Warnanya hitam dan parameternya adalah RGBA glClearColor(0, 0, 0, 0); //Mengatur tampilan proyeksi transformasi matriks proyeksi ortografik glMatrixMode(GL_PROJECTION); //Mengatur ulang matriks yang ditentukan saat ini ke matriks identitas glLoadIdentity //Tentukan OpenGL untuk menggambar di area ini glViewPort(0, 0, ClientWidth, ClientHeight) ; //Mengatur jangkauan sistem koordinat dunia gluOrtho2D(0, ClientWidth, ClientHeight, 0); Alihkan objek transformasi matriks ke transformasi tampilan model glMatrixMode(GL_MODELVIEW); //Reset matriks yang ditentukan saat ini ke matriks identitas glLoadIdentity;end;procedure TForm1.FormDestroy(Sender: TObject);begin wglMakeCurrent(FDC, FHRC); FHRC ); RilisDC(Menangani, FDC);akhir;prosedur TForm1.FormPaint(Sender: TObject);begin Draw;end;procedure TForm1.FormResize(Sender: TObject);begin //Tentukan area gambar ketika ukuran jendela berubah glClearColor(0, 0, 0, 0); ) ; gluOrtho2D(0, Lebar Klien, Tinggi Klien, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity;akhir;akhir.
Klik di sini untuk mengunduh kode lengkapnya