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.