Grafik Library
11.2. Grafik Library
Pada pemrograman C++ dipelajari. Untuk lebih jelasnya ikuti mempunyai library yang disebut langkah-langkah program berikut: OpenGL. Library ini memanfaatkan
Pada saat membuat proyek baru Windows API dalam proses
harus kita arahkan ke library pembentukan grafik. Dengan
OpenGL
menggunakan OpenGL pembuatan Setelah proyek diciptakan maka grafik jadi sangat mudah. Namun
kita langsung mempunyai main() demikian perlu diketahui bahwa
program yang apabila dijalankan pemrograman menggunakan library
(run) langsung ada hasilnya harus mengikuti prosedur yang telah
Selanjutnya tugas pemrogram ditetapkan oleh pembuatnya.
tinggal memodifikasi bagian- Pada prinsipnya kita tinggal
bagian tertentu disesuaikan memodifikasi program yang telah
dengan rancangan program yang ada, pada bagian mana yang
telah ditetapkan
dimodifikasi agar sesuai dengan Gambaran pembuatan proyek baru keperluannya itulah yang harus seperti berikut:
Gambar 11.1. pembuatan proyek
Pada saat anda sudah memilih siap dan di dalamnya sudah ada membuat proyek baru maka pilihlan main() program yang siap OpenGL sebagai basis proyek ini, ditampilkan; program inilah yang siap seperti terlihat dalam gambar di atas.
dimodifikasi. Perhaikan gambar di Setelah OK maka proyek langsung bawah:
Direktorat Pembinaan SMK | 2008
Grafik Bahasa Pemrorgraman
Gambar 11.2. proyek OpenGL
Terlihat pada gambar bahwa sudah
11.3. Grafik Sederhana
ada main() program dan yang penting Pengenalan grafik biasanya dalam editor terlihat library yang dimulai dengan membuat garis. Garis hendak dipakai untuk membuat grafik
di dalam grafik merupakan kumpulan ini. Lihat cara penulisan dibawah ini:
titik-titik yang berupa pixel, resolusi pixel akan mempengaruhi hasil
#include <windows> tampilan; makin rapat pixel grafik #include <gl/gl.h>
yang dihasilkan makin halus sehingga kadang kelihatan jadi lebih
Dua buah header tersebut yang indah dan menarik. Perintah dalam dibutuhkan untuk menghubungi OpenGL untuk membuat garis: library pada saat dibutuhkan oleh program dalam membentuk grafik.
Program 11.1
glClearColor ( 1.0f , 1.0f , 1.0f , 0.0f );
glClear (GL_COLOR_BUFFER_BIT);
glBegin (GL_LINES);
glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.0f , 0.5f );
glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.0f , ‐ 0.5f );
glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.5f , 0.0f );
2008 | Direktorat Pembinaan SMK
Bahasa Pemrograman Grafik
glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f (‐ 0.5f , 0.0f );
glEnd ();
SwapBuffers (hDC);
Setelah dieksekusi potongan merupakan dua perintah bukan satu program diatas maka akan perintah. Namun karena keduanya menampilan hasil grafik seperti saling terkait satu sama lain maka gambar dibawah ini:
dijadikan satu baris, walaupun jika hendak ditulis pada baris yang berbeda juga tidak mengapa. Penjelasan lebih lanjut, format glColor3f adalah :
glColor3f(red, green, blue);
Argumen red, green, blue untuk mengaktifkan masing-masing diisi bilangan pecahan 1 (1.0), untuk mematikan diisi bilangan pecahan 0 (0.0). Dapat dilihat contoh di atas semuanya dimatikan berarti titik-titik pixel akan berwarna hitam (seperti dilihat di gambar hasil eksekusi). Kombinasi dari ketiga argument ini akan menghasilkan warna yang
Gambar 11.3. Garis indah dan sangat menarik. Perlu diketahui pula bahwa grafik yang
Fungsi utama sehingga dapat terjadi merupakan grafik Cartesian menghasilkan grafik seperti gambar yaitu grafik yang titik nolnya di di atas adalah:
tengah, oleh karena itu untuk membuat garis tegak dibutuhkan dua
glColor3f (0.0f, 0.0f, 0.0f); glVertex2f glVertex2f yang masing-masing (0.0f, 0.5f);
argumen diisi dengan( 0.0, 0.5) dan glColor3f (0.0f, 0.0f, 0.0f); glVertex2f
(0.0, -0.5). Begitu juga dengan garis (0.0f, ‐0.5f);
mendatar dibutuhkan dua glVertex2f, tentu saja dengan argumen yang
bisa dipahami bahwa glColor3f(0.0f, berbeda dalam hal ini (-0.5, 0.0) dan 0.0f, 0.0f) merupakan perintah untuk
(0.5, 0.0). Dengan memodifikasi member warna titik-titik dari pixel program tersebut bisa didapatkan
yang dihasilkan oleh glVertex2f(0.0f, tampilan grafik yang menarik. 0.5f). Sebenarnya masingmasing
Selanjutnya harus ada glBegin() baris pada potongan program di atas
dan glEnd(), karena perintah itu 376
Direktorat Pembinaan SMK | 2008
Grafik Bahasa Pemrorgraman
merupakan awal dan akhir program angka pecahan dan dapat grafik yang dijalankan. Pada glBegin
dikombinasikan sehingga ada argumen GL_LINES, ini mendapatkan warna yang menarik. dimaksudkan untuk membuat garis. Pada contoh program ini sengaja Sedangkan apabila hendak membuat
dibuat putih dengan bentuk yang lain maka perlu mengkombinasikan red, green, blue disesuaikan, contoh ada semuanya diisi 1 (1.0). Untuk GL_TRIANGLES untuk segitiga, menciptakan atau mendapatkan GL_QUADS untuk segi empat, atau perubahan argumen (jika diubah) GL_POLYGON untuk segi banyak.
diperlukan perintah:
Perintah glClearColor untuk mengatur warna latar belakang glClear(GL_COLOR_BUFFER_BIT); window, dengan format sebagai berikut :
yang berarti perubahan warna pada perintah sebelumnya disimpan di
glClearColor(red, green, blue, alpha); buffer yang nanti pada saat eksekusi akan ditampilkan.
seperti perintah sebelumnya Program selengkapnya dapat argumen yang ada bisa diisi dengan
dilihat di bawah ini:
Program 11.2. #include <windows.h> #include <gl/gl.h>
/************************** * Function Declarations **************************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC); void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);
/************************** * WinMain **************************/ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { WNDCLASS wc; HWND hWnd; HDC hDC;
2008 | Direktorat Pembinaan SMK
Bahasa Pemrograman Grafik
HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = 0.0f ;
/* register window class */ wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0 ; wc.cbWndExtra = 0 ; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "GLSample" ; RegisterClass (&wc);
/* create main window */ hWnd = CreateWindow ( "GLSample" , "OpenGL Sample" , WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
0 , 0 , 256 , 256 , NULL, NULL, hInstance, NULL);
/* enable OpenGL for the window */ EnableOpenGL (hWnd, &hDC, &hRC);
/* program main loop */ while (!bQuit) {
/* check for messages */
if (PeekMessage (&msg, NULL, 0 , 0 , PM_REMOVE))
{ /* handle or dispatch messages */ if (msg.message == WM_QUIT) { bQuit = TRUE; }
else
{ TranslateMessage (&msg); DispatchMessage (&msg);
Direktorat Pembinaan SMK | 2008
Grafik Bahasa Pemrorgraman
else
{ /* OpenGL animation code goes here */
glClearColor ( 1.0f , 1.0f , 1.0f , 0.0f );
glClear (GL_COLOR_BUFFER_BIT);
glBegin (GL_LINES);
glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.0f , 0.5f ); glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.0f , ‐ 0.5f );
glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.5f , 0.0f ); glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f (‐ 0.5f , 0.0f );
glEnd ();
SwapBuffers (hDC); } }
/* shutdown OpenGL */ DisableOpenGL (hWnd, hDC, hRC);
/* destroy the window explicitly */ DestroyWindow (hWnd);
return msg.wParam; }
/******************** * Window Procedure ********************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) { case WM_CREATE:
return 0 ; case WM_CLOSE:
PostQuitMessage ( 0 );
2008 | Direktorat Pembinaan SMK
Bahasa Pemrograman Grafik
return 0 ;
case WM_DESTROY: return 0 ;
case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE:
PostQuitMessage( 0 );
return 0 ; } return 0 ;
default: return DefWindowProc (hWnd, message, wParam, lParam); } }
/******************* * Enable OpenGL *******************/ void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC) { PIXELFORMATDESCRIPTOR pfd; int iFormat;
/* get the device context (DC) */ *hDC = GetDC (hWnd);
/* set the pixel format for the DC */ ZeroMemory (&pfd, sizeof (pfd)); pfd.nSize = sizeof (pfd);
pfd.nVersion = 1 ; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24 ; pfd.cDepthBits = 16 ; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat (*hDC, &pfd); SetPixelFormat (*hDC, iFormat, &pfd);
Direktorat Pembinaan SMK | 2008
Grafik Bahasa Pemrorgraman
/* create and enable the render context (RC) */ *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC ); }
/****************** * Disable OpenGL ******************/ void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); }
Dalam program ini terlihat sangat ukuran window tinggal mengubah panjang, tetapi itulah yang terjadi argumen di dalam create main apabila memprogram menggunakan window, disana defaultnya adalah 0, library yang tersedia. Namun jika
0, 256, 256, angka ini dapat diubah harus membuat sendiri dari awal untuk mendapatkan window yang maka pemrograman kita akan lebih diinginkan. Begitu pula untuk header lama. Dengan memanfaatkan library window dapat disesuaikan. yang ada maka proses pemrograman
Lebih lanjut mengenai grafik akan menjadi lebih cepat efektif. untuk membuat segitiga misalnya Seperti telah diuraikan sebelumnya diperlukan tiga buah vertex, sehingga pemrogram tinggal mencari dimana perintah-perintah yang dibutuhkan yang harus dimodifikasi sesuai segabai berikut: kebutuhan. Contoh untuk mengubah
Program 11.3 glClear (GL_COLOR_BUFFER_BIT);
glBegin (GL_TRIAGLES);
glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.0f , 0.5f );
glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.5f , ‐ 0.5f ); glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f (‐ 0.5f , ‐ 0.5f );
glEnd ();
2008 | Direktorat Pembinaan SMK
Bahasa Pemrograman Grafik
Jangan lupa mengubah
11.4. Animasi Grafik
GL_LINES pada glBegin menjadi Pembuatan animasi bentuk- GL_TRIANGLES, kalau tidak diubah
bentuk dasar dalam OpenGL telah maka yang muncul akan satu garis disediakan. Untuk dapat
saja. memanfaatkannya kita harus Begitu juga untuk membuat segi
memahami perintah-perintah itu empat (kotak), segi lima, segi enam,
beserta arti argumen-argumen yang dan sebagainya. Makin banyak segi dipakainya. Sebagai contoh akan
dibutuhkan makin banyak vertex. dibuat sebuah program yang menganimasi kotak. Cermati program
berikut:
Program 11.4 #include <windows.h> #include <gl/gl.h>
/************************** * Function Declarations **************************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC); void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);
/************************** * WinMain **************************/ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { WNDCLASS wc; HWND hWnd; HDC hDC; HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = 0.0f ;
/* register window class */ 382
Direktorat Pembinaan SMK | 2008
Grafik Bahasa Pemrorgraman
wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0 ; wc.cbWndExtra = 0 ; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "GLSample" ; RegisterClass (&wc);
/* create main window */ hWnd = CreateWindow ( "GLSample" , "OpenGL Sample" , WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
0 , 0 , 256 , 256 , NULL, NULL, hInstance, NULL);
/* enable OpenGL for the window */ EnableOpenGL (hWnd, &hDC, &hRC);
/* program main loop */ while (!bQuit) {
/* check for messages */
if (PeekMessage (&msg, NULL, 0 , 0 , PM_REMOVE))
{ /* handle or dispatch messages */ if (msg.message == WM_QUIT) { bQuit = TRUE; }
else
{ TranslateMessage (&msg); DispatchMessage (&msg); } }
else
{ /* OpenGL animation code goes here */
2008 | Direktorat Pembinaan SMK
Bahasa Pemrograman Grafik
glClearColor ( 1.0f , 1.0f , 1.0f , 0.0f );
glClear (GL_COLOR_BUFFER_BIT);
glPushMatrix ();
glRotatef (theta, 0.0f , 0.0f , 1.0f );
glBegin (GL_QUADS);
glColor3f ( 1.0f , 0.0f , 0.0f ); glVertex2f (‐ 0.5f , 0.5f ); glColor3f ( 0.0f , 1.0f , 0.0f ); glVertex2f ( 0.5f , 0.5f ); glColor3f ( 0.0f , 0.0f , 1.0f ); glVertex2f ( 0.5f , ‐ 0.5f ); glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f (‐ 0.5f , ‐ 0.5f );
glEnd (); glPopMatrix ();
SwapBuffers (hDC);
theta += 1.0f ; Sleep ( 1 ); } }
/* shutdown OpenGL */ DisableOpenGL (hWnd, hDC, hRC);
/* destroy the window explicitly */ DestroyWindow (hWnd);
return msg.wParam; }
/******************** * Window Procedure ********************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) { case WM_CREATE:
return 0 ; case WM_CLOSE:
PostQuitMessage ( 0 );
Direktorat Pembinaan SMK | 2008
Grafik Bahasa Pemrorgraman
return 0 ;
case WM_DESTROY: return 0 ;
case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE:
PostQuitMessage( 0 );
return 0 ; } return 0 ;
default: return DefWindowProc (hWnd, message, wParam, lParam); } }
/******************* * Enable OpenGL *******************/ void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC) { PIXELFORMATDESCRIPTOR pfd; int iFormat;
/* get the device context (DC) */ *hDC = GetDC (hWnd);
/* set the pixel format for the DC */ ZeroMemory (&pfd, sizeof (pfd)); pfd.nSize = sizeof (pfd);
pfd.nVersion = 1 ; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24 ; pfd.cDepthBits = 16 ; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat (*hDC, &pfd); SetPixelFormat (*hDC, iFormat, &pfd);
2008 | Direktorat Pembinaan SMK
Bahasa Pemrograman Grafik
/* create and enable the render context (RC) */ *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC );
/****************** * Disable OpenGL ******************/ void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); }
Keluaran program di atas akan warna tersebut dimunculkan dengan menganimasikan kotak dengan mengkombinasikan argumen- warna-warni yang menarik dan argumen pada perintah glColor3f, berputar berlawanan arah jarum jam.
cermati dalam listing program. Dalam Gambar kotak yang terjadi seperti program yang sesungguhnya kotak berikut:
tersebut selain berwarna-warni juga berputar berlawanan arah putaran jarum jam (counter clockwise). Perintah apa yang membuat kotak ini berputar ? Kita lihat program di atas:
glRotatef (theta, 0.0f, 0.0f, 1.0f);
sesuai namanya perintah di ataslah yang menyebabkan kotak ini berputar. Format perintah ini secara lengkapnya sebagai berikut : Argumen pertama theta untuk
mengatur kecepatan putar makin besar angkanya makin cepat putaran yang terjadi
Argumen kedua jika diisi 1 (1.0) Gambar 11.4. Grafik berwarna warni
maka kotak akan berputar dengan sumbu garis horizontal (mendatar)
Jika diperhatikan atau dipelajari ke arah tertentu. Untuk memutar pasti akan Menarik bukan? Warna-
ke arah yang berlawanan dari 386
Direktorat Pembinaan SMK | 2008
Grafik Bahasa Pemrorgraman
contoh, argumen diisi angka -1 (- akan zoom in dan zoom out 1.0)
bergantian.
Argumen ketiga juga mirip dengan Kombinasi dari argumen-argumen
argumen kedua namun yang ada akan membuat variasi berputarnya terhadap sumbu
pergerakan yang sangat menarik vertical (tegak lurus)
Untuk mengatur laju perputaran Argumen keempat untuk memutar
animasi yang terjadi bisa dengan
kotak flat dengan sumbu titik nol memodifikasi theta, atau dengan diagram cartesius. Jika diisi angka
perintah sleep(argumen). Laju
1 (1.0) maka akan berputar kecepatan putar tergantung pada berlawanan arah putaran jarum nilai argumen pada sleep, makin jam (counter clockwise),
besar angkanya makin lambat bukan sedangkan untuk berputar searah
makin cepat. Lebih lanjut dengan
dengan arah putaran jarum jam grafik, jika akan membuat segi enam (clockwise) diisi angka -1 (-1.0). maka perubahan yang terjadi seperti Hal yang menarik jika argumen ini
berikut:
diisi angka 0 (0.0) maka kotak
Program 11.5 /* OpenGL animation code goes here */
glClearColor ( 0.0f , 0.0f , 0.0f , 1.0f );
glClear (GL_COLOR_BUFFER_BIT);
glPushMatrix (); glRotatef (theta, 0.0f , 0.0f , ‐ 1.0f ); glBegin (GL_POLYGON);
glColor3f ( 1.0f , 0.0f , 0.0f ); glVertex2f (‐ 0.3f , 0.54f ); glColor3f ( 0.0f , 1.0f , 0.0f ); glVertex2f ( 0.3f , 0.54f ); glColor3f ( 0.0f , 0.0f , 1.0f ); glVertex2f ( 0.61f , 0.0f );
glColor3f ( 0.0f , 1.0f , 1.0f ); glVertex2f ( 0.3f , ‐ 0.54f ); glColor3f ( 1.0f , 1.0f , 0.0f ); glVertex2f (‐ 0.3f , ‐ 0.54f );
glColor3f ( 1.0f , 1.0f , 1.0f ); glVertex2f (‐ 0.61f , 0.0f );
glEnd (); glPopMatrix ();
SwapBuffers (hDC);
theta += 2.0f ; Sleep ( 1 );
2008 | Direktorat Pembinaan SMK
Bahasa Pemrograman Grafik
Tentu saja vertex berubah Selain glRotatef() pengaturan bertambah banyak, banyaknya vertex
animasi dapat juga dengan sesuai dengan jumlah sudut yang glTranslatef(). Dengan perintah ini dibentuk. Jangan lupa argumen pada
kita dapat menggerakkan obyek glBegin diisi dengan GL_POLYGON kekiri, kekanan, ke atas, maupun ke sehingga bisa menciptakan segi bawah. Contoh program sebagai banyak seperti yang dikehendaki. berikut:
Program 11.6 #include <windows.h> #include <gl/gl.h>
/************************** * Function Declarations **************************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC); void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);
/************************** * WinMain **************************/ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { WNDCLASS wc; HWND hWnd; HDC hDC; HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = ‐ 1.0f ; float alpha = ‐ 1.0f ;
/* register window class */ wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0 ; 388
Direktorat Pembinaan SMK | 2008
Grafik Bahasa Pemrorgraman
wc.cbWndExtra = 0 ; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "GraphGL" ; RegisterClass (&wc);
/* create main window */ hWnd = CreateWindow ( "GraphGL" , "OpenGL Graphics Animation" , WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
0 , 0 , 512 , 512 , NULL, NULL, hInstance, NULL);
/* enable OpenGL for the window */ EnableOpenGL (hWnd, &hDC, &hRC);
/* program main loop */ while (!bQuit) {
/* check for messages */
if (PeekMessage (&msg, NULL, 0 , 0 , PM_REMOVE))
{ /* handle or dispatch messages */ if (msg.message == WM_QUIT) { bQuit = TRUE; }
else
{ TranslateMessage (&msg); DispatchMessage (&msg); } }
else
{ /* OpenGL animation code goes here */
glClearColor ( 1.0f , 1.0f , 1.0f , 1.0f );
glClear (GL_COLOR_BUFFER_BIT);
2008 | Direktorat Pembinaan SMK
Bahasa Pemrograman Grafik
glPushMatrix ();
glTranslatef (theta, alpha, 0.0f );
glColor3f ( 1.0f , 0.0f , 1.0f ); glRectf(‐ 0.2 , 0.2 , 0.2 , ‐ 0.2 );
glPopMatrix ();
SwapBuffers (hDC);
if (theta >= 1.0 ) { theta = ‐ 1.0f ; alpha = ‐ 1.0f ; }
else if (theta <= 1.0 )
{ theta += 0.01f ; alpha += 0.01f ; }
Sleep ( 10 ); } }
/* shutdown OpenGL */ DisableOpenGL (hWnd, hDC, hRC);
/* destroy the window explicitly */ DestroyWindow (hWnd);
return msg.wParam; }
/******************** * Window Procedure ********************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
Direktorat Pembinaan SMK | 2008
Grafik Bahasa Pemrorgraman
case WM_CREATE: return 0 ; case WM_CLOSE:
PostQuitMessage ( 0 );
return 0 ;
case WM_DESTROY: return 0 ;
case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE:
PostQuitMessage( 0 );
return 0 ; } return 0 ;
default: return DefWindowProc (hWnd, message, wParam, lParam); } }
/******************* * Enable OpenGL *******************/ void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC) { PIXELFORMATDESCRIPTOR pfd; int iFormat;
/* get the device context (DC) */ *hDC = GetDC (hWnd);
/* set the pixel format for the DC */ ZeroMemory (&pfd, sizeof (pfd)); pfd.nSize = sizeof (pfd);
pfd.nVersion = 1 ; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24 ; pfd.cDepthBits = 16 ;
2008 | Direktorat Pembinaan SMK
Bahasa Pemrograman Grafik
pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat (*hDC, &pfd); SetPixelFormat (*hDC, iFormat, &pfd);
/* create and enable the render context (RC) */ *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC );
/****************** * Disable OpenGL ******************/ void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); }
Hasil eksekusi program di atas Argumen dalam glTranslatef () dibuat akan menggerakkan sebuah kotak variabel theta untuk argumen berjalan secara diagonal dari pojok pertama, alpha untuk argumen kiri bawah ke kanan atas secara kedua. Theta untuk mengatur gerak terus menerus. Akan tetapi jika ada horisontal dan alpha untuk mengatur penekanan mouse di taskbar maka gerak vertikal. Dengan mengubah- kotak berhenti, jika penekanan ubah nilai variabel tersebut kita bisa dilepas kotak jalan lagi. Untuk selesai
menggerakkan obyek tersebut secara bisa menggunakan tombol ESCape.
bebas sesuai dengan kehendak. Pada saat obyek bergerak bisa juga
11.5. Dasar-dasar Game
diatur perubahan warna atau
Untuk memahami pembuatan dikombinasi sehingga menjadi warna- game contoh program di atas bisa warni. Untuk lebih jelasnya ikuti dimodifikasi bagian glTranslatef(). program berikut:
Program 11.7 #include <windows.h> #include <gl/gl.h>
/************************** * Function Declarations **************************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
Direktorat Pembinaan SMK | 2008
Grafik Bahasa Pemrorgraman
WPARAM wParam, LPARAM lParam); void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC); void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);
/************************** * WinMain **************************/ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { WNDCLASS wc; HWND hWnd; HDC hDC; HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = ‐ 0.8f ; float alpha = ‐ 0.8f ;
int count = 0 ; float r, g, b;
/* register window class */ wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0 ; wc.cbWndExtra = 0 ; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "GraphGL" ; RegisterClass (&wc);
/* create main window */ hWnd = CreateWindow ( "GraphGL" , "OpenGL Graphics" , WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
0 , 0 , 512 , 512 , NULL, NULL, hInstance, NULL);
2008 | Direktorat Pembinaan SMK
Bahasa Pemrograman Grafik
/* enable OpenGL for the window */ EnableOpenGL (hWnd, &hDC, &hRC);
/* program main loop */ while (!bQuit) {
/* check for messages */
if (PeekMessage (&msg, NULL, 0 , 0 , PM_REMOVE))
{ /* handle or dispatch messages */ if (msg.message == WM_QUIT) { bQuit = TRUE; }
else
{ TranslateMessage (&msg); DispatchMessage (&msg); } }
else
{ /* OpenGL animation code goes here */
glClearColor ( 1.0f , 1.0f , 1.0f , 1.0f );
glClear (GL_COLOR_BUFFER_BIT);
glPushMatrix ();
glTranslatef (theta, alpha, 0.0f ); glColor3f (r, g, b);
glRectf(‐ 0.2 , 0.2 , 0.2 , ‐ 0.2 );
glPopMatrix ();
SwapBuffers (hDC);
if (count > 160 ) { theta ‐= 0.01f ; alpha ‐= 0.01f ; if (count == 320 ) {
Direktorat Pembinaan SMK | 2008
Grafik Bahasa Pemrorgraman
count = 0 ; theta = ‐ 0.8f ; alpha = ‐ 0.8f ; }
else
count += 1 ;
r= 0.0f ; g= 1.0f ; b= 0.0f ; } else if (count <= 160 ) { theta += 0.01f ; alpha += 0.01f ;
count += 1 ; r= 1.0f ; g= 0.0f ; b= 1.0f ; }
Sleep ( 10 ); } }
/* shutdown OpenGL */ DisableOpenGL (hWnd, hDC, hRC);
/* destroy the window explicitly */ DestroyWindow (hWnd);
return msg.wParam; }
/******************** * Window Procedure ********************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
2008 | Direktorat Pembinaan SMK
Bahasa Pemrograman Grafik
case WM_CREATE: return 0 ; case WM_CLOSE:
PostQuitMessage ( 0 );
return 0 ;
case WM_DESTROY: return 0 ;
case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE:
PostQuitMessage( 0 );
return 0 ; } return 0 ;
default: return DefWindowProc (hWnd, message, wParam, lParam); } }
/******************* * Enable OpenGL *******************/ void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC) { PIXELFORMATDESCRIPTOR pfd; int iFormat;
/* get the device context (DC) */ *hDC = GetDC (hWnd);
/* set the pixel format for the DC */ ZeroMemory (&pfd, sizeof (pfd)); pfd.nSize = sizeof (pfd);
pfd.nVersion = 1 ; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24 ; pfd.cDepthBits = 16 ;
Direktorat Pembinaan SMK | 2008
Grafik Bahasa Pemrorgraman
pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat (*hDC, &pfd); SetPixelFormat (*hDC, iFormat, &pfd);
/* create and enable the render context (RC) */ *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC );
/****************** * Disable OpenGL ******************/ void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); }
Jika program dijalankan maka monoton. Penambahan variabel pada kotak akan bergerak secara diagonal
perintah glColor3f() argumen pertama dari pojok kiri bawah ke arah pojok r, kedua g, ketiga b, sehingga kanan atas dengan warna ungu, formatnya menjadi glColor3f(r, g, b). setelah sampai di pojok kanan atas Modifikasi yang lain yaitu menambah maka akan berbalik arah menuju variabel count untuk menghitung pojok kiri bawah lagi dengan warna banyaknya gerak. Hal ini perlu hijau, begitu seterusnya bolak-balik. ditambahkan karena pengaturan Akan tetapi jika kursor menunjuk gerak melalui variabel count ini. taskbar dan tombol mouse ditekan Contoh ini merupakan dasar maka gerak obyek akan berhenti dan
pembuatan game yang harus jika tombol dilepas lagi maka obyek
dipelajari untuk bisa dikembangkan tersebut gergerak lagi.
dikemudian hari. Bagian yang penting Selain argumen-argumen dicermati adalah trik pengaturan glTranslatef() yang dimodifikasi, geraknya, bagian ini merupakan hal argumen glColor3f() juga dibuat tersulit karena harus menemukan variabel sehingga bisa dimainkan algoritma yang tepat dan efisien. warnanya menjadi dinamis tidak
2008 | Direktorat Pembinaan SMK
Bahasa Pemrograman Grafik