Dengan
kata lain, perintah rendering grafis OpenGL yang dikeluarkan oleh aplikasi Anda dapat
diarahkan ke perangkat keras grafis dan dipercepat.
3 set perpustakaan dalam program OpenGL :
1. nti OpenGL (GL) : terdiri dari ratusan perintah, yang dimulai dengan awalan " gl"
(misalnya, glColor, glVertex, glTranslate, glRotate). Core OpenGL memodelkan
suatu objek melalui sekumpulan primitif geometri seperti titik, garis, dan poligon.
2. OpenGL Utility Library (GLU) : dibangun di atas inti OpenGL untuk
menyediakan utilitas penting (seperti mengatur tampilan dan proyeksi kamera) dan
lebih banyak model bangunan (seperti permukaan qradric dan tessellation
poligon). Perintah GLU mulai dengan awalan " glu"
(mis. gluLookAt, gluPerspective).
3. OpenGL Utilities Toolkit (GLUT) : OpenGL dirancang untuk terlepas dari
sistem windowing atau sistem operasi. GLUT diperlukan untuk berinteraksi dengan
Sistem Operasi (seperti membuat jendela, menangani input tombol dan mouse); itu
juga menyediakan lebih banyak model bangunan (seperti bola dan torus). Perintah
GLUT dimulai dengan awalan " glut"
(mis. glutCreatewindow, glutMouseFunc). GLUT adalah platform independen, yang
dibangun di atas ekstensi OpenGL khusus platform seperti GLX untuk Sistem X
Window, WGL untuk Microsoft Window, dan AGL, CGL atau Cocoa untuk Mac OS.
4. OpenGL Extension Wrangler Library (GLEW) : "GLEW adalah pustaka
pemuatan ekstensi open / source C / C ++ lintas-platform open-source. GLEW
menyediakan mekanisme run-time yang efisien untuk menentukan ekstensi OpenGL
mana yang didukung pada platform target.
/ * Handler untuk acara pengecatan ulang jendela. Telepon balik ketika jendela
pertama kali muncul dan
setiap kali jendela perlu dicat ulang. * /
tampilan batal () {
glClear (GL_COLOR_BUFFER_BIT); // Bersihkan buffer warna dengan warna
kliring saat ini
/ * Fungsi utama: GLUT berjalan sebagai aplikasi konsol mulai dari main () * /
int main (int argc, char ** argv) {
glutInit (& argc, argv); // Inisialisasi GLUT
glutCreateWindow ("Vertex, Primitive & Color"); // Buat jendela dengan judul
yang diberikan
glutInitWindowSize (320, 320); // Tetapkan lebar & tinggi
glutInitWindowPosition awal jendela (50, 50); // Posisikan awal sudut kiri atas
glutDisplayFunc (tampilan); // Daftarkan callback handler untuk acara
pengecatan ulang jendela
initGL (); // Inisialisasi OpenGL kami sendiri
glutMainLoop (); // Masukkan loop pemrosesan-acara
return 0;
}
Output yang diharapkan dan koordinat adalah sebagai berikut. Perhatikan bahwa 4
bentuk memiliki warna murni, dan 2 bentuk memiliki warna yang menyatu dari
simpulnya.
// Dalam tampilan (), kosongkan buffer warna (yaitu, atur latar belakang) dengan
glClear "kliring" warna saat ini (GL_COLOR_BUFFER_BIT);
Sebagai contoh,
batal glutMainLoop ()
7. Warna
Kami menggunakan glColorfungsi untuk mengatur warna latar depan ,
dan glClearColorfungsi untuk mengatur warna latar belakang (atau membersihkan ).
Catatan:
Warna biasanya ditentukan dalam floatkisaran 0.0fdan 1.0f.
Warna dapat ditentukan menggunakan komponen RGB (Merah-Hijau-Biru) atau
RGBA (Merah-Hijau-Biru-Alpha). 'A' (atau alpha) menentukan indeks transparansi
(atau opacity), dengan nilai 1 menunjukkan buram (tidak transparan dan tidak dapat
melihat-melalui) dan nilai 0 menunjukkan total transparan. Kami akan membahas
alpha nanti.
8. Primitif Geometris
Dalam OpenGL, suatu objek terdiri dari primitif geometris seperti segitiga, quad,
segmen garis dan titik. Primitif terdiri dari satu atau lebih simpul. OpenGL mendukung
primitif berikut:
6. Animation
6.1 Idle Function
Untuk melakukan animasi (mis., Memutar bentuk), Anda bisa mendaftarkan
idle()penelepon panggilan balik dengan GLUT, melalui glutIdleFuncperintah. Sistem
grafis akan memanggil kembali idle()fungsi ketika tidak ada acara lain untuk diproses.
membatalkan idle () {
glutPostRedisplay (); // Posting permintaan cat ulang untuk
mengaktifkan tampilan ()
}
// main
glutIdleFunc (tampilan);
6.2 Double Buffering
Double Buffering menggunakan dua penyangga tampilan untuk memperlancar
animasi. Layar selanjutnya disiapkan di buffer belakang , sedangkan layar saat ini disimpan
di buffer depan . Setelah persiapan selesai, Anda dapat
menggunakan glutSwapBufferperintah untuk menukar buffer depan dan belakang.
Untuk menggunakan buffering ganda, Anda perlu membuat dua perubahan:
1. Dalam main(), sertakan baris ini sebelum membuat jendela:
Program berikut memutar semua bentuk yang dibuat dalam contoh sebelumnya
menggunakan fungsi idle dengan buffering ganda.
1/ *
2 * GL05IdleFunc.cpp: Terjemahan dan Rotasi
3 * Mengubah primitif dari ruang model mereka ke ruang dunia (Model Transform).
4 * /
5#sertakan <windows.h> // untuk MS Windows
6#include <GL / glut.h> // GLUT, sertakan glu.h dan gl.h
7
8// Variabel global,
9Angle GLfloat = 0.0f; // Sudut rotasi saat ini dari bentuk
10
11 / * Inisialisasi OpenGL Graphics * /
12void initGL () { // Atur "kliring" atau warna latar belakang
13 glClearColor (0.0f, 0.0f, 0.0f, 1.0f); // Hitam dan buram
14} / * Dipanggil kembali ketika tidak ada acara lain yang harus ditangani * /
15void idle () {
16 glutPostRedisplay ();
17
18
19// Posting permintaan cat ulang untuk mengaktifkan tampilan ()
20}
21
22/ * Handler untuk acara pengecatan ulang jendela. Menelepon kembali ketika jendela pertama k
23 setiap kali jendela perlu dicat ulang. * /
24batal tampilan () {
25 glClear (GL_COLOR_BUFFER_BIT); // Bersihkan buffer warna
26 glMatrixMode (GL_MODELVIEW); // Untuk beroperasi pada Model-View matrix
27 glLoadIdentity (); // Atur ulang model-view matrix
28
29 glPushMatrix (); // Simpan pengaturan model-view
30 glTranslatef (-0.5f, 0.4f, 0.0f); // Terjemahkan
31 glRotatef (angle, 0.0f, 0.0f, 1.0f); // putar dengan sudut dalam derajat
32 glBegin (GL_QUADS); // Setiap set 4 simpul membentuk
33 quad
34 glColor3f (1.0f, 0.0f, 0.0f); // Red
35 glVertex2f (-0.3f, -0.3f);
36 glVertex2f (0.3f, -0.3f);
37 glVertex2f (0.3f, 0.3f);
38 glVertex2f (-0.3f, 0.3f);
39 glEnd (); glPopMatrix (); // Kembalikan matriks model-view
40 glPushMatrix (); // Simpan pengaturan model-view matrix
41 glTranslatef (-0.4f, -0.3f, 0.0f); // Terjemahkan
42 glRotatef (angle, 0.0f, 0.0f, 1.0f); // putar dengan sudut dalam derajat
43 glBegin (GL_QUADS);
44 glColor3f (0,0f, 1.0f, 0.0f); // Hijau
45 glVertex2f (-0.3f, -0.3f);
46
47
48 glVertex2f (0.3f, -0.3f);
49 glVertex2f (0.3f, 0.3f);
50 glVertex2f (-0.3f, 0.3f);
51 glEnd (); glPopMatrix (); // Kembalikan matriks model-view
52 glPushMatrix (); // Simpan pengaturan model-view matrix
53 glTranslatef (-0.7f, -0.5f, 0.0f); // Terjemahkan
54 glRotatef (angle, 0.0f, 0.0f, 1.0f); // putar dengan sudut dalam derajat
55 glBegin (GL_QUADS);
56 glColor3f (0.2f, 0.2f, 0.2f); // Dark Grey
57 glVertex2f (-0.2f, -0.2f);
58 glColor3f (1.0f, 1.0f, 1.0f); // White
59 glVertex2f (0.2f, -0.2f);
60 glColor3f (0.2f, 0.2f, 0.2f);
61
62 // Dark Grey
63 glVertex2f (0.2f, 0.2f);
64 glColor3f (1.0f, 1.0f, 1.0f); // White
65 glVertex2f (-0.2f, 0.2f);
66 glEnd (); glPopMatrix (); // Kembalikan matriks model-view
67 glPushMatrix (); // Simpan pengaturan matriks model-view
68 glTranslatef (0.4f, -0.3f, 0.0f); // Terjemahkan
69 glRotatef (angle, 0.0f, 0.0f, 1.0f); // putar dengan sudut dalam derajat
70 glBegin (GL_TRIANGLES);
71 glColor3f (0.0f, 0.0f, 1.0f); // Blue
72 glVertex2f (-0.3f, -0.2f);
73 glVertex2f (0.3f, -0.2f);
74 glVertex2f (0.0f, 0.3f);
75 glEnd ();
76
77
78 glPopMatrix (); // Kembalikan matriks model-view
79
80 glPushMatrix (); // Simpan pengaturan matriks tampilan model
81 glTranslatef (0.6f, -0.6f, 0.0f); // Terjemahkan
82 glRotatef (180.0f + sudut, 0.0f, 0.0f, 1.0f); // Putar 180 + derajat sudut
83 glBegin (GL_TRIANGLES);
84 glColor3f (1.0f, 0.0f, 0.0f); // Red
85 glVertex2f (-0.3f, -0.2f);
86 glColor3f (0,0f, 1.0f, 0.0f); // Hijau
87 glVertex2f (0.3f, -0.2f);
88 glColor3f (0.0f, 0.0f, 1.0f); // Blue
89 glVertex2f (0.0f, 0.3f);
90 glEnd (); glPopMatrix ();
91 // Kembalikan matriks model-view
92
93 glPushMatrix (); // Simpan pengaturan model-view
94 glTranslatef (0.5f, 0.4f, 0.0f); // Terjemahkan
95 glRotatef (angle, 0.0f, 0.0f, 1.0f); // putar dengan sudut dalam derajat
96 glBegin (GL_POLYGON);
97 glColor3f (1.0f, 1.0f, 0.0f); // Kuning
98 glVertex2f (-0.1f, -0.2f);
99 glVertex2f (0.1f, -0.2f);
100 glVertex2f (0.2f, 0.0f);
101 glVertex2f (0.1f, 0.2f);
102 glVertex2f (-0.1f, 0.2f);
103 glVertex2f (-0.2f, 0.0f);
104 glEnd (); glPopMatrix (); // Kembalikan matriks model-view
105 glutSwapBuffers ();
106
107 // Double buffered - menukar buffer depan dan belakang
108
109 // Ubah sudut rotasi setelah setiap tampilan ()
110 sudut + = 0,2f;
111} / * Handler untuk event ukuran ulang window. Dipanggil kembali ketika
112 jendela pertama kali muncul dan
113 setiap kali jendela diukur ulang dengan lebar dan tinggi baru * /
114membatalkan pembentukan kembali (lebar GLsizei, tinggi GLsizei) { //
115 GLsizei untuk bilangan bulat non-negatif // Hitung rasio aspek jendela baru
116 if (height == 0) height = 1; // Untuk mencegah pembagian
117 dengan 0
118 aspek GLfloat = lebar (GLfloat) / tinggi (GLfloat); // Tetapkan viewport
119untuk menutup jendela
120 glViewport baru (0, 0, lebar, tinggi);
121
122
123
124
125
126
127 // Tetapkan rasio aspek area kliping agar sesuai dengan viewport
128 glMatrixMode (GL_PROJECTION); // Untuk beroperasi pada matriks Proyeksi
129 glLoadIdentity ();
130 if (width> = height) { // aspect> = 1, atur tinggi dari -1 ke 1,
131 dengan lebar
132 gluOrtho2D yang lebih besar (aspek -1.0 *, aspek 1.0 *, -1.0, 1.0);
133 } else { // aspek <1, atur lebar ke -1 ke 1, dengan tinggi
134 gluOrtho2D yang lebih besar (-1.0, 1.0, -1.0 / aspek, 1.0 / aspek);
135 }
136} / * Fungsi utama: GLUT berjalan sebagai aplikasi konsol mulai dari main () * /
137int main (int argc, char ** argv) {
138 glutInit (& argc, argv); // Inisialisasi GLUT glutInitDisplayMode (GLUT_DOUBLE);
139
140
141
142
143 // Aktifkan mode buffered ganda
144 glutInitWindowSize (640, 480); // Tetapkan lebar & tinggi awal jendela
145- non-square
146 glutInitWindowPosition (50, 50); // Posisikan awal sudut kiri atas
147 glutCreateWindow ("Animasi melalui Fungsi Diam"); // Buat jendela dengan
judul yang diberikan
glutDisplayFunc (tampilan); // Daftarkan callback handler untuk
melukis ulang acara
glutReshapeFunc (membentuk kembali) jendela ; // Daftarkan callback
handler untuk acara kembali ukuran jendela
glutIdleFunc (idle);
initGL (); // Inisialisasi OpenGL kami sendiri
glutMainLoop (); // Masukkan
kembali loop pemrosesan-peristiwa tak terhingga 0;
}