Grafik Sederhana OPERASI STRING

376 Direktorat Pembinaan SMK | 2008 glColor3f 0.0f , 0.0f , 0.0f ; glVertex2f ‐ 0.5f , 0.0f ; glEnd ; SwapBuffers hDC; Setelah dieksekusi potongan program diatas maka akan menampilan hasil grafik seperti gambar dibawah ini: Gambar 11.3. Garis Fungsi utama sehingga dapat menghasilkan grafik seperti gambar di atas adalah: glColor3f 0.0f, 0.0f, 0.0f; glVertex2f 0.0f, 0.5f; glColor3f 0.0f, 0.0f, 0.0f; glVertex2f 0.0f, ‐0.5f; bisa dipahami bahwa glColor3f0.0f, 0.0f, 0.0f merupakan perintah untuk member warna titik-titik dari pixel yang dihasilkan oleh glVertex2f0.0f, 0.5f. Sebenarnya masingmasing baris pada potongan program di atas merupakan dua perintah bukan satu perintah. Namun karena keduanya saling terkait satu sama lain maka dijadikan satu baris, walaupun jika hendak ditulis pada baris yang berbeda juga tidak mengapa. Penjelasan lebih lanjut, format glColor3f adalah : glColor3fred, 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 indah dan sangat menarik. Perlu diketahui pula bahwa grafik yang terjadi merupakan grafik Cartesian yaitu grafik yang titik nolnya di tengah, oleh karena itu untuk membuat garis tegak dibutuhkan dua glVertex2f yang masing-masing argumen diisi dengan 0.0, 0.5 dan 0.0, -0.5. Begitu juga dengan garis mendatar dibutuhkan dua glVertex2f, tentu saja dengan argumen yang berbeda dalam hal ini -0.5, 0.0 dan 0.5, 0.0. Dengan memodifikasi program tersebut bisa didapatkan tampilan grafik yang menarik. Selanjutnya harus ada glBegin dan glEnd, karena perintah itu 2008 | Direktorat Pembinaan SMK 377 merupakan awal dan akhir program grafik yang dijalankan. Pada glBegin ada argumen GL_LINES, ini dimaksudkan untuk membuat garis. Sedangkan apabila hendak membuat bentuk yang lain maka perlu disesuaikan, contoh ada GL_TRIANGLES untuk segitiga, GL_QUADS untuk segi empat, atau GL_POLYGON untuk segi banyak. Perintah glClearColor untuk mengatur warna latar belakang window, dengan format sebagai berikut : glClearColorred, green, blue, alpha; seperti perintah sebelumnya argumen yang ada bisa diisi dengan angka pecahan dan dapat dikombinasikan sehingga mendapatkan warna yang menarik. Pada contoh program ini sengaja dibuat putih dengan mengkombinasikan red, green, blue semuanya diisi 1 1.0. Untuk menciptakan atau mendapatkan perubahan argumen jika diubah diperlukan perintah: glClearGL_COLOR_BUFFER_BIT; yang berarti perubahan warna pada perintah sebelumnya disimpan di buffer yang nanti pada saat eksekusi akan ditampilkan. Program selengkapnya dapat dilihat di bawah ini: Program 11.2. include windows.h include glgl.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; 378 Direktorat Pembinaan SMK | 2008 HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = 0.0f ; register window class wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc; wc.cbClsExtra = ; wc.cbWndExtra = ; 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, , , 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, , , PM_REMOVE { handle or dispatch messages if msg.message == WM_QUIT { bQuit = TRUE; } else { TranslateMessage msg; DispatchMessage msg; 2008 | Direktorat Pembinaan SMK 379 } } 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 ; case WM_CLOSE: PostQuitMessage ; 380 Direktorat Pembinaan SMK | 2008 return ; case WM_DESTROY: return ; case WM_KEYDOWN: switch wParam { case VK_ESCAPE: PostQuitMessage ; return ; } return ; 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 381 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 panjang, tetapi itulah yang terjadi apabila memprogram menggunakan library yang tersedia. Namun jika harus membuat sendiri dari awal maka pemrograman kita akan lebih lama. Dengan memanfaatkan library yang ada maka proses pemrograman akan menjadi lebih cepat efektif. Seperti telah diuraikan sebelumnya pemrogram tinggal mencari dimana yang harus dimodifikasi sesuai kebutuhan. Contoh untuk mengubah ukuran window tinggal mengubah argumen di dalam create main window, disana defaultnya adalah 0, 0, 256, 256, angka ini dapat diubah untuk mendapatkan window yang diinginkan. Begitu pula untuk header window dapat disesuaikan. Lebih lanjut mengenai grafik untuk membuat segitiga misalnya diperlukan tiga buah vertex, sehingga perintah-perintah yang dibutuhkan segabai berikut: 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 ; 382 Direktorat Pembinaan SMK | 2008 Jangan lupa mengubah GL_LINES pada glBegin menjadi GL_TRIANGLES, kalau tidak diubah maka yang muncul akan satu garis saja. Begitu juga untuk membuat segi empat kotak, segi lima, segi enam, dan sebagainya. Makin banyak segi dibutuhkan makin banyak vertex.

11.4. Animasi Grafik

Pembuatan animasi bentuk- bentuk dasar dalam OpenGL telah disediakan. Untuk dapat memanfaatkannya kita harus memahami perintah-perintah itu beserta arti argumen-argumen yang dipakainya. Sebagai contoh akan dibuat sebuah program yang menganimasi kotak. Cermati program berikut: Program 11.4 include windows.h include glgl.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 2008 | Direktorat Pembinaan SMK 383 wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc; wc.cbClsExtra = ; wc.cbWndExtra = ; 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, , , 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, , , PM_REMOVE { handle or dispatch messages if msg.message == WM_QUIT { bQuit = TRUE; } else { TranslateMessage msg; DispatchMessage msg; } } else { OpenGL animation code goes here