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.