P. 1
Buku Grafika Diktat Kuliah

Buku Grafika Diktat Kuliah

|Views: 1,230|Likes:
Published by logality

More info:

Published by: logality on Feb 03, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

03/23/2013

pdf

text

original

DIKTAT KULIAH

GRAFI KA KOMPUTER
Oleh:
Rully Soelaiman
JURUSAN TEKNIK INFORMATIKA
FAKULTAS TEKNOLOGI INDUSTRI
INSTITUT TEKNOLOGI SEPULUH NOPEMBER
SURABAYA
KATA PENGANTAR
Grafika Komputer merupakan salah satu bidang ilmu komputer yang
menakjubkan, dan banyak digunakan untuk menyajikan secara visual berbagai
informasi dari berbagai disiplin ilmu yang lain. Penyajian informasi secara visual
menggunakan grafika komputer untuk tujuan pemodelan, analisis, dan sintesis
banyak dijumpai antara lain pada bidang kerekayasaan, arsitektur, kedokteran
dan yang berkaitan dengan entertainment.
Berbicara tentang grafika komputer tidak terlepas dari berbagai metode dan
algorithma yang diperlukan untuk membangkitkan gambar pada layar tampilan,
dan cara pemanipulasian gambar tersebut sesuai dengan kebutuhan pengguna.
Dengan selesainya buku ini, penulis ingin mengucapkan terima kasih kepada
semua pihak yang telah banyak membantu hingga terselesaikannya buku ini,
khususnya saudara Pramudyo Ananto yang dengan segenap perhatian dan
komitmennya telah menyunting dan memeriksa bab demi bab dari buku ini.
Sebagai akhir kata, penulis berharap agar buku ini dapat bermanfaat bagi para
pembaca sekalian. Tak lupa, segala kritik dan saran demi sempurnanya buku ini
sangat penulis harapkan.
Surabaya, Pebruari 1999
Penulis
DAFTAR ISI
Halaman Judul ………….………………………………………………………………..i
Kata Pengantar ……………………...……………………….………………………….ii
Daftar Isi ……...………………………………………………………………………….iii
Pendahuluan ………………………………………………………………………… …1
Bab 1 Metode Raster Scan ……………………………………………………………4
Bab 2 Transformasi Dua Dimensi Dan Metode Parametrik ………………………24
Bab 3 Kurva ……..……………………………………………………………………..42
Bab 4 Penggambaran Obyek Geometrik Dengan OpenGL ...……………………56
Bab 5 Teknik Viewing Pada OpenGL ……….…………………...…………………67
Bab 6 Pewarnaan Pada OpenGL …..…………………………….…………………84
Bab 7 Pencahayaan Pada OpenGL ………………………………..……………….92
Bab 8 Tekstur Mapping .…………………………………………………………….101
Bab 9 Pembentukan Kurva dan Permukaan dengan NURBS… ……………….110
Bab 10 Obyek Majemuk dan Operator Boolean…………………………………. 147
Daftar Pustaka
PENDAHULUAN
Sekilas tentang Java
Java merupakan bahasa pemrograman terbaru yang handal. Salah satu
kelebihannya yang nyata adalah run time library yang memberikan platform yang
berdiri sendiri: karena kita dapat menggunakan source code yang sama pada
Windows, Solaris, Unix, Macintosh maupun yang lain. Selain itu Java memiliki
syntax yang serupa dengan bahasa C++, sehingga bagi programmer-
programmer yang sudah menguasai C++ tidak mengalami banyak kesulitan
untuk menguasai Java. Java juga merupakan bahasa yang benar-benar
berorientasi obyek, bahkan melebihi C++. Segala sesuatu dalam Java, kecuali
beberapa tipe data dasar adalah merupakan obyek.
Tetapi itu saja belum cukup. Perancang Java berpikir keras untuk
mengetahui mengapa program C++ banyak menghasilkan kesalahan. Kemudian
mereka menambahkan feature-feature di Java untuk mengurangi kesalahan
tersebut. Selain itu mereka mengurangi penempatan dan pembebasan memori
secara manual. Jadi Java secara otomatis mengumpulkan sampah (garbage
collected) sehingga kita tidak perlu kuatir dengan masalah memori. Multiple
heritance juga dikurangi, dan digantikan dengan interface yang menyediakan
fasilitas yang kita inginkan dari multiple inheritance tanpa harus mengatur
hirarkinya.
Seperti yang telah diutarakan di atas, syntax pada Java mirip dengan
syntax pada C++. Tetapi syntax pada Java tidak memerlukan file header, struct,
operator overloading dan yang lannya. Jika kita memilki kebiasaan membuat
program dengan menggunakan Visual Basic, kita tidak pernah menggunakan
pointer, sehingga sering dikatakan Visual Basic kurang luwes karena tidak dapat
mengmplementasikan dengan mudah beberapa struktur data yang memerlukan
pointer. Sedangkan jika kita sering membuat program dengan C++, kita sering
menggunakan pointer untuk mengakses string, array, obyek dan file.
Java memberikan solusi yang terbaik. Kita tidak lagi memerlukan pointer
untuk mengakses string dan array. Tetapi jika diperlukan, kita memiliki pointer
yang handal, misalnya untuk linked list. Selain itu Java memberikan keamanan
yang benar-benar terjamin, karena kita tidak akan pernah dapat mengakses
pointer yang rusak atau membuat kesalahan pada alokasi memori.
Untuk lebih jelasnya, segala sesuatu tentang Java dapat ditemukan pada
http://www.java.sun.com.
Pengenalan OpenGL
OpenGL adalah suatu perangkat lunak interface untuk hardware grafik.
Interface ini terdiri dari 120 perintah yang digunakan untuk membentuk obyek
dan operasi yang diperlukan untuk menghasilkan aplikasi tiga dimensi yang
interaktif. OpenGL dirancang sebagai interface yang tidak bergantung kepada
hardware dan efisien untuk diimplementasikan pada berbagai macam platform
hardware.
Perintah OpenGL menggunakan awalan gl dan inisial huruf kapital untuk
tiap-tiap kata dari nama perintah (contohnya glColor()). Sedangkan konstantanya
dimulai dari GL_, seluruhnya menggunakan huruf kapital dan garis hubung
bawah (underscore) untuk menghubungkan tiap-tiap kata (seperti
GL_COLOR_BUFFER_BIT).
Ada juga beberapa huruf yang ditambahkan pada perintah-perintah (seperti 3f
pada glColor3f()). Hal itu disebabkan oleh karena kita dapat mendefinisikan lebih dari
satu perintah, tergantung dari argumen yang kita berikan. Akhiran 3 menunjukkan ada 3
argumen yang diberikan, versi lain dari perintah tersebut membutuhkan 4 argumen.
Akhiran f menunjukkan tipe data dari argumennya, yaitu floating-point. Perintah OpenGL
menerima sebanyak 8 tipe data yang berbeda untuk argumennya (untuk selengkapnya
lihat tabel).
Akhiran Tipe data Tipe data C Tipe data OpenGL
b 8-bit integer signed char GLbyte
s 16-bit integer Short GLshort
i 32-bit integer Long GLint, GLsizei
f 32-bit floating point Float GLfloat, GLclampf
d 64-bit floating point Double GLdouble, GLclampd
ub 8-bit unsigned integer unsigned char GLubyte, GLboolean
us 16-bit unsigned integer unsigned short Glushort
ui 32- bit unsigned integer unsigned long GLuint,GLenum,GLbitfield
Tabel tipe data argumen
glVertex2I(1, 3);
glVertex2f(1.0, 3.0);
Dua perintah di atas adalah senilai, hanya saja yang pertama membentuk
koordinat vertex sebagai integer 32 bit, sedangkan yang kedua membentuknya
sebagai floating point.
Beberapa perintah OpenGL mempunyai huruf akhir v yang menunjukkan
bahwa argumennya adalah sebuah pointer ke vektor (atau array). Ada perintah-
perintah yang mempunyai versi vektor dan nonvektor, tetapi ada pula yang hanya
mempunyai versi nonvektor saja. Berikut ini contoh perintah yang mempunyai
versi vektor dan nonvektor:
glColor3f(1.0, 0.0, 0.0);
float color_array[] = {1.0, 0.0, 0.0};
glColor3fv(color_array);
Untuk lebih jelasnya, segala sesuatu tentang OpenGL dapat ditemukan
pada http://www.hermetica.com/products/magician/index.html
METODE RASTER SCAN
Peralatan raster scan memerlukan prosedur khusus untuk menghasilkan
tampilan dan menggambar garis lurus atau kurva. Pada bab ini kita akan
mempelajari hal tersebut.
1.1 ALGORITMA PEMBANGKITAN GARIS
Karena tabung sinar katoda (CRT-Catoda Ray Tube) dapat dianggap
sebagai sebuah matrik dari piksel diskrit, hal itu memungkinkan kita untuk
menggambar garis lurus dari satu titik ke titik yang lain. Proses penentuan titik
mana yang akan dijadikan pilihan terbaik untuk garis yang diinginkan dikenal
sebagai rasterisasi. Pemilihan elemen raster untuk garis vertikal, horisontal, serta
45
ο
cukup mudah, sedangkan untuk garis dengan orientasi yang lain hal itu akan
menjadi lebih sulit.
Sebelum membicarakan algoritma pembangkitan garis, perlu kiranya kita
mengingat syarat-syarat umum dari algoritma pembangkitan garis. Adapun
syarat-syarat tersebut antara lain:
- garis yang ditampilkan harus lurus
- garis harus berawal dan berakhir pada titik yang tepat
- garis harus memiliki kerapatan yang konstan serta tidak bergantung pada
panjang dan orientasi
- garis harus digambar secara cepat
Gambar 2-1
Hanya untuk garis vertikal, horisontal, serta 45
ο
yang mempunyai tingkat
kecerahan konstan sepanjang garis. Sedangkan untuk orientasi lain rasterisasi
akan manghasilkan kecerahan yang tidak rata. Bahkan pada kasus khusus,
kecerahan tergantung pada orientasi, sebagai contoh, perhatikan bahwa spasi
? ?
?
?
efektif antar piksel untuk garis 45
ο
lebih besar dari garis vertikal dan horisontal.
Hal ini membuat garis vertikal dan horisontal akan tampak lebih cerah dari garis
45
ο
. Untuk membuat kecerahan yang sama sepanjang garis dengan berbagai
macam variasi panjang dan orientasi memerlukan perhitungan dengan akar
kuadrat. Hal ini akan memperlambat proses perhitungan. Cara mengatasi yang
biasa digunakan adalah dengan melakukan perhitungan hanya kurang lebih
sepanjang garis serta mereduksi perhitungan sampai seminimal mungkin dengan
menggunakan bilangan integer.
Sebagian besar algoritma menggunakan metode incremental untuk
menyederhanakan perhitungan. Salah satu contohnya adalah:
position = start
step = increment
1 if position - end < accuracy then 4
if position > end then 2
if position < end then 3
2 position = position – step
go to 1
3 position = position + step
go to 1
4 finish
1.2 DIGITAL DIFFERENTIAL ANALYZER
Suatu teknik untuk menghasilkan garis lurus adalah dengan
menggunakan persamaan diferensial untuk garis lurus:
dimana x
1
, y
1
dan x
2
, y
2
adalah titik awal dan akhir dari garis yang diinginkan dan
y
i
adalah nilai inisialisasi untuk setiap langkah sepanjang garis. Persamaan di
atas merepresentasikan sebuah hubungan perulangan untuk nilai y berturut-
turut sepanjang garis yang diinginkan. Hal itu dinamakan Digital Differential
x
x x
y y
y y
y y y
x x
y y
x
y
kons
dx
dy
i i
i i



+ ·
∆ + ·


·


·
+
+
1 2
1 2
1
1
1 2
1 2
.
Analizer (DDA). Untuk DDA sederhana, antara ∆x atau ∆y, yang terbesar dipilih
sebagai unit raster.
Rutin digital differential analyzer (DDA) untuk rastersasi garis
Titik awal dan akhir adalah (x
1
, y
1
) dan (x
2
, y
2
) diasumsikan tidak sama.
Sign mengembalikan nilai –1,0,1 sesuai nilai argumen apakah <0, =0 atau >0.
menghitung panjang garis
if abs(x
2
- x
1
) >= abs(y
2
- y
1
) then
Length = abs(x
2
- x
1
)
else
Length = abs(y
2
- y
1
)
end if
memilih yang terbesar dari ∆x atau ∆y untuk unit raster
∆x = (x
2
- x
1
)/Length
∆y = (y
2
- y
1
)/Length
gunakan fungsi Sign agar algoritma berjalan di seluruh kuadran
x = x
1
+ 0.5*Sign(∆x)
y = y
1
+ 0.5*Sign(∆y)
loop utama
i=1
while(i<=length)
Plot(Integer(x), Integer(y))
x = x + ∆x
y = y + ∆y
i = i + 1
end while
finish
contoh1:
Buat garis dari (0,0) ke (5,5) dengan menggunakan DDA.
Inisialisasi
x
1
= 0
y
1
= 0
x
2
= 5
y
2
= 5
Length = 5
∆x = 1
∆y = 1
x = 0.5
y = 0.5
loop utama
I Plot X Y
0.5 0.5
1 (0,0)
1.5 1.5
2 (1,1)
2.5 2.5
3 (2,2)
3.5 3.5
4 (3,3)
4.5 4.5
5 (4,4)
5.5 5.5
Gambar 2-2
Hasilnya terlihat pada gambar 2-2. Perhatikan bahwa titik awal dan akhir
terlihat tepat dan piksel yang terpilih mempunyai jarak yang sama sepanjang
garis. Jika i diinisialisasi 0 sebagai pengganti 1, piksel di posisi (5,5) akan
diaktifkan. Hal ini akan menyebabkan hasil yang tidak diharapkan. Jika titik awal
berada di pojok kiri bawah, pengaktifan piksel pada posisi (5,5) akan
menghasilkan titik akhir yang tidak tepat (lihat gambar 2-2). Sebagai tambahan,
jika dua garis digambar secara berurutan, maka piksel pada posisi (5,5) akan
diaktifkan dua kali, pertama pada akhir dari garis yang pertama dan kedua pada
awal garis yang kedua. Hal ini menyebabkan piksel menjadi lebih terang
dan/atau piksel mempunyai warna yang salah.
Contoh2:
Buat garis dari (0,0) ke (-8,-4) dengan menggunakan DDA.
Inisialisasi
x
1
= 0
y
1
= 0
1 5 4
3
3
2
2
1
0
0
5
4
x
2
= -8
y
2
= -4
Length = 8
∆x = -1
∆y = -0.5
x = -0.5
y = -0.5
loop utama
i Plot x Y
-0.5 0.5
1 (-1,-1)
-1.5 -1.0
2 (-2,-1)
-2.5 -1.5
3 (-3,-2)
-3.5 -2.0
4 (-4,-2)
-4.5 -2.5
5 (-5,-3)
-5.5 -3.0
6 (-6,-3)
-6.5 -3.5
7 (-7,-4)
-7.5 -4.0
8 (-8,-4)
-8.5 -4.5
Gambar 2-3
Meskipun hasil yang tampak dalam gambar 2-3 kelihatan bisa diterima,
pada garis dari (0,0) ke (-8,4) dan (8,-4) akan terlihat bahwa rasterisasi garis
condong ke salah satu bagian (dalam hal ini bawah) dari garis yang sebenarnya.
Selain itu titik tambahan terjadi pada akhir dari garis. Jadi garis menjadi
tergantung pada orientasi dan tidak sesuai dengan syarat umum di atas. Lebih
jauh, jika fungsi integer diasumsikan menggunakan fungsi floor (pembulatan ke
bawah), hasilnya akan berbeda lagi. Sehingga harus digunakan algoritma yang
-4
-3
-2
-1
0
-4 -3 -2 -1 0 -7 -6 -5 -8
rumit dan lambat, atau akurasi dari posisi titik akhir disesuaikan. Dengan kata lain
algoritma ini kurang bagus karena harus dibentuk dengan menggunakan floating
point.
1.3 ALGORITMA BRESENHAM
Meskipun sebenarnya dibuat untuk plotter, algoritma Bresenham juga
cocok digunakan pada CRT. Algoritma tersebut mencari lokasi raster yang
optimal untuk merepresentasikan garis lurus. Untuk melaksanakan hal itu
algoritma ini selalu increment 1 unit baik x maupun y tergantung pada gradien
garisnya. Increment terhadap variabel yang lain dapat bernilai 0 atau1 tergantung
pada jarak antara lokasi aktual dengan lokasi piksel grid terdekat. Jarak ini
disebut sebagai error.
Gambar 2-4
Algoritma tersebut dirancang dengan bagus sehingga hanya tanda dari
kondisi error ini yang perlu diperiksa. Pada gambar 2-4 diperlihatkan sebuah
garis pada oktan pertama, yaitu garis dengan gradien antara 0 dan 1. Perhatikan
bahwa jika gradien dari garis yang melalui (0,0) lebih dari ½, maka pada saat x=1
garis dengan y=1 akan lebih dekat daripada garis dengan y=0. Sehingga titik
(1,1) lebih baik untuk dipilih daripada titik (1,0). Jika gradien kurang dari ½ maka
berlaku sebaliknya. Untuk gradien tepat ½ maka kita dapat memilih salah satu
dari keduanya. Dalam hal ini kita memilih (1,1).
?
?
(0,1)
(0,0) (1,0)
(1,1)
y
x
Gambar 2-5
Tidak semua garis tepat berada di titik raster. Hal ini diperlihatkan pada
gambar 2-5 di mana sebuah garis dengan gradien 3/8 yang melalui titik raster
(0,0) dan secara berurutan melalui tiga titik. Juga diperlihatkan perhitungan error
dalam merepresentasikan garis dengan piksel diskrit. Karena yang diperlukan
hanya tanda dari kondisi error, maka nilai error diinisialisasi dengan -½. Sehingga
jika gradien dari garis lebih dari atau sama dengan ½, nilai dari kondisi error pada
titik raster satu unit berikutnya (1,0) dapat ditentukan dengan menjumlahkan
gradien dari garis pada nilai dari kondisi error, yaitu:
e = e + m
dimana m adalah gradien garis. Dalam hal ini karena e diinisialisasi -½, maka:
e = -½ + 3/8 = -1/8
karena e negatif, garis akan berada di bawah dari pertengahan piksel. Sehingga
piksel pada level horisontal yang sama dengan titik sebelumnya lebih baik dipilih
sehingga y tidak di-increment. Kemudian increment lagi kondisi error dengan
gradien sehingga menghasilkan:
e = -1/8 + 3/8 = ¼
pada titik raster berikutnya (2,0). Di sini e bernilai positif sehingga garis melalui
atas pertengahan titik. Elemen raster pada level vertikal yang lebih tinggi (2,1)
menjadi pilihan yang lebih baik. Sehingga y di-increment satu unit. Sebelum
melanjutkan pada titik berikutnya, kondisi error direinisialisasi terlebih dahulu. Hal
itu dilakukan dengan mengurangi error dengan 1. Jadi,
0
0 1 2 3
1
-0.5
1
-1
0.5
0
e = ¼ - 1 = -3/8
Karena e negatif, nilai y tidak di-increment. Hal-hal di atas menunjukkan bahwa
kondisi error merupakan penentu dari perubahan nilai y pada garis yang
diinginkan pada tiap-tiap elemen raster dimulai dari -½.
Algoritma Bresenham untuk rasterisasi garis pada oktan pertama
Titik awal dan akhir adalah (x
1
, y
1
) dan (x
2
, y
2
) diasumsikan tidak sama.
x, y, ∆x, ∆y diasumsikan integer; e real
inisialisasi variabel
x = x
1
y = y
1
∆x = x
2
- x
1
∆y = y
2
- y
1
e = ∆y /∆x – ½
loop utama
for i=1 to ∆x
Plot(x,y)
while(e>=0)
y = y + 1
e = e - 1
end while
x = x + 1
e = e + ∆y /∆x
next i
finish
contoh:
Buat garis dari (0,0) ke (5,5) dengan menggunakan algoritma Bresenham.
Inisialisasi
x = 0
y = 0
∆x = 5
∆y = 5
e = 1 – ½ = ½
loop utama
i Plot e x y
½ 0 0
1 (0,0)
- ½ 0 1
½ 1 1
2 (1,1)
- ½ 1 2
½ 2 2
3 (2,2)
- ½ 2 3
½ 3 3
4 (3,3)
- ½ 3 4
½ 4 4
5 (4,4)
- ½ 4 5
½ 5 5
Gambar 2-6
Hasilnya ditunjukkan pada gambar 2-6. Perhatikan bahwa unit raster
pada (5,5) tidak diaktifkan. Unit raster ini dapat diaktifkan dengan merubah
looping for-next menjadi 0 ke ∆x. Unit raster pertama pada (0,0) dapat
dihilangkan dengan memindah statemen Plot ke posisi tepat sebelum next i.
1.4 ALGORITMA BRESENHAM INTEGER
Algoritma Bresenham di atas memerlukan penggunaan floating point
dalam perhitungannya. Hal ini tentu saja mengurangi kecepatan dari
pembangkitan garis tersebut. Untuk meningkatkan kecepatan tersebut digunakan
perhitungan dengan menggunakan bilangan integer. Karena yang penting
hanyalah tanda dari kondisi error, transformasi sederhana
ε = 2*e*∆x è e = ε /(2*∆x)
dari kondisi error pada algoritma sebelumnya menghasilkan algoritma integer.
1 5 4 3
2
2
1
0
0
3
5
4
Algoritma Bresenham Integer untuk oktan pertama
Titik awal dan akhir adalah (x
1
, y
1
) dan (x
2
, y
2
) diasumsikan tidak sama.
Semua variabel diasumsikan integer
Inisialisasi variabel
x = x
1
y = y
1
∆x = x
2
– x
1
∆y = y
2
– y
1
ε = 2*∆y -∆x è
loop utama
for i=1 to ∆x
Plot(x,y)
while(ε>=0)
y = y + 1
ε = ε – 2*∆x è
end while
x = x + 1
ε = ε + 2*∆y è
next i
finish
1.5 ALGORITMA BRESENHAM UMUM
Implementasi algoritma Bresenham secara penuh memerlukan modifikasi
untuk garis yang berada pada oktan yang berbeda. Hal itu dilakukan dengan
mempertimbangkan kuadran di mana garis tersebut berada beserta
kemiringannya. Pada saat nilai absolute dari kemiringan garis lebih dari 1, y
dinaikkan 1 dan kondisi error digunakan untuk menentukan kapan x dinaikkan.
Kapan x atau y dinaikkan +1 tergantung dari kuadrannya (Lihat gambar 2-7).
x
x y
x
x
y
x
x
y
e

∆ − ∆
·




·




·
* 2
* 2
* 2
2
1
* 2
2
1
ε
ε
x
x
x x
e e




·

− ·
* 2
* 2
* 2 * 2
1
ε ε
x
y
x x
x
y
e e


+

·



+ ·
* 2
* 2
* 2 * 2
ε ε
Gambar 2-7
Algoritma Bresenham Integer untuk seluruh kuadran
Titik awal dan akhir adalah (x
1
, y
1
) dan (x
2
, y
2
) diasumsikan tidak sama.
Semua variabel diasumsikan integer
Sign mengembalikan nilai –1,0,1 sesuai nilai argumen apakah <0, =0 atau >0.
inisialisasi
x = x
1
y = y
1
∆x = abs(x
2
- x
1
)
∆y = abs(y
2
- y
1
)
s
1
= Sign(x
2
- x
1
)
s
2
= Sign(y
2
- y
1
)
ε = 2*∆y – ∆x
menukar ∆x dan ∆y sesuai dengan kemiringan garis
if ∆y > ∆x then
temp = ∆x
∆x = ∆y
∆y = temp
interchange = 1
else
interchange = 0
end if
x = x + 1
y = y + 1 y = y+1
x = x + 1
x = x - 1
y = y - 1
x = x - 1
y = y - 1
x
y
x++
y++
x++
y++
x--
x--
y-- y--
loop utama
for i=1 to ∆x
Plot(x,y)
while(ε>=0)
if interchange=1 then
x = x + s
1
else
y = y + s
2
end if
ε = ε – 2*∆x
end while
if interchange=1 then
y = y + s
2
else
x = x + s
1
end if
ε = ε + 2*∆y
next i
finish
Contoh:
Buat garis dari (0,0) ke (-8,-4) dengan menggunakan algoritma bresenham.
Inisialisasi
x = 0
y = 0
∆x = 8
∆y = 4
s
1
= -1
s
2
= -1
Interchange = 0
ε = 0
loop utama
i Plot ε X Y
0 0 0
1 (0,0)
-16 0 -1
-8 -1 -1
2 (-1,-1)
0 -2 -1
3 (-2,-1)
-16 -2 -2
-8 -3 -2
4 (-3,-2)
0 -4 -2
5 (-4,-2)
-16 -4 -3
-8 -5 -3
6 (-5,-3)
0 -6 -3
7 (-6,-3)
-16 -6 -4
-8 -7 -4
8 (-7,-4)
0 -8 -4
Gambar 2-8
1.6 PEMBANGKITAN LINGKARAN - ALGORITMA BRESENHAM
Selain rasterisasi garis lurus penting juga untuk mampelajari rasterisasi
fungsi yang lebih rumit, seperti lingkaran, elips, parabola, serta hiperbola. Pada
sub bab ini kita akan membahas algoritma pembangkitan lingkaran. Salah satu
algoritma yang paling mudah dan efisien adalah algoritma Bresenham. Untuk
memulai, perhatikan bahwa hanya satu oktan dari lingkaran yang perlu untuk
dibangkitkan. Bagian yang lain dapat dihasilkan dengan pencerminan secara
berturut-turut. Oktan kedua dapat dihasilkan dengan pencerminan oktan pertama
terhadap garis y=x untuk menghasilkan kuadran pertama. Hasil kuadran pertama
ini dicerminkan pada garis y=0 untuk menghasilkan kuadran yang kedua. Dan
akhirnya kombinasi dari hasil-hasil tersebut dicerminkan pada garis x=0 untuk
melengkapi lingkaran. Lihat gambar 2-9.
-4
-3
-2
-1
0
-4 -3 -2 -1 0 -7 -6 -5 -8
Gambar 2-9
Untuk membuat lingkaran kita akan mempelajari algoritma Bresenham
untuk kuadran pertama. Perhatikan bahwa algoritma dimulai pada x=0, y=R, lalu
secara searah jarum jam y akan berkurang terhadap fungsi x pada kuadran
pertama (lihat gambar 2-10). Kita juga bisa memulai dari y=0, x=R, lalu secara
berlawanan arah jarum jam x akan berkurang terhadap fungsi y pada kuadran
pertama. Kali ini kita akan menggunakan cara yang pertama. Pusat lingkaran
serta titik awal dianggap tepat berada pada piksel.
Gambar 2-10
x
y
1
3
8
2
4
5
6 7
digenerate
oktan 1 dicerminkan
thd grs y=x
kuadran 1 dicerminkan
thd grs y (x=0)
separuh lingkaran
dicerminkan thd
grs x (y=0)
(0,R)
R
x
y
Pada pemilihan piksel berikutnya, hanya ada tiga kemungkinan piksel
yang akan menghasilkan lingkaran yang diinginkan. Ketiganya adalah vertikal ke
bawah (m
V
), horisontal ke kanan (m
H
), serta diagonal ke kanan bawah (m
D
).
Algoritma akan memilih piksel berikutnya yang memiliki jarak minimum dengan
lingkaran sebenarnya.
m
H
= |(x
i
+ 1)
2
+ (y
i
)
2
- R
2
|
m
V
= |(x
i
)
2
+ (y
i
- 1)
2
- R
2
|
m
D
= |(x
i
+ 1)
2
+ (y
i
- 1)
2
-R
2
|
Gambar 2-11
Perhitungan dapat disederhanakan dengan memperhatikan bahwa hanya
ada lima kemungkinan tipe perpotongan dari lingkaran dan piksel grid seperti
yang terlihat pada gambar 2-12. Selisih antara kuadrat jarak dari pusat lingkaran
ke piksel diagonal (x
i
+ 1, y
i
- 1) dan titik lingkaran sebenarnya adalah:

i
= (x
i
+ 1)
2
+ (y
i
- 1)
2
-R
2
Seperti pada algoritma Bresenham untuk pembangkitan garis, kita juga
hanya akan menggunakan tanda dari kondisi error agar hanya bilangan integer
saja yang digunakan.
(x
i
,y
i
) (x
i+1
,y
i
)
(x
i
,y
i-1
) (x
i+1
,y
i-1
)
m
H
m
D
m
V
Gambar 2-12
Jika ∆
i
<0, maka titik diagonal (x
i
+ 1, y
i
- 1) berada di dalam lingkaran yang
sebenarnya, yakni kondisi 1 dan 2 pada gambar 2-12. Jadi kita harus memilih titik
m
H
atau m
D
. Untuk menentukannya, pada kondisi 1 kita memerlukan selisih
antara kuadrat jarak dari lingkaran sebenarnya ke titik m
H
dan kuadrat jarak dari
lingkaran sebenarnya ke titik m
D
, yaitu:
δ = |(x
i
+ 1)
2
+ (y
i
)
2
- R
2
| - |(x
i
+ 1)
2
+ (y
i
- 1)
2
-R
2
|
Jika δ<0, maka jarak antara lingkaran sebenarnya dengan piksel diagonal
(m
D
) lebih besar dari jarak antara lingkaran sebenarnya dengan piksel horisontal
(m
H
). Jadi jika δ<=0 pilihlah m
H
(x
i
+ 1, y
i
), sedangkan jika δ>0 pilihlah m
D
(x
i
+ 1, y
i
-
1).
Perhitungan di atas bisa disederhanakan dengan memperhatikan bahwa
pada kondisi 1 piksel diagonal selalu berada di dalam lingkaran sedangkan piksel
horisontal selalu berada di luar lingkaran, sehingga:
(x
i
+ 1)
2
+ (y
i
)
2
-R
2
>= 0
(x
i
+ 1)
2
+ (y
i
- 1)
2
-R
2
< 0
jadi,
δ = (x
i
+ 1)
2
+ (y
i
)
2
- R
2
+ (x
i
+ 1)
2
+ (y
i
- 1)
2
-R
2
dengan manambahkan (y
i
- 1)
2
dan mengurangi dengan (y
i
)
2
, maka akan
diperoleh:
(x
i
,y
i
) (x
i+1
,y
i
)
(x
i
,y
i-1
)
(x
i+1
,y
i-1
)
m
H
m
D
m
V
(x
i-1
,y
i-1
)
(x
i+1
,y
i+1
)
2
3 5
1
4
δ = 2[(x
i
+ 1)
2
+ (y
i
- 1)
2
- R
2
] + 2y
i
- 1
dengan persamaan dari ∆
i
maka:
δ = 2(∆
i

+ y
i
)

- 1
yang menjadi jauh lebih sederhana.
Jika ∆
i
>0, maka titik diagonal (x
i
+ 1, y
i
- 1) berada di luar lingkaran yang
sebenarnya, yakni kondisi 3 dan 4 pada gambar 2-12. Jadi kita harus memilih titik
m
V
atau m
D
. Untuk menentukannya, pada kondisi 3 kita memerlukan selisih
antara kuadrat jarak dari lingkaran sebenarnya ke titik m
V
dan kuadrat jarak dari
lingkaran sebenarnya ke titik m
D
, yaitu:
δ’ = |(x
i
+ 1)
2
+ (y
i
- 1)
2
-R
2
| - |(x
i
)
2
+ (y
i
- 1)
2
- R
2
|
Jika δ’<0, maka jarak antara lingkaran sebenarnya dengan piksel vertikal
(m
V
) lebih besar dari jarak antara lingkaran sebenarnya dengan piksel diagonal
(m
D
). Jadi jika δ’<=0 pilihlah m
D
(x
i
+ 1, y
i
- 1), sedangkan jika δ’>0 pilihlah m
V
(x
i
, y
i
- 1).
Perhitungan di atas bisa disederhanakan dengan memperhatikan bahwa
pada kondisi 3 piksel diagonal selalu berada di luar lingkaran sedangkan piksel
horisontal selalu berada di dalam lingkaran, sehingga:
(x
i
+ 1)
2
+ (y
i
- 1)
2
-R
2
>= 0
(x
i
)
2
+ (y
i
- 1)
2
-R
2
< 0
jadi,
δ’ = (x
i
+ 1)
2
+ (y
i
- 1)
2
-R
2
+ (x
i
)
2
+ (y
i
- 1)
2
-R
2
dengan manambahkan (x
i
+ 1)
2
dan mengurangi dengan (x
i
)
2
, maka akan
diperoleh:
δ’ = 2[(x
i
+ 1)
2
+ (y
i
- 1)
2
- R
2
] - 2x
i
- 1
dengan persamaan dari ∆
i
maka persamaan akan menjadi:
δ’ = 2(∆
i

- x
i
)

- 1
Jika berada pada kondisi 2 kita tentu saja akan memilih piksel m
H
(x
i
+ 1,
y
i
), dan jika berada pada kondisi 4 maka piksel m
V
(x
i
, y
i
- 1) yang akan kita pilih.
Sedangkan jika kita berada pada kondisi 5 maka piksel yang kita pilih adalah
m
D
(x
i
+ 1, y
i
- 1).
Algoritma lingkaran Bresenham untuk kuadran pertama
Semua variabel diasumsikan integer
Inisialisasi
x
i
= 0
y
i
= R

i
= 2(1-R)
Limit = 0
1 Plot(x
i
,y
i
)
menentukan berada di kondisi 1 atau 2, 3 atau 4, atau 5
if y
i
<= Limit then 4
if ∆
i
< 0 then 2
if ∆
i
> 0 then 3
if ∆
i
= 0 then 20
menentukan berada di kondisi 1 atau 2
2 δ = 2∆
i
+ 2y
i
- 1
if δ <= 0 then 10
if δ > 0 then 20
menentukan berada di kondisi 3 atau 4
3 δ’ = 2∆
i
+ 2x
i
- 1
if δ’ <= 0 then 20
if δ’ > 0 then 30
melakukan perpindahan piksel
piksel m
H
10x
i
= x
i
+ 1

i
= ∆
i
+ 2x
i
+ 1
go to 1
piksel m
D
20x
i
= x
i
+ 1
y
i
= y
i
- 1

i
= ∆
i
+ 2x
i
- 2y
i
+ 1
go to 1
piksel m
V
30y
i
= y
i
- 1

i
= ∆
i
- 2y
i
+ 1
go to 1
4. Finish
Contoh:
Buat kuadran pertama lingkaran dengan jari-jari 8. Gunakan algoritma
Bresenham.
Inisialisasi
x = 0
y = 0

i
= 2(1 - 8) = -14
Limit = 0
loop utama
Plot ∆
i
δ δ’ X y
-14 0 8
(0,8)
-11 -13 1 8
(1,8)
-6 -7 2 8
(2,8)
-12 3 3 7
(3,7)
-3 -11 4 7
(4,7)
-3 7 5 6
(5,6)
1 5 6 5
(6,5)
9 -11 7 4
(7,4)
4 3 7 3
(7,3)
18 -7 8 2
(8,2)
17 19 8 1
(8,1)
18 17 8 0
(8,0)
Hasilnya ditunjukkan pada gambar 2-13. Kuadran yang lain dapat kita
hasilkan dengan mudah menggunakan algoritma di atas.
Gambar 2-13
(0,0)
(0,8)
(8,0)
x
y
TRANSFORMASI DUA DIMENSI
DAN METODE PARAMETRIK
2.1 TRANSFORMASI DUA DIMENSI
Titik beserta garis yang menghubungkannya digunakan untuk
merepresentasikan obyek, sehingga kemampuan untuk mentransformasikannya
merupakan dasar dari grafika komputer. Untuk merepresentasikan sebuah
obyek, kita mungkin akan memerlukan operasi-operasi transformasi seperti
refleksi, rotasi, serta dilatasi.
2.1.1 TRANFORMASI TITIK
Perhatikan hasil dari perkalian dari matrik [x y] yang berisi koordinat
dari sebuah titik P dengan matrik transformasi 2x2:
Notasi di atas berarti bahwa koordinat awal x dan y ditransformasikan ke x’ dan
y’, di mana x’=(ax+cy) dan y’=(bx+dy). Jadi x’ dan y’ adalah koordinat
transformasi dari titik P.
Karena pada perhitungan matrik perkalian dengan matrik identitas
sama dengan perkalian dengan 1 pada perhitungan biasa, maka jika matrik P[x
y] dikalikan dengan matrik identitas hasilnya adalah tidak ada perubahan
koordinat dari titik P.
Jika d diberi nilai 1 dan b serta c diberi nilai 0, maka:
] ' ' [ ] ) ( ) ( [ ] [ y x dy cx by ax
d c
b a
y x · + + ·
]
]
]

] ' ' [ ] [
1 0
0 1
] [ y x y x y x · ·
]
]
]

] ' ' [ ] [
1 0
0
] [ y x y ax
a
y x · ·
]
]
]

Dimana karena x’=ax menghasilkan perubahan skala pada komponen x dari
vektor posisi. Hasil dari transformasi di atas terlihat pada gambar 2-1a. Sekarang
perhatikan notasi di bawah ini:
Notasi di atas menghasilkan perubahan skala pada koordinat x dan y
dari koordinat awal vektor P, seperti yang ditunjukkan gambar 2-1b. Jika a=d>1
maka akan terjadi perbesaran terhadap koordinat P, sedangkan jika 0<a=d<1
maka yang akan terjadi adalah sebaliknya.
Jika a dan/atau d bernilai negatif, akan terjadi refleksi terhadap sumbu
atau bidang. Untuk membuktikannya perhatikan notasi di bawah ini, dimana
b=c=0, d=1, sedangkan a=-1:
Dan terjadi refleksi terhadap sumbu y, seperti yang ditunjukkan pada
gambar 2-1c. Jika b=c=0, a=1, dan d=-1, maka terjadi refleksi terhadap sumbu x.
Jika b=c=0, dan a=d<0 refleksi terjadi terhadap titik awal. Hal ini ditunjukkan
pada gambar 2-1d dengan a=-1, d=-1. Perhatikan bahwa baik pada refleksi
maupun scaling dari koordinat hanya melibatkan diagonal primer dari matrik
transformasi.
Sekarang perhatikan efek dari diagonal sekunder. Jika kita memberi
nilai a=d=1, dan c=0, maka:
Perhatikan bahwa koordinat x dari titik P tidak berubah, sementara y’
tergantung secara linier terhadap koordinat awal. Hal ini disebut dengan efek
shear, seperti yang ditunjukkan pada gambar 2-1e. Dan ketika a=d=1, b=0,
transformasi menghasilkan pergeseran sejajar sumbu y, seperti yang terlihat
pada gambar 2-1f.
] ' ' [ ] [
0
0
] [ y x dy ax
d
a
y x · ·
]
]
]

] ' ' [ ] [
1 0
0 1
] [ y x y x y x · − ·
]
]
]


] ' ' [ ] ) ( [
1 0
1
] [ y x y bx x
b
y x · + ·
]
]
]

Gambar 2-1
2.1.2 ROTASI
Gambar 2-2
Perhatikan segitiga ABC yang ditunjukkan oleh gambar 2-2. Segitiga
tersebut dirotasikan 90
ο
dari posisi awal berlawanan arah dengan jarum jam
dengan matrik transformasi:
x
y
x
y
x
y
x
y
x
y
x
y
P P'
P
P
P
P P
P'
P'
P'
P' P'
(a) (c)
(f) (d)
(e)
(b)
]
]
]

− 0 1
1 0
2 4 6 8
2
4
6
8
0
x
y
Jika kita menggunakan matrik 3x2 yang berisi koordinat dari segitiga, maka:
Yang menghasilkan segitiga A’B’C’. Rotasi 180
ο
terhadap posisi awal akan
dihasilkan dengan menggunakan matrik transformasi:
Dan rotasi 270
ο
derajat terhadap posisi awal menggunakan matrik:
Tentu saja matrik identitas:
Akan menghasilkan rotasi 0
ο
atau 360
ο
terhadap posisi awal. Contoh-contoh di
atas menggambarkan rotasi tertentu terhadap posisi awal: 0
ο
, 90
ο
, 180
ο
, 270
ο
.
Bagaimana jika kita menginginkan rotasi terhadap posisi awal dengan sudut yang
berubah-ubah?
]
]
]
]
]


− ·
]
]
]


]
]
]
]
]


2 1
4 1
3 1
0 1
1 0
1 2
1 4
1 3
]
]
]



1 0
0 1
]
]
]


0 1
1 0
]
]
]

1 0
0 1
Perhatikan gambar 2-3. Vektor posisi P dengan panjang r dan sudut φ terhadap
sumbu x dirotasikan dengan sudut θ ke P’.
Gambar 2-3
Vektor posisi P dan P’ dituliskan sebagai:
Berdasarkan rumus matematika penjumlahan sudut dimana:
Diperoleh:
Dengan menggunakan definisi x dan y maka P’ dapat ditulis sebagai:
Sehingga x’ dan y’ dalam bentuk matrik diperoleh:
2.1.3 REFLEKSI
X
Y
|
|
|
|
------------------x'------------------
|
|
|
|
|
|
|
|
|
-----------x----------
y'
y
P
P'
φ
θ
[ ] [ ] φ φ sin cos r r y x P · ·
[ ] [ ] ) sin( ) cos( ' ' ' θ φ θ φ + + · · r r y x P
θ φ θ φ θ φ
θ φ θ φ θ φ
cos sin sin cos ) sin(
cos sin cos cos ) cos(
t · t
t · t
[ ] [ ] ) cos sin sin (cos ) sin sin cos (cos ' ' ' θ φ θ φ θ φ θ φ + − · · r r y x P
[ ] [ ] θ θ θ θ cos sin sin cos ' ' ' y x y x y x P + − · ·
]
]
]

− θ θ
θ θ
cos sin
sin cos
Gambar 2-4
Dua refleksi dari segitiga DEF ditunjukkan pada gambar 2-4. Sebuah
refleksi terhadap garis y=0 (sumbu x) diperoleh dengan menggunakan matrik:
Dalam hal ini titik-titik segitiga D’E’F’ diperoleh dari:
Sama seperti sumbu x, refleksi terhadap sumbu y diperoleh dengan matrik:
]
]
]

−1 0
0 1
]
]
]
]
]




·
]
]
]


]
]
]
]
]

2 6
3 7
1 8
1 0
0 1
2 6
3 7
1 8
]
]
]


1 0
0 1
E'' D''
F''
E'
D'
F'
E
D
F
X
Y
Sedangkan refleksi terhadap garis y=x terjadi untuk
Pada transformasi di atas, titik-titik D’’E’’F’’ diperoleh dari:
Seperti juga pada garis y=x, refleksi terhadap garis y=-x diperoleh dengan:
Masing-masing matrik refleksi di atas mempunyai determinan sama
dengan –1. Secara umum, jika determinan dari suatu matrik transformasi sama
dengan –1, maka transformasi akan menghasilkan suatu refleksi.
Jika dua refleksi terhadap garis dilakukan terhadap suatu posisi
tertentu, maka operasi tersebut akan menghasilkan/sama dengan sebuah rotasi
terhadap posisi tersebut. Untuk lebih jelasnya perhatikan contoh di bawah ini:
Segitiga ABC pertama direfleksikan terhadap sumbu x, kemudian direfleksikan
terhadap garis y=-x. hasilnya akan sama dengan apabila segitiga tersebut
dirotasikan dengan sudut 270
ο
.
]
]
]

0 1
1 0
]
]
]
]
]

·
]
]
]

]
]
]
]
]

6 2
7 3
8 1
0 1
1 0
2 6
3 7
1 8
]
]
]



0 1
1 0
Gambar 2-5
Pertama refleksikan segitiga ABC terhadap sumbu x:
Kemudian refleksikan lagi segitiga tersebut terhadap garis y=-x:
Hasilnya akan sama dengan rotasi dengan sudut 270
ο
:
]
]
]
]
]




·
]
]
]


]
]
]
]
]

2 7
1 5
3 5
1 0
0 1
2 7
1 5
3 5
F''
F'
F
X
Y
D
D''
D'
E
E''
E'
2 4 6 8
-2
-4
-6
-8
]
]
]
]
]




·
]
]
]



]
]
]
]
]




7 2
5 1
5 3
0 1
1 0
2 7
1 5
3 5
]
]
]
]
]




·
]
]
]


]
]
]
]
]

7 2
5 1
5 3
0 1
1 0
2 7
1 5
3 5
2.1.4 SCALING
Seperti yang telah kita bicarakan dalam subbab transformasi titik di
atas, scaling ditentukan oleh nilai dari dua elemen diagonal primer matrik. Jika
matrik:
Digunakan sebagai operator pada titik-titik segitiga, perbesaran 2 kali dari
segitiga tersebut akan terjadi. Jika nilainya tidak sama akan terjadi distorsi,
seperti yang terlihat pada gambar 2-6.
Gambar 2-6
Segitiga ABC ditransformasikan sehingga menghasilkan segitiga A’B’C’, dimana
terjadi scaling uniform. Sedangkan transformasi dengan menggunakan matrik:
Menghasilkan scaling nonuniform, yang tampak pada segitiga A’’B’’C’’. Secara
umum, jika matrik:
]
]
]

2 0
0 2
B
X
Y
A
2 4 6 8 12 10
2
4
6
8
C
B'
A'
C'
B''
A''
C''
]
]
]

3 0
0
2
1
]
]
]

d c
b a
Dengan a=d, b=c=0, akan menghasilkan scaling uniform. Sedangkan jika a≠d,
b=c=0 akan menghasilkan scaling nonuniform. Untuk scaling uniform, jika a=d>1,
maka akan terjadi perbesaran. Sedangkan jika a=d<1 obyek akan diperkecil.
2.2 PARAMETRIK
Selain metode raster scan seperti yang telah dibahas pada bab pertama,
untuk menggambar suatu obyek kta dapat menggunakan metode yang lain, yaitu
metode parametrik. Pada subbab ini kita akan membahas algoritma
pembangkitan lingkaran dan elips dengan menggunakan metode parametrik.
2.2.1 LINGKARAN
Sebuah lingkaran dengan pusat (0,0) dan jari-jari r direpresentasikan
oleh:
Gambar 2-7
Dimana θ adalah parameternya. Sebelumnya kita ingat bahwa meskipun jika
persamaan tersebut mengincrement θ akan menghasilkan output yang bagus,
akan tetapi hal tersebut tidak efisien karena memerlukan perhitungan fungsi
trigonometri berulang-ulang sehingga akan memperlambat pembangkitan
lingkaran.
π θ
θ
θ
2 0
sin
cos
<· <·
·
·
r y
r x
r
θ
r sin
r cos θ
θ
x
y
Perhatikan bahwa lingkaran berada dalam range parameter θ dari 0
sampai 2π dan asumsikan terdapat sejumlah titik-titik pada keliling lingkaran,
maka δ, parameter yang increment di antara titik-titik tersebut merupakan suatu
konstanta. Sehingga koordinat kartesius dari sembarang titik pada lingkaran yang
berpusat di (0,0) adalah:
Dimana θ
i
adalah nilai dari parameter yang menghasilkan x
i
dan y
i
. Dengan
menggunakan rumus matematika penjumlahan sudut diperoleh:
Sesuai definisi x dan y dengan mengganti θ dengan θ
i
:
Sehingga akan dihasilkan persamaan yang merepresentasikan rotasi dari titik x
i
dan y
i
dengan sudut δ:
Karena δ konstan dan sama dengan 2π/(n-1) dimana n adalah jumlah
titik-titik dari lingkaran tersebut, nilai dari sin δ, dan cos δ hanya perlu dihitung
satu kali saja. Sehingga algoritma ini hanya memerlukan empat perkalian, satu
penjumlahan, serta satu pengurangan saja dalam setiap perulangannya. Tentu
saja hal ini sangat efisien dan akan mempercepat pembangkitan lingkaran.
2.2.2 ELIPS
Pada lingkaran, sejumlah titik yang berjarak sama menghasilkan
gambar yang bagus jika dihubungkan dengan garis lurus. Selain itu distribusi
titik-titik tersebut merata sehingga kita dapat menggunakan increment sudut yang
sama. Akan tetapi jika increment sudut tersebut kita gunakan untuk menggambar
) sin(
) cos(
1
1
δ θ
δ θ
+ ·
+ ·
+
+
i i
i i
r y
r x
) cos sin sin (cos
) sin sin cos (cos
1
1
δ θ δ θ
δ θ δ θ
i i i
i i i
r y
r x
+ ·
− ·
+
+
i i
i i
r y
r x
θ
θ
sin
cos
·
·
δ δ
δ δ
cos sin
sin cos
1
1
i i i
i i i
y x y
y x x
+ ·
− ·
+
+
elips, maka akan diperoleh hasil yang tidak sesuai dengan apa yang kita
harapkan. Hal itu disebabkan oleh karena mendekati bagian ujung dari elips
lengkungan yang terjadi terlalu besar untuk direpresentasikan dengan titik yang
hanya sedikit.
Alternatif yang digunakan adalah dengan menggunakan increment
yang sama sepanjang keliling elips. Dengan jumlah increment yang cukup maka
akan diperoleh hasil yang lebih baik. Yang kita inginkan adalah sedikit increment
pada panjang garis keliling ketika mendekati bagian ujung dimana
lengkungannya besar dan banyak increment pada panjang garis keliling ketika
berada di bagian sisi dimana lengkungannya kecil.
Distribusi titik yang diinginkan dari sebuah elips dengan pusat (0,0),
sumbu mayor a dan sumbu minor b akan dihasilkan oleh persamaan:
x = a cos θ
y = b sin θ
Gambar 2-8
dimana θ adalah parameternya. Dengan mengubah nilai θ antara 0 sampai 2π
akan memenuhi seluruh elips. Dengan memeriksa turunan dari x dan y:
dx = -a sin θ dθ
dy = b cos θ dθ
x
y
menunjukkan bahwa increment garis keliling yang diinginkan akan dihasilkan
secara otomatis. Ketika θ mendekati 0 atau π, yaitu mendekati pinggir, |dx| ≈ 0
dan |dy| ≈ bdθ. Ketika θ mendekati π/2 atau 3π/2 yaitu sepanjang sisi, |dx| ≈ adθ
dan |dy| ≈ 0. Jadi ketika mendekati ujung dimana lengkungannya besar,
dihasilkan jumlah titik yang lebih banyak. Sedangkan sepanjang sisi, dimana
lengkungannya kecil akan dihasilkan jumlah titik yang lebih sedikit. Nilai
perbandingan increment garis keliling di ujung dengan sisi adalah b/a. Lebih
jauh, perhatikan bahwa jika a=b maka akan dihasilkan increment garis keliling
yang sama dan akan menghasilkan sebuah lingkaran.
Sesuai dengan persamaan dari lingkaran, koordinat kartesius dari
sembarang titik pada elips yang berpusat di (0,0) adalah:
Dimana δ=2π/(n-1) adalah increment dalam θ, n adalah jumlah titik pada keliling
dan θ
i
adalah nilai dari parameter yang menghasilkan x
i
dan y
i
. Dengan
menggunakan rumus matematika penjumlahan sudut diperoleh:
Sesuai definisi x dan y dengan mengganti θ dengan θ
i
akan dihasilkan
persamaan:
Karena δ, a dan b adalah konstan, sekali lagi algoritma yang efisien
akan dihasilkan karena hanya memerlukan empat perkalian, satu penjumlahan,
serta satu pengurangan saja dalam setiap perulangannya.
) sin(
) cos(
1
1
δ θ
δ θ
+ ·
+ ·
+
+
i i
i i
b y
a x
) cos sin sin (cos
) sin sin cos (cos
1
1
δ θ δ θ
δ θ δ θ
i i i
i i i
b y
a x
+ ·
− ·
+
+
δ δ
δ δ
cos sin
sin cos
1
1
i i i
i i i
y x
a
b
y
y
b
a
x x
+
,
`

.
|
·

,
`

.
|
− ·
+
+
2.3 IMPLEMENTASI
Salah satu contoh implementasi yang sederhana dan umum yang akan
kita bahas adalah menggambar lingkaran melalui tiga buah titik. Kita akan
menggambar lingkaran melalui suatu segitiga, yang pertama berada di luar
segitiga, sedangkan pada contoh yang kedua lingkaran tersebut berada di dalam
segitiga.
Gambar 2-9
Seperti yang terlihat pada gambar 2-9 titik-titiknya adalah P
1
(x
1
,y
1
),
P
2
(x
2
,y
2
) dan P
3
(x
3
,y
3
). Persamaannya adalah:
Pemecahannya adalah dengan mengurangi persamaan (a) dengan
persamaan (b) dan mengurangi persamaan (c) dengan persamaan (b). Secara
c R k y h x
b R k y h x
a R k y h x
1 .. .......... .......... .......... .......... ) ( ) (
1 .. .......... .......... .......... .......... ) ( ) (
1 .. .......... .......... .......... .......... ) ( ) (
2 2
3
2
3
2 2
2
2
2
2 2
1
2
1
· − + −
· − + −
· − + −
P
1
P
3
P
2
x
x''
x'
y
y''
y'
lebih khusus, pemecahannya adalah [(a)-(b)](x
3
-x
2
)-[(c)-(b)](x
1
-x
2
) dimana huruf
dalam kurung siku menunjuk pada persamaan 1. Hasilnya diperoleh untuk k:
Mirip dengan di atas, h dihitung dari [(a)-(b)] dan persamaan 2 menghasilkan:
R ditentukan dari salah satu persamaan 1.
Persamaan-persamaan tersebut menampakkan beberapa kesulitan.
Khususnya jika penyebut dari kedua persamaan tersebut sama dengan nol,
maka metode alternatif harus digunakan. Lebih jauh, kondisi untuk memeriksa
apakah jari-jarinya tak terbatas (tak terdefinisi) atau titik-titiknya berada pada satu
gari (kolinear) tidak dapat dilakukan dengan segera.
Kesulitan yang dihasilkan oleh persamaan untuk k dan h direduksi
dengan mentranslasikan titik P
1
ke pusat sistem koordinat (0,0), sehingga
persamaannya menjadi:
Mengurangkan (a) dari (b) dan (c) menghasilkan 2 buah persamaan
linear. Solusinya adalah [(b)-(a)]x
3
’-[(c)-(a)]x
2
’, yang menghasilkan:
Translasikan kembali h’ dan k’ sehingga menghasilkan h dan k. cara ini
sekali lagi mempunyai kesulitan jika penyebut dari persamaan 5 dan 6 adalah
nol. Sebagai tambahan, kondisi dimana jari-jarinya tak terbatas (tak terdefinisi)
2 ........ ..........
)] )( ( ) )( [( 2
) )]( ( ) [( ) )]( ( ) [(
2 1 2 3 2 3 2 1
2 1
2
2
2
3
2
2
2
3 2 3
2
2
2
1
2
2
2
1
x x y y x x y y
x x y y x x x x y y x x
k
− − − − −
− − + − − − − + −
·
3 .... .......... ..........
) ( 2
) ( 2 ) ( ) (
2 1
2 1
2
2
2
1
2
2
2
1
x x
y y k y y x x
h

− − − + −
·
c R k y h x
b R k y h x
a R k h
4 .......... .......... ) ' ' ( ) ' ' (
4 .......... .......... ) ' ' ( ) ' ' (
4 .......... .......... ' '
2 2
3
2
3
2 2
2
2
2
2 2 2
· − + −
· − + −
· +
7 .......... .......... .......... .......... .......... ) ' ' (
6 .. .......... .......... .......... ..........
' 2
' ' 2 ' '
'
5 ... ..........
) ' ' ' ' ( 2
] ' ' ' ' ) ' ' ( ' ' [
'
2
1
2 2
2
2
2
2
2
2
2 3 3 2
2
2
3 3
2
2 3 2 2 3
k h R
x
k y y x
h
x y x y
x y x y x x x x
k
+ ·
− +
·

− + −
·
atau titik-titiknya segaris (kolinear) sekali lagi tidak dapat segera ditentukan.
Untuk mengatasi kesulitan-kesulitan tersebut gunakan langkah-langkah yang
dijelaskan di bawah ini.
2.3.1 LINGKARAN LUAR SEGITIGA
Dalam menggambar lingkaran luar dari suatu segitiga ini, kita akan
menggunakan operasi-operasi transformasi yang telah kita pelajari di atas. Untuk
itu, perhatikan langkah-langkah berikut ini:
1. Translasikan salah satu titik dari segitiga ke pusat dari sistem koordinat (0,0).
Dengan matrik transformasi yang sama, translasikan pula titik-titik yang lain.
Lihat gambar 2-10.
2. Rotasikan segitiga tersebut sehingga titik yang lain berada pada sumbu x
positif, seperti yang tampak pula pada gambar 2-10.
Gambar 2-10
3. Cari titik pusat dan jari-jari lingkaran.
4. Rotasikan titik pusat dari lingkaran tersebut dengan sudut yang berlawanan
arah dari langkah nomor 2.
5. Translasikan kembali titik pusat lingkaran dengan arah yang berlawanan dari
langkah pertama sehingga diperoleh titik pusat lingkaran dari segitiga asal.
6. Gambarkan lingkaran yang diinginkan dengan pusat serta jari-jari yang telah
diketahui.
Pada gambar 2-10 diperlihatkan bahwa segitiga ABC telah mengalami
operasi translasi dan rotasi sehingga titik A berada di pusat sistem koordinat dan
titik B berada pada sumbu x positif sehingga persamaan lingkarannya adalah:
x
y
A
B
C
A'/A''
B'
C'
B''
C''
x
2
+ y
2
= R
2
(a)
(x
B
- x)
2
+ y
2
= R
2
(b)
(x
C
- x)
2
+ (y
C
- y)
2
= R
2
(c)
dengan mengurangi persamaan (a) oleh persamaan (b) akan didapatkan bahwa
x = x
2
/2 dan dengan mengurangi persamaan (a) oleh persamaan (c)
diperoleh y = ½ x
3
/y
3
(x
3
– x
2
) + ½ y
3
sehingga berdasarkan persamaan (a) akan
diperoleh juga jari-jari lingkaran .
Perhatikan bahwa jika y
3
=0 maka y menjadi sangat besar (tak terdefinisi).
Bagaimanapun, hal itu hanya akan terjadi jika ketiga titik tersebut berada pada
satu garis, sehingga ketiga titik tersebut tidak membentuk segitiga dan tentu saja
tidak ada lingkaran yang bisa dibuat dengan melalui ketiga titik tersebut.
2.3.2 LINGKARAN DALAM SEGITIGA
Pada dasarnya langkah-langkah untuk membuat lingkaran dalam segitiga
adalah sama dengan langkah-langkah untuk membuat lingkaran luar segitiga.
Perbedaannya hanya terletak pada pencarian titik pusat dan jari-jari lingkaran.
Dari gambar 2-11 bisa didapatkan persamaan untuk mencari titik pusat dan jari-
jari dari lingkaran dalam segitiga.
Gambar 2-11
c - x + b – x = c
c + b – a = 2x
x
y
B
C
A
a
c
b
(c-x)
(c-x)
x
(b-x)
x
(b-x)
α
sehingga diperoleh x = (c+b-a)/2. Sedangkan untuk mencari y atau jari-jari yaitu:
tg α = y
C
/x
y = x tg ½ α
Apabila kita sudah mendapatkan pusat dan jari-jari maka titik pusat dapat kita
translasi dan rotasikan secara berlawanan arah dan lingkaran tersebut dapat kita
gambar.
KURVA
Kurva memegang peranan penting dalam kehidupan kita sehari-hari. Dalam
bidang teknik perancangan dan manufaktur kurva diperlukan untuk berbagai macam
produk, seperti otomotif, lambung kapal, badan serta sayap pesawat terbang, bailng-
baling, sepatu, botol, bangunan, dan lain-lain. Pada baba ini kita akan mambahas
mengenai pembangkitan dua macam kurva, yaitu kurva Bezier dan kurva B-Spline.
3.1 KURVA BEZIER
Gambar 3-1
Bentuk dari kurva Bezier ditentukan oleh defining polygon seperti yang terlihat
pada gambar 3-1. Kurva Bezier P(t), dengan (L+1) titik dapat dinyatakan dengan:
dimana fungsi basis Bezier atau Bernstein adalah:
dengan J
n,i
(t) adalah orde-n ke-i dari fungsi basis Bernstein. Disini n adalah derajat dari
fungsi basis Bernstein, nilainya adalah jumlah control point –1.
1 0
) ( ) (
0
,
≤ ≤
·

·
t
t J B t P
n
i
i n i
)! ( !
!
) 1 ( ) ( ,
i n i
n
i
n
t t
i
n
t J
i n i
i n

·

,
`

.
|

,
`

.
|
·

Gambar 3-2
Pada gambar 3-2 diperlihatkan hasil dari fungsi basis Bezier, masing-masing 3, 4, dan 5
titik.
Gambar 3-3
Adapun hal-hal yang menjadi persyaratan umum dari kurva Bezier antara lain
adalah:
1. Endpoint interpolation
Kurva Bezier tidak menginterpolasi semua control point, tetapi selalu
menginterpolasi titik awal dan akhir. Seperti yang terlihat pada gambar 3-3.
Bukti:
Untuk t=0 n=0 maka:
Untuk t=0 n≠0 maka:

·
·
n
i
i n i t J B t P
0
, ) ( ) (
1
1 ) 1 (
!
!
0 ) 0 1 (
)! 0 ( ! 0
!
) 0 (
0
,
·
·


· ·
n
n
i n
n
n
n
n
t J
Sehingga:
Untuk t=1 n=i maka:
Untuk t=1 n≠i maka:
Sehingga:
0
0 ) 0 1 (
)! ( !
!
) 0 ( ,
·


· ·
− i i n
i n
i n i
n
t J
1
1 0
! 0 !
!
1 ) 0 (
)! ( !
!
1 ) 1 1 (
)! ( !
!
) 1 (
0
,
·
·

·


· ·


n
n
n n n
n
i n n
n
t J
n n
i i n
i n
0
, 0 ) 0 ( ) 0 (
B
J B P i n
·
·
0
01
)! ( !
!
1 ) 0 (
)! ( !
!
1 ) 1 1 (
)! ( !
!
) 1 ( ,
·

·

·


· ·


i n n
n
i n n
n
i n n
n
t J
i n
i i n
i n
i
n n i
i n
B
J B
BiJ P
·
·
·
) 1 (
) 1 ( ) 1 (
,
,
2. Affine invariance
Untuk mentransformasikan kurva, kita tidak perlu mentransformasikan seluruh
titik dari kurva, tetapi cukup hanya control point-nya saja.
Bukti:
• Dimisalkan titik P(t) akan ditransformasi ke titik baru P’(t) dengan matrik transformasi
N dan offset vektor tr menjadi:
• Ternyata untuk mentransformasi cukup dengan mentransformasi control point-nya
saja.
Gambar 3-4
3. Linier precision
Jika control point ditempatkan sebagai garis lurus maka kurva Bezier yang
dibangkitkan harus membentuk garis lurus juga (lihat gambar 3-4).
Gambar 3-5
4. Convex hull
Setiap titik pada kurva Bezier berada dalam convex hull dari defining
polygon seperti yang terlihat pada gambar 3-5.
tr N t J B
tr N t P t P
i n
n
k
i + ·
+ ·

·
) (
) ( ) ( '
,
0
5. Variation determinishing
Kurva Bezier tidak akan berisolasi terhadap sembarang garis lebih
banyak dari defining polygon-nya. Pada gambar 3-6 kurva Bezier berisolasi
dengan garis pada tiga titik, sedangkan defining polygon-nya berisolasi pada
empat titik. Kurva akan berisolasi maksimum dengan satu garis sama dengan
isolasi dari defining polygon-nya yaitu jika kurvanya berupa garis lurus.
Gambar 3-6
3.2 KURVA B-SPLINE
Pembangkitan kurva Bezier mempunyai kelemahan yang diakibatkan oleh
sifat global dari fungsi basis Bernstein. Karena setiap titik dari kurva Bezier
merupakan hasil dari proses dari seluruh control point, maka perubahan dari satu
control point akan mempengaruhi seluruh kurva. Hal ini akan menyulitkan jika
kita akan melakukan perubahan secara lokal dalam satu kurva.
Gambar 3-7
Ada basis lain yang dinamakan basis B-Spline yang berisi basis Bernstein
dengan sifat khusus. Basis ini bersifat non-global, jadi setiap titik B
i
berhubungan
dengan sebuah fungsi basis yang berbeda. Sehingga setiap titik mempengaruhi
bentuk kurva hanya pada daerah dengan nilai parameter dimana fungsi basisnya
tidak nol.
Dengan P(t) sebagai vektor posisi sepanjang kurva sebagai fungsi
dengan parameter t, kurva B-Spline diperoleh dari persamaan:
dimana B
i
adalah vektor posisi dari n+1 titik defining polygon dan N
i,k
adalah
fungsi basis B-Spline ternormalisasi.
Untuk fungsi basis B-Spline ternormalisasi dengan orde k (derajat k-1),
fungsi basis N
i,k
(t) didefinisikan sebagai:
dan
Nilai dari x
i
adalah elemen dari knot vektor yang memenuhi persamaan x
i
≤x
i
+1.
Parameter t berada antara t
min
dan t
max
sepanjang kurva P(t).
1 2
) ( ) (
max min
1
1
,
+ ≤ ≤
≤ ≤
·

+
·
n k
t t t
t N B t P
n
i
k i i
otherwise
x t x if
t N
i i
i
÷ ÷ → ÷
< ≤ →
〈 ·
+
. ..........
1
1 ,
0
) ( 1
) (
1
1 , 1
1
1 ,
,
) ( ) ( ) ( ) (
) (
+ +
− + +
− +



+


·
i k i
k i k i
i k i
k i i
k i
x x
t N t x
x x
t N x t
t N
Gambar 3-8
Pada dasarnya persyaratan umum dari kurva B-Spline hampir sama
dengan persyaratan dari kurva Bezier. Untuk kurva B-Spline dengan orde k
(derajat k-1) setiap titik dari kurva harus berada di dalam convex hull dari k titik
yang berdekatan. Kemudian seluruh titik dari kurva B-Spline harus berada di
dalam garungan dari seluruh convex hull yang dibentuk oleh k control point. Pada
gambar 3-8 diperlihatkan efek dari perbedaan nilai dari k. perhatikan bahwa pada
saat k=2 convex hull-nya adalah defining polygon itu sendiri. Disini kurva B-
Spline yang dihasilkan juga merupakan defining polygon itu sendiri.
Gambar 3-9
Gambar 3-10
Dengan menggunakan convex hull akan terlihat jika seluruh control point
adalah kolinear maka kurva B-Spline yang akan terbentuk merupakan garis lurus
pula untuk seluruh orde k. Jika terdapat l control point yang kolinear pada awal
atau akhir dari defining polygon yang non-kolinear, maka jumlah rentang kurva
kolinear yang terjadi adalah l-k+1 seperti yang terlihat pada gambar 3-9 dan 3-10
(k=3). Sedangkan jika control point yang kolinear tersebut berada pada bagian
tengah dari defining polygon, maka jumlah rentang kurva yang terjadi adalah l-
2k+3 (lihat gambar 3-11, k=3).
Gambar 3-11
Persamaan fungsi basis B-Spline menunjukkan bahwa pamilihan knot
vektor mempunyai pengaruh penting pada hasil dari kurva B-Spline. Persyaratan
dari knot vektor adalah memenuhi persamaan x
i
≤x
i
+1. Pada dasarnya ada tiga
macam knot vektor, yaitu uniform, open uniform, dan non-uniform. Pada subbab
ini kita akan membahas dua diantaranya, yaitu uniform dan open uniform.
3.2.1 UNIFORM
Pada knot vektor uniform, jarak dari setiap elemen knot vektor adalah
sama. Biasanya knot vektor uniform dimulai dari 0 sampai suatu nilai maksimum.
Contohnya adalah:
[0 1 2 3 4 5 6]
Untuk setiap order k, knot vektor uniform akan menghasilkan fungsi basis periodic
uniform dimana:
N
i,k
(t) = N
i-1,k
(t-1) = N
i+1,k
(t+1)
Hasil dari fungsi basis dengan menggunakan knot vektor uniform terlihat pada gambar 3-
12:
Gambar 3-12
dimana knot vektornya adalah [0 1 2 3 4 5 6], jumlah control point (n+1) =
4, serta orde k=3.
Pada kurva B-Spline periodic uniform, penggambarannya dimulai pada
titik P
s
= P(t=x
k
) dan berakhir di titik P
e
= P(t=x
n+1
). Persamaannya dinyatakan
sebagai:
Hal ini menyebabkan adanya salah satu sifat dari kurva tidak terpenuhi yaitu
endpoint interpolation. Sebagai contoh untuk k=3, maka:
Sedangkan untuk k=4, maka:
Untuk itu diperlukan suatu cara dalam mengontrol titik-titik tersebut. Salah satu
caranya adalah dengan yang dinamakan multiple coincident vertices, yaitu
dengan menggandakan control point yang berada di awal dan akhir dari defining
polygon. Sebagai contoh, untuk k=3 dengan dua control point pada awal dan
akhir sehingga B
1
=B
2
dan B
n
=B
n+1
akan menghasilkan titik awal dan titik akhir
seperti di bawah ini:
Sedangkan untuk k=4, maka:
k n
B N B N B N
k
P
B N B N B N
k
P
k
i
k
i
k
i
n k i k n i k n i e
k k k k k s

+ + +

·
+ + +

·
∑ ∑ ∑
· · ·
+ + − + −

) ... (
)! 1 (
1
) ... (
)! 1 (
1
1 1 1
1 , 4 3 , 3 2 ,
1 , 2 2 , 1 1 ,
) (
2
1
) (
2
1
1
2 1
+ + ·
+ ·
n n e
s
B B P
B B P
) (
6
1
) 4 (
6
1
1 1
3 2 1
+ − + + ·
+ + ·
n n n e
s
B B B P
B B B P
1 1 1
1 1 2 1
) 2 (
2
1
) (
2
1
) 2 (
2
1
) (
2
1
+ + + · · + ·
· · + ·
n n n n e
s
B B B B P
B B B B P
Gambar 3-13
) 5 (
6
1
) (
6
1
) 5 (
6
1
) 4 (
6
1
1 1 1 1
2 1 3 2 1
+ − + − + · + + ·
+ · + + ·
n n n n n e
s
B B B B B P
B B B B B P
Gambar 3-14
Pada gambar 3-13 dan 3-14 diperlihatkan efek dari multiple coincident
vertices. Pada gambar 3-13 terdapat sebuah kurva dengan k=3 dimana bagian
atas tanpa menggunakan multiple coincident vertices, sedangkan pada bagian
bawah akhir dari defining polygon kurva tersebut ditambah satu control point
sehingga ada dua control point yang berhimpit.
Sedangkan pada gambar 3-14 terlihat kurva dengan k=4 tanpa multiple
coincident vertices, dengan satu multiple coincident vertices dan yang paling
bawahdua multiple coincident vertices (perhatikan bahwa pada contoh ini
multiple coincident vertices hanya diberikan pada akhir kurva saja).
3.2.2 OPEN UNIFORM
Knot vektor open uniform mempunyai nilai elemen knot yang sama pada
awal dan akhir sejumlah orde k. Sedangkan elemen knot yang tengah
mempunyai jarak yang sama. Secara umum, persamaan knot vektor open
uniform adalah:
x
i
= 0 1≤i≤k
x
i
= i-k k+1≤i≤n+1
x
i
= n-k+2 n+2≤i≤n+k+1
salah satu contoh knot vektor open uniform adalah:
k=2 [0 0 1 2 3 4 4]
k=3 [0 0 0 1 2 3 3 3]
k=4 [0 0 0 0 1 2 2 2 2]
Hasil dari kurva B-Spline dengan knot vektor open uniform mempunyai sifat-sifat
yang hampir sama dengan kurva Bezier. Jika jumlah control point sama dengan
orde dari fungsi basis B-Spline dan knot vektor yang digunakan adalah open
uniform, maka kurva B-Spline yang dihasilkan adalah sama dengan kurva Bezier.
Pada kasus ini, knot vektor yang terjadi adalah k elemen dengan nilai 0 diikuti
dengan k elemen dengan nilai 1. Sebagai contoh, knot vektor open uniform dari
fungsi basis B-Spline dengan orde 4 adalah:
[0 0 0 0 1 1 1 1]
Hasil dari fungsi basis open uniform dengan knot vektor di atas, orde k=4 dan
jumlah control point (n+1)=4 adalah:
Gambar 3-15
Perhatikan bahwa hasil fungsi basis di atas sama dengan hasil dari fungsi basis
kurva Bezier yang terlihat pada gambar 3-2.
Sebagai tambahan, hasil dari fungsi basis B-Spline dengan knot vektor [0
0 0 1 2 2 2], orde k=3 dan jumlah control point (n+1) = 4 adalah seperti yang
terlihat pada gambar 3-15:
Gambar 3-15
PENGGAMBARAN OBYEK GEOMETRIK
DENGAN OPENGL
4.1. Persiapan menggambar
Pada bagian ini diterangkan hal-hal yang menyangkut persiapan menggambar seperti
membersihkan window serta mengeset warna obyek yang akan digambar.
4.1.1. Membersihkan window
Menggambar di komputer tidak sama dengan menggambar di kertas dimana dimulai dari
kertas kosong berwarna putih dan kita tinggal menggambar apa yang kita inginkan. Pada
komputer, memori menahan gambar terakhir yang kita gambarkan di komputer tersebut sehingga
kita perlu membersihkannya dengan suatu warna background sebelum menggambar dengan yang
baru. Warna background yang dipakai tergantung pada aplikasi. Untuk pemroses kata, kita
mungkin akan menggunakan warna putih, untuk game pesawat luar angkasa kita akan
menggunakan warna hitam, dan lain-lain. Sebagai contoh, perintah di bawah ini akan
membersihkan window menjadi hitam:
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
Baris pertama dari perintah di atas mengeset warna background menjadi hitam, dan
perintah selanjutnya membersihkan seluruh window dengan warna yang aktif. Parameter pada
perintah glClear() menunjukkan buffer mana yang akan dibersihkan. Dalam hal ini program hanya
membersihkan buffer warna tempat menyimpan gambar yang ditampilkan. Kita hanya perlu
mengeset warna background satu kali saja di awal program dan membersihkan buffer sesering
yang kita perlukan.
4.1.2. Pembentukan warna
OpenGL akan menyimpan warna yang sedang aktif saat itu. Sebelum warna yang aktif
tersebut diganti, maka setiap obyek geometrik yang dibuat akan digambar dengan menggunakan
warna itu. Hal ini akan meningkatkan kinerja daripada tanpa mwnyimpan warna yang sedang aktif
tersebut. Sebagai contoh baris perintah di bawah ini:
set_current_color(red);
draw_object(A);
draw_object(B);
set_current_color(green);
set_current_color(blue);
draw_object(C);
akan menghasilkan obyek A dan B berwarna merah dan obyek C berwarna biru. Perintah pada
baris keempat yang mengeset warna menjadi biru tidak berguna.
Untuk mengeset warna, gunakan perintah glColor3f(). Perintah tersebut menggunakan
tiga parameter yang kesemuanya merupakan angka floating-point yang besarnya antara 0.0 sampai
1.0. Parameter tersebut merupakan komponen merah, hijau dan biru dari warna yang akan
dihasilkan. Sehingga mengisi dengan 0.0 secara keseluruhan akan menghasilkan warna hitam,
mengisi 1.0 keseluruhan akan menghasilkan warna putih, dan 0.5 akan menghasilkan warna abu-
abu. Kombinasi delapan warna dari perintah glColor() adalah:
glColor(0.0, 0.0, 0.0); hitam
glColor(0.0, 0.0, 1.0); biru
glColor(0.0, 1.0, 0.0); hijau
glColor(0.0, 1.0, 1.0); cyan
glColor(1.0, 0.0, 0.0); merah
glColor(1.0, 0.0, 1.0); magenta
glColor(1.0, 1.0, 0.0); kuning
glColor(1.0, 1.0, 1.0); putih
4.2. Menggambar titik, garis, dan poligon
Sebuah titik direpresentasikan oleh himpunan angka floating-point yang
dinamakan vertex. Pada OpenGL vertex tersebut kesemuanya dianggap tiga
dimensi. Jika ditentukan oleh user sebagai vertex dua dimensi (hanya koordinat x
dan y) maka koordinat z akan dianggap nol oleh OpenGL. OpenGL bekerja
dalam koordinat homogen tiga dimensi sehingga untuk kalkulasi internal seluruh
vertex direpresentasikan dalam 4 koordinat floating-point (x, y, z, w). Jika w tidak
nol,
Dalam OpenGL, garis berarti segmen garis, bukan versi matematika yang dapat
diperpanjang sampai dengan tak terbatas pada kedua arahnya. Terdapat cara yang
mudah untuk membentuk gabungan dari beberapa segmen garis yang terhubung, baik
terbuka maupun tertutup. Suatu garis yang terdiri dari beberapa segmen garis yang
terhubung ditentukan oleh vertex-vertex dari titik tepi segmen garis tersebut.
Gambar 4-1. Segmen garis yang terhubung secara berurutan
Poligon adalah daerah tertutup yang dibentuk oleh beberapa segmen
garis. Secara umum, poligon bisa menjadi sangat kompleks, sehingga OpenGL
membuat beberapa batasan untuk pembentukan poligon primitif. Pertama, tepi
dari poligon tidak boleh berpotongan. Kedua, poligon harus berbesifat convex
(cembung), jadi tidak mempunyai lekukan. Untuk banyak aplikasi, kita akan
membutuhkan poligon nonconvex, poligon dengan lubang di dalamnya, atau
poligon-poligon rumit yang lain. Karena selurruh poligon tersebut dapat dibentuk
oleh gabungan poligon-poligon sederhana, rutin-rutin untuk membentuk obyek
yang rumit disediakan dalam GLU.
Gambar 4-2. Poligon valid dan invalid
Karena persegi panjang merupakan bangun yang sangat umum dalam
aplikasi grafik, OpenGL menyediakan perintah khusus untuk menggambar
persegi panjang yang terisi, yaitu glRect*(). Sebenarnya kita dapat menggambar
persegi panjang sebagai suatu poligon, tetapi akan lebih optimal jika kita
menggunakan glRect*(). Untuk menggambar persegi panjang kita memasukkan
titik-titik sudutnya (x1,y1) dan (x2,y2) sebagai parameter.
4.2.1. Pembentukan vertex
Dengan OpenGL, seluruh obyek geometrik digambarkan sebagai
himpunan dari vertex-vertex. Kita akan menggunakan perintah glVertex*() untuk
menentukan suatu vertex. Beberapa contoh penggunaan glVertex*() adalah:
glVertex2s(2, 3);
glVertex3d(0.0, 0.0, 3.1415926535898);
glVertex4f(2.3, 1.0, -2.2, 2.0);
GLdouble dvect[3] = {5.0, 9.0, 1992.0};
GLdouble dvect[3] = {5.0, 9.0, 1992.0};
glVertex3dv(dvect);
Contoh pertama memperlihatkan sebuah vertex koordinat tiga dimensi (2,
3, 0) (ingat bahwa jika tidak ditentukan, koordinat z akan dianggap nol).
Koordinat pada contoh kedua adalah (0.0, 0.0, 3.1415926535898) (angka
dengan tipe double). Contoh ketiga menunjukkan titik dengan koordinat tiga
dimensi (1.15, 0.5, -1.1) (intgat bahwa koordinat x, y dan z selalu dibagi dengan
koordinat w). Pada contoh terakhir, dvect adalah pointer yang menunjuk sebuah
array dari tiga angka dengan tipe double.
4.2.2. Penggambaran primitif geometrik
Sekarang kita telah mengetahui bagaimana membentuk vertex, tetapi kita juga
harus tahu bagaimana OpenGL membentuk himpunan titik-titik, sebuah garis atau sebuah
poligon dari vertex-vertex tersebut. Untuk melakukannya kita harus memberi batas tiap-
tiap himpunan vertex tersebut dengan perintah glBegin() dan glEnd(). Argumen yang
diisikan pada glBegin() menentukan bangun geometrik yang akan dibentuk oleh vertex-
vertex tersebut. Contoh:
glBegin(GL_POLYGON);
glVertex2f(0.0, 0.0);
glVertex2f(0.0, 3.0);
glVertex2f(3.0, 3.0);
glVertex2f(4.0, 1.5);
glVertex2f(3.0, 0.0);
glEnd();
Gambar 4-3. Poligon dan himpunan titik-titik
Jika kita menggunakan GL_POINTS, hasilnya adalah tampak pada gambar 4-3
(kanan). Argumen yang bisa dimasukkan pada perintah glBegin() ditunjukkan pada tabel
di bawah ini:
Nilai Keterangan
GL_POINTS Menggambar titik dari n vertex
GL_LINES Menggambar segmen garis berurutan secara terpisah.
Jika vertex berjumlah ganjil, maka segmen terakhir tidak
dihiraukan.
GL_LINE_STRI
P
Menggambar segmen garis dari vertex 1 ke vertex 2,
dari vertex 2 ke vertex 3, dst. Jadi ada n-1 segmen garis.
GL_LINE_LOO
P
Sama dengan GL_LINE_STRIP hanya saja vertex
terakhir dihubungkan denga vertex 1 sehingga membentuk loop.
GL_POLYGON Menggambar poligon dari n vertex (n>2).
GL_TRIANGLE
S
Menggambar segitiga (poligon tiga sisi) berurutan. Jika
jumlah vertex bukan merupan kelipatan 3 maka dua atau satu
vertex terakhir tidak dihiraukan.
GL_TRIANGLE
_STRIP
Menggambar serangkaian segitiga (poligon tiga sisi)
menggunakan vertex 0, vertex 1, vertex2, kemudian vertex 2,
vertex 1, vertex 3, kemudian vertex 2, vertex 3, vertex 4 dan
seterusnya
GL_TRIANGLE
_FAN
Sama dengan triangle strip hanya saja vertexnya adalah
0, 1, 2, lalu 0, 2, 3, lalu 0, 3, 4 dan seterusnya.
GL_QUADS Menggambar poligon empat sisi secara berurutan. Jika
jumlah vertex bukan merupakan kelipatan 4 maka tiga, dua atau
satu vertex terakhir tidak dihiraukan.
GL_QUAD_STR
IP
Menggambar serangkaian poligon empat sisi dimulai
dari vertex 0, 1, 3, 2, kemudian vertex 2, 3, 5, 4, lalu vertex 4, 5,
7, 6 dan seterusnya.
Tabel bangun geometrik sederhana
Gambar 4-4 Memperlihatkan contoh-contoh bangun geometrik yang ada pada
tabel di atas.
Gambar 4-4. Bangun geometri sederhana
Selain dengan glVertex*(), ada beberapa perintah yang bisa dimasukkan di antara
perintah glBegin() dan glEnd(). Perintah-perintah tersebut seperti yang diperlihatkan oleh
tabel di bawah ini:
Perintah Keterangan
GlVertex*() Mengeset koordinat vertex
GlColor*() Mengeset warna yang aktif
GlIndex*() Mengeset indeks warna yang aktif
GlNormal*() Mengeset koordinat vektor normal
GlEvalCoord*() Membuat koordinat
GlCallList(),glCa
llLists()
Mengeksekusi display list
GlTexCoord*() Mengeset koordinat tekstur
GlEdgeFlag*() Mengontrol penggambaran tepi
GlMaterial*() Mengeset properti material
Tabel perintah-perintah antara glBegin() dan glEnd()
4.3. Menampilkan titik, garis, dan poligon
4.3.1. Titik
Untuk mengontrol ukuran dari titik, gunakan perintah glPointSize() dan isikan
ukuran piksel sebagai argumen.
void glPointSize(GLfloat size);
Size harus lebih besar dari 0.0, defaultnya adalah 1.0.
Piksel-piksel pada layar yang digambar untuk berbagai macam ukuran
titik tergantung pada bagaimana antialiasing diset (antialiasing adalah teknik
untuk menghaluskan titik maupun garis yang mereka bentuk). Jika antialiasing
diset disable (default), maka ukuran dibulatkan dalam integer dan layar yang
dibatasi oleh bujursangkar dari piksel digambar. Jadi jika ukurannya 1.0 maka
bujursangkarnya satu piksel kali satu piksel, jika ukurannya 2.0 maka
bujursangkarnya dua piksel kali dua piksel, dan seterusnya.
Jika antialiasing diset enable, himpunan piksel berbentuk bundar
digambar dimana piksel-piksel yang terletak di tepi digambar dengan intensitas
yang lebih kecil. Hal itu bertujuan untuk memperhalus tampilan bagian tepi.
Sebagian besar implementasi OpenGL mendukung ukuran titik yang sangat besar. Pada
implementasi khusus, ukuran titik non-antialiasing mungkin dibatasi sebesar ukuran
maksimum titik antialiasing, dibulatkan ke integer terdekat. Kita bisa memperolehnya dengan
menggunakan GL_POINT_SIZE_RANGE pada perintah glGetFloatv().
4.3.2. Garis
Dengan OpenGL kita dapat menentukan garis dengan berbagai macam ukuran dan digambar
dalam berbagai macam cara, dengan titik-titik, garis-garis maupun campuran antara titik-titik
dan garis-garis.
void glLineWidth(Glfloat width);
Width harus lebih besar dari 0.0, defaultnya adalah 1.0.
Penggambaran garis, seperti pada titik, dipengaruhi oleh bagaimana
antialiasing diset. Tanpa antialiasing, ukuran 1, 2 atau 3 akan digambar selebar
1, 2 atau 3 piksel. Jika antialiasing diset enable, memungkinkan ukuran lebar
garis dalam bentuk nonintegral, dan piksel-piksel pada bagian tepi digambar
dengan intensitas lebih kecil.
Sama dengan pada ukuran titik, pada implementasi khusus, ukuran titik non-antialiasing
mungkin dibatasi sebesar ukuran maksimum titik antialiasing, dibulatkan ke integer terdekat.
Kita bisa memperolehnya dengan menggunakan GL_LINE_WIDTH_RANGE pada perintah
glGetFloatv().
Untuk menggambarkan garis dalam titik-titik atau garis putus-putus gunakan perintah
glLineStipple() untuk mendefinisikan pola penggambaran garis tersebut dan kemudian kita
bisa mengaktifkan (meng-enable) dengan glEnable().
void glLineStipple(Glint factor, Glushort pattern);
Perintah tersebut mengeset pola penggambaran garis. Argumen pattern adalah rangkaian 0 dan
atau 1 sebanyak 16 bit. Nilai 1 menunjukkan penggambaran terjadi dan nilai 0 sebaliknya.
Pola bisa diperbesar dengan factor yang mengalikan tiap-tiap sub-rangkaian.
Gambar 4-5. Pola penggambaran garis
Dengan pola 0x3F07 (yang jika dirubah dalam biner menjadi 0011111100000111), garis akan
digambar dengan cara sebagai berikut: 3 piksel digambar, kemudian 5 piksel tidak, 6 piksel
digambar dan 2 piksel tidak (bit rendah digunakan terlebih dahulu). Pola tersebut bisa
diperbesar dengan menggunakan factor, sehingga jika contoh di atas menggunakan factor 2,
maka polanya menjadi: 6 piksel digambar, 10 piksel tidak, 12 piksel digambar dan 4 piksel
tidak.
4.3.3. Poligon
Poligon biasanya digambar dengan cara mengisi seluruh piksel yang tertutup dalam suatu
batas. Tetapi kita juga bisa menggambarnya sebagai poligon outline atau sebagai titik-titik
pada vertex-vertex. Sebuah poligon terisi mungkin terisi dengan solid (padat) atau digambar
dengan pola tertentu.
Sebuah poligon mempunyai dua sisi, yaitu depan dan belakang, dan
mungkin dibangkitkan dengan cara berbeda tergantung sisi mana yang
menghadap lensa. Defaultnya kedua permukaan digambar dengan cara yang
sama. Untuk merubahnya, atau menggambar hanya outline atau vertex, gunakan
perintah glPolygonMode().
Perintah tersebut mengontrol mode penggambaran dari permukaan
depan dan belakang suatu poligon. Parameter face dapat diisi dengan
GL_FRONT, GL_BACK atau GL_FRONT_AND_BACK. Sedangkan parameter
mode dapat diisi GL_POINT, GL_LINE atau GL_FILL. Defaultnya kedua
permukaan digambar terisi.
Secara default, poligon digambar dengan pola yang solid, tetapi juga bisa
diisi dengan pola tertentu dengan perintah glPolygonStipple().
Perintah tersebut mendefinisikan pola penggambaran untuk poligon terisi. Argumen mask
adalah pointer untuk bitmap 32x32 yang diterjemahkan sebagai 0 dan 1. Jika nilainya 1 maka
piksel yang bersesuaian pada poligon digambar, sedangkan jika 0 tidak.
4.4. Vektor normal
Sebuah vektor normal (atau singkatnya normal) adalah vektor dari suatu
titik dengan arah tegak lurus dari permukaan. Untuk permukaan yang datar, satu
arah cukup untuk mewakili setiap titik di seluruh permukaan. Tetapi untuk
permukaan yang berbentuk kurva, arah normal mungkin berbeda untuk tiap-tiap
titik. Dengan OpenGL kita dapat menentukan sebuah normal untuk tiap-tiap
vertex. Beberapa vertex mungkin mempunyai normal yang sama, tetapi kita tidak
bisa menetapkan normal selain pada vertex yang bersangkutan.
Normal dari suatu obyek menentukan arah dari permukaan terhadap
ruang, khususnya arah relatif terhadap sumber cahaya. Vektor ini digunakan oleh
OpenGL untuk menentukan berapa banyak cahaya yang diterima obyek pada
tiap-tiap vetexnya.
Gunakan perintah glNormal*() untuk mengeset normal dari nilai yang
diberikan pada argumennya. Jika kita memanggil perintah glVertex*() setelah
perintah glNormal*() akan membentuk vertex seperti yang diberikan pada normal.
Sering, tiap-tiap vertex mempunyai normal yang berbeda sehingga
mengharuskan pemanggilan serangkaian perintah seperti di bawah ini:
glBegin(GL_POLYGON);
glNormal3fv(n0);
glVertex3fv(v0);
glNormal3fv(n1);
glVertex3fv(v1);
glNormal3fv(n2);
glVertex3fv(v2);
glNormal3fv(n3);
glVertex3fv(v3);
glEnd();
void glNormal3{b s i d f}(TYPEnx, TYPEny, TYPEnx);
void glNormal3{b s i d f}v(const TYPE *v);
Versi non-vektor (tanpa v) memerlukan 3 argumen yang menentukan
sebuah vektor (nx, ny, nz) untuk dijadikan bentuk normal. sebagai alternatif, kita
bisa menggukanan versi vektor (dengan v) dan memberikan sebuah array 3
elemen untuk menentukan normal yang diinginkan.
TEKNIK VIEWING PADA OPENGL
5.1. Perintah-perintah umum pada OpenGL
Pada bagian ini kita membahas beberapa perintah OpenGL yang berguna untuk
menentukan transformasi yang kita inginkan. Pertama kali kita harus menentukan matrik
yang hendak kita modifikasi, apakah matrik modelview ataukah matrik proyeksi. Kita
melakukannya dengan perintah glMatrixMode().
void glMatixMode(Glenum mode);
Perintah di atas digunakan untuk menentukan matrik yang akan
dimodifikasi, apakah matrik modelview, proyeksi ataukah matrik tekstur sesuai
dengan nilai yang dimasukkan sebagai argumen, yaitu GL_MODELVIEW, atau
GL_PROJECTION GL_TEXTURE.
Gunakan perintah glLoadIdentity() untuk meng-clear matrik yang sedang
aktif. Biasanya kita memanggilnya sebelum menentukan transformasi proyeksi
atau viewing, tetapi mungkin juga kita memanggilnya sebelum menentukan
transformasi modeling.
void glLoadIdentity(void);
Perintah tersebut mengubah matrik yang sedang aktif menjadi matrik
identitas 4x4. Jika kita menginginkan untuk menentukan suatu matrik tertentu
untuk menjadi matrik yang sedang aktif, gunakan perintah glLoadMatrix*().
Gunakan pula perintah glMultMatrix*() untuk mengalikan matrik yang sedang aktif
dengan matrik yang dipassingkan sebagai argumen. Argumen dari kedua
perintah tersebut adalah vektor dengan 16 nilai (m1, m2, …, m16).
void glLoadMatrix{f d}(const TYPE *m);
Perintah tersebut mengeset 16 nilai dari matrik yang sedang aktif dengan
nilai yang ditunjukkan oleh m.
void glLoadMatrix{f d}(const TYPE *m);
Perintah tersebut mengalikan 16 nilai yang ditunjukkan oleh m dengan
matrik yang sedang aktif dan hasilnya disimpan pada matrik yang sedang aktif.
5.2. Transformasi modeling
Transformasi modeling adalah transformasi untuk menentukan posisi dan orientasi dari
sebuah model. Sebagai contoh kita dapat malakukan rotasi, translasi, scaling atau gabungan dari
ketiganya.
Tiga rutin OpenGL untuk transformasi modeling adalah glTranslate*(), glRotate*() dan
glScale*(). Rutin-rutin tersebut mentransformasikan sebuah obyek dengan jalan menggeser,
memutar, membesarkan ataupun mengecilkan obyek tersebut. Perintah-perintah tersebut sama
dengan jika kita membuat sebuah matrik translasi, rotasi maupum matrik scaling dan kemudian
memanggil perintah glMultMatrix*() dengan matrik tersebut sebagai argumen.
Gambar 5-1. Proses mentranslasikan obyek
glTranslate{f d}(TYPEx, TYPEy, TYPEz);
Perintah tersebut mengalikan matrik yang sedang aktif dengan sebuah matrik yang
mentranslasikan obyek berdasarkan nilai x, y, z yang diberikan.
Gambar 5-2. Proses merotasikan obyek
glRotate{f d}(TYPEangle, TYPEx, TYPEy, TYPEz);
Perintah tersebut mengalikan matrik yang sedang aktif dengan sebuah matrik yang
merotasikan obyek dengan arah yang berlawanan dengan arah jarum jam. Angle menyatakan sudut
dari rotasi tersebut.
Gambar 5-3. Proses merefleksikan dan scaling terhadap obyek
glScale{f d}(TYPEx, TYPEy, TYPEz);
Perintah tersebut mengalikan matrik yang sedang aktif dengan matrik sebuah yang
memperbesar, memperkecil atau merefleksikan obyek. Masing-masing koordinat x, y, z dari setiap
titik pada obyek dikalikan dengan argumen x, y, z. Perintah glScale*() merupakan satu-satunya
perintah transformasi modeling yang merubah ukuran dari obyek. Jika nilai yang dimasukkan lebih
dari 1.0 maka obyek akan diperbesar, jika nilainya kurang dari 1.0 maka obyek akan diperkecil
dan jika nilainya negatif maka obyek akan direfleksikan (dicerminkan).
Berikut ini sebuah contoh dari penggunaan perintah-perintah dari transformasi modeling:
Gambar 5-4. Contoh proses transformasi modeling
glLoadIdentity();
glColor3f(1.0, 1.0, 1.0);
draw_triangle();
glEnable(GL_LINE_STIPPLE);
glLineStipple(1, 0xF0F0);
glLoadIdentity();
glTranslate(-20.0, 0.0, 0.0);
draw_triangle();
glLineStipple(1, 0xF00F);
glLoadIdentity();
glScale(1.5, 0.5, 1.0);
draw_triangle();
glLineStipple(1, 0x8888);
glLoadIdentity();
glRotate(90.0, 0.0, 0.0, 1.0);
draw_triangle();
glDisable(GL_LINE_STIPPLE);
5.3. Transformasi viewing
Memanggil transformasi viewing dapat dianalogikan dengan
mendefinisikan dan meletakkan kamera pada posisinya. Sebelum mendefinisikan
transformasi viewing perlu untuk mengeset matrik yang sedang aktif dengan
memanggil perintah glLoadIdentity(). Langkah ini diperlukan mengingat hampir
semua perintah transformasi melakukan perkalian matrik yang sedang aktif
dengan suatu matrik dan hasil perkalian tersebut dijadikan matrik yang sedang
aktif. Jika matrik tersebut tidak di-clear maka kita akan melakukan operasi matrik
yang baru pada matrik sebelumnya.
Kita dapat menyelesaikan transformasi viewing dengan beberapa jalan,
seperti yang dijelaskan di bawah ini. Kita juga dapat memilih untuk menggunakan
letak dan orientasi default dari titik pandang, yang terletak di pusat koordinat dan
memandang ke arah sumbu z negatif.
- Gunakan salah satu dari perintah transformasi modeling (glTranslate*() atau
glRotate*()). Kita dapat membayangkan pengaruh dari transformasi ini
seperti menggerakkan posisi kamera.
- Gunakan rutin Utility Library gluLookAt() untuk mendefinisikan garis
pandang. Rutin ini mengandung perintah untuk rotasi dan translasi.
- Buat rutin sendiri yang mengandung perintah rotasi dan translasi.
Beberapa aplikasi mungkin membutuhkan rutin tersendiri yang
memungkinkan kita untuk menentukan transformasi viewing yang
sesuai.
Kita bisa menggeser titik pandang ke belakang (menjauhi obyek) yang sama
artinya dengan menggeser obyek ke depan (menjauhi titik pandang). Kita ingat bahwa
default dari depan adalah sumbu z negatif. Jika kita memutar titik pandang, maka depan
akan mempunyai arti yang berbeda. Jadi untuk membuat jarak 5 unit antara obyek dan
titik pandang dengan menggeser titik pandang adalah sebagai berikut:
glTranslate(0.0, 0.0, -5.0);
Gambar 5-5. Membuat jarak antara titik pandang dan obyek
Seringkali programmer membentuk scene di sekitar pusat sistem
koordinat atau di lokasi lain yang sesuai, kemudian mereka ingin melihatnya dari
titik yang berubah-ubah untuk mendapatkan hasil yang sesuai. Seperti namanya
rutin gluLookAt() dirancang untuk tujuan tersebut. Rutin tersebut memerlukan 3
set argumen yang menentukan letak titik pandang, mendefinisikan titik referensi
terhadap arah dari kamera dan menunjukkan dimana arah atas.
void gluLookAt(GLdouble eyex, GLdouble eyey,
GLdouble eyez, GLdouble centerx, GLdouble centery,
GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz)
Perintah tersebut mendefinisikan matrik viewing dan mengalikannya
dengan matrik yang sedang aktif. Titik pandang yang diinginkan ditentukan oleh
eyex, eyey dan eyez. Argumen centerx, centery dan centerz menyatakan
sembarang titik sepanjang garis pandang tetapi biasanya ada beberapa titik di
tengah scene terlihat. Argumen upx, upy dan upz menunjukkan dimana arah
atas.
5.4. Transformasi proyeksi
Transformasi proyeksi menentukan bagaimana suatu obyek
diproyeksikan pada layar. Ada dua macam proyeksi yang ada pada OpenGL
yaitu perspektif dan ortografik.
5.3.1. Proyeksi perspektif
Proyeksi perspektif adalah seperti cara kita memandang sesuatu pada kehidupan sehari-
hari. Proyeksi perspektif membuat obyek yang jauh akan kelihatan kecil, sebagai contoh ruas jalan
semakin jauh akan tampak semakin menyempit. Jika kita ingin membuat gambar yang tampak
nyata, maka kita harus memilih proyeksi perspektif ini. Metode ini banyak digunakan untuk
aplikasi animasi dan computer aided design (CAD).
Gambar 5-6. Volome viewing pada proyeksi perspektif dengan glFrustum()
Perintah glFrustum() menghitung matrik yang mengerjakan proyeksi perspektif dan
mengalikannya dengan matrik yang sedang aktif. Selengkapnya adalah:
void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble
top, GLdouble near, GLdouble far);
Perintah tersebut membentuk sebuah matrik perspektif dan mengalikannya dengan matrik
yang sedang aktif. Volume viewing didefinisiskan oleh parameter (left, bottom, -near) dan (right,
top, -near) menentukan koordinat (x, y, z) dari sudut kiri bawah dan kanan atas dari clipping plane
yang dekat. Near dan far menunjukkan jarak dari titik pandang ke clipping plane yang dekat dan
jauh.
Meskipun secara konsep mudah dipahami, glFrustum() tidak sering digunakan. Sebagai
penggantinya, gunakan rutin dari Utility Library yaitu gluPerspective(). Rutin ini membentuk
volume viewing yang sama dengan yang dibentuk oleh glFrustum() tetapi dengan cara lain.
Selengkapnya adalah:
Gambar 5-7. Volume viewing pada proyeksi perspektif dengan gluPerspective()
gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble
zFar);
Perintah tersebut membentuk sebuah matrik perspektif dan mengalikannya dengan matrik
yang sedang aktif. Argumen fovy adalah sudut dari bidang pandang, nilainya antara 0.0 sampai
dengan 180.0. Aspect adalah perbandingan antara lebar dan tinggi. Nilai zNear dan zFar adalah
jarak antara titik pandang dan clipping plane sepanjang sumbu z negatif.
5.3.2. Proyeksi ortografik
Proyeksi ortografik menampilkan obyek pada layar tanpa dipengaruhi oleh
ukuran relatif dari obyek tersebut. Proyeksi ortografik digunakan pada aplikasi arsitektur
dan computer aided design. Perintah selengkapnya adalah sebagai berikut:
Gambar 5-8. Volume viewing pada proyeksi ortografik
void glOrtho(GLdouble left, GLdouble right, GLdouble bottom,
GLdouble top, GLdouble near, GLdouble far);
Perintah tersebut membentuk matrik volume viewing ortografik dan
mengalikannya dengan matrik yang sedang aktif. Clipping plane dekat adalah segiempat
dengan sudut kiri bawah pada (left, bottom -near) dan sudut kanan atas pada (right, top, -
near). Sedangkan clipping plane jauh juga merupakan segiempat dengan sudut kiri bawah
pada (left, bottom -far) dan sudut kanan atas pada (right, top, -far).
5.5. Transformasi viewport
Kalau dianalogikan dengan kamera, transformasi viewport dapat disamakan
dengan bagian dimana ukuran dari foto ditentukan. Apakah kita menginginkan foto
seukuran dompet ataukah seukuran poster. Karena di komputer, viewport adalah daerah
persegi panjang pada window dimana gambar dibangkitkan.
Gambar 5-9. Segiempat viewport
Gambar 5-9 menunjukkan sebuah viewport yang menempati sebagian
besar layar. Viewport diukur dalam koordinat window yang merefleksikan posisi
pixel pada layar relatif terhadap sudut kiri bawah dari window. Default dari
viewport adalah diset pada seluruh pixel dari window yang dibuka.
Gambar 5-10. Mapping volume viewing pada viewport
void glViewport(Glint x, Glint y, Glsizei width, Glsizei height);
Perintah tersebut mendefinisikan piksel pada window dimana image
dipetakan. Parameter x dan y menentukan sudut kiri bawah viewport, sedangkan
width dan height merupakan ukuran viewport.
5.6. Clipping plane tambahan
Disamping enam clipping plane dari volume viewing (kiri, kanan, atas, bawah,
jauh, dekat) kita dapat mendefinisikan sampai dengan enam clipping plane tambahan
untuk membatasi lebih jauh volume viewing, seperti yang ditunjukkan pada gambar 5-11.
Hal ini berguna untuk menghilangkan sebagian dari obyek dalam scene. Sebagai contoh
jika kita ingin menampilkan potongan dari suatu obyek.
Gambar 5-11. Clipping plane tambahan
Masing-masing plane dibentuk oleh koefisien dari persamaan
Ax+By+Cz+D=0. Clipping plane secara otomatis ditransformasi dengan
transformasi modeling dan viewing.
void glClipPlane(Glenum plane, const GLdouble *equation);
Perintah tersebut membentuk clipping plane. Argumen equation
merupakan 4 titik koefisien dari persamaan Ax+By+Cz+D=0. Sedangkan
argumen plane adalah GL_CLIP_PLANEi dimana i adalah integer antara 0
sampai 5 untuk menentukan clipping plane yang didefinisikan.
Kita harus mengaktifkan (meng-enable) clipping plane tambahan yang
telah kita definisikan dengan perintah glEnable(GL_CLIP_PLANEi) dan men-
disable dengan perintah glDisable(GL_CLIP_PLANEi). Beberapa implementasi
mungkin memperbolehkan lebih dari 6 clipping plane. Kita dapat menggunakan
glGetIntegerv() dengan GL_MAX_CLIP_PLANES untuk mengetahui berapa
banyak clipping plane yang diperbolehkan.
Berikut ini sebuah contoh implementasi dari clipping plane, yaitu
wireframe dari sebuah sphere:
Gambar 5-12. Potongan dari wireframe sphere
void display(void)
{
GLdouble eqn = {0.0, 1.0, 0.0, 0.0};
GLdouble eqn2 = {1.0, 0.0, 0.0, 0.0};
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glPushmatrix();
glTranslatef(0.0, 0.0, -5.0);
glClipPlane(GL_CLIP_PLANE0, eqn);
glEnable(GL_CLIP_PLANE0);
glClipPlane(GL_CLIP_PLANE1, eqn2);
glEnable(GL_CLIP_PLANE1);
glRotatef(90.0, 1.0, 0.0, 0.0);
auxWireSphere(1.0);
glPopMatrix();
glFlush();
}
void myinit(void)
{
glShadeModel(GL_FLAT);
}
void myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 1.0, 2.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv)
{
auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);
auxInitPosition(0, 0, 500, 500);
auxInitWindow(argv[0]);
myinit();
auxReshapeFunc(myReshape);
auxMainLoop(display);
}
5.7. Transformasi komposisi
Bagian ini memperlihatkan bagaimana menggabungkan beberapa transformasi
untuk mencapai hasil yang diinginkan. Contohnya adalah suatu sistem tata surya dimana
obyek berotasi dan berevolusi. Program ini terdiri dari planet dan matahari yang digambar
dengan rutin sphere (auxSphere()). Untuk menulisnya kita memerlukan glRotate*() untuk
revolusi dan rotasi serta glTranslate*() untuk menggeser planet pada orbitnya.
Untuk menggambar sistem tata surya tersebut, pertama kali kita harus
mengeset transormasi proyeksi dan viewing. Untuk contoh ini digunakan
gluPerspective() dan gluLookAt().
Gambar 5-13. Planet dan matahari
static int year = 0, day = 0;
void dayAdd(void)
{
day = (day + 10) % 360;
}
void daySubstract(void)
{
day = (day - 10) % 360;
}
void yearAdd(void)
{
year = (year + 5) % 360;
}
void yearSubstract(void)
{
year = (year - 5) % 360;
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glPushMatrix();
auxWireSphere(1.0);
glRotatef((GLfloat) day, 0.0, 1.0, 0.0);
glTranslatef(2.0, 0.0, 0.0);
glRotatef((GLfloat) year, 0.0, 1.0, 0.0);
auxWireSphere(0.2);
glPopMatrix();
glFlush();
}
void myinit(void)
{
glShadeModel(GL_FLAT);
}
void myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 1.0, 2.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -5.0);
}
int main(int argc, char** argv)
{
auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);
auxInitPosition(0, 0, 500, 500);
auxInitWindow(argv[0]);
myinit();
auxKeyFunc(AUX_LEFT, yearAdd);
auxKeyFunc(AUX_RIGHT, yearSubstract);
auxKeyFunc(AUX_UP, dayAdd);
auxKeyFunc(AUX_DOWN, daySubstract);
auxReshapeFunc(myReshape);
auxMainLoop(display);
}
PEWARNAAN PADA OPENGL
6.1. Persepsi warna
Secara fisik, cahaya adalah susunan dari foton, partikel kecil dari cahaya yang melintas
pada jalurnya serta bergetar pada frekuensinya masing-masing. Karakteristik dari foton dibentuk
oleh posisi, arah dan frekuensi/panjang gelombang/energinya. Foton dengan panjang gelombang
antara 390 nm sampai dengan 720 nm merupakan spektrum yang terlihat, membentuk warna
pelangi. Bagaimanapun juga, mata kita merasakan banyak warna yang tidak berada dalam pelangi,
seperti putih, hitam, coklat, pink dan lain-lain. Bagaimana hal tersebut dapat terjadi?
Apa yang dilihat oleh mata kita sebenarnya adalah campuran dari foton dengan frekuensi yang
berbeda-beda. Sumber cahaya ditentukan oleh distribusi dari frekuensi foton yang mereka
pancarkan. Cahaya putih ideal terdiri dari cahaya-cahaya dari seluruh frekuensi dengan jumlah
yang sama.
Mata manusia merasakan warna ketika sel-sel pada retina yang bernama
cone tereksitasi setelah “ditembak” oleh foton. Tiga macam sel cone memberi
respon yang terbaik untuk tiga cahaya dengan panjang gelombang yang
berbeda, yaitu merah, hijau dan biru (orang yang menderita buta warna biasanya
kehilangan salah satu tipe dari sell cone di atas). Ketika campuran foton
memasuki mata, sel cone dalam retina mencatat derajat dari eksitasi
berdasarkan tipe masing-masing, dan jika campuran foton yang berbeda datang
sehingga menyebabkan eksitasi tiga tipe dari sel cone pada derajat yang sama,
warna tersebut tidak dapat dibedakan dari campuran yang pertama.
Karena masing-masing warna dicatat oleh mata sebagai level eksitasi
dari sel cone oleh foton yang datang, mata dapat merasakan warna yang tidak
berada dalam spektrum yang dihasilkan oleh prisma atau pelangi. Sebagai
contoh jika campuran dari foton merah dan biru dikirim sehingga sel cone merah
dan biru dalam retina tereksitasi, mata akan melihatnya sebagai magenta, yang
tidak ada dalam spektrum warna.
Monitor komputer mengemulasikan warna oleh partikel cahaya dengan
kombinasi cahaya RGB sesuai dengan proporsi sel cone dalam retina yang
tereksitasi. Hal itu dilakukan dengan melihat level eksitasi yang dihasilkan oleh
campuran foton yang dicoba untuk diemulasikan. Untuk menampilkan warna
tersebut, monitor mrngirimkan sejumlah cahaya RGB untuk merangsang sel cone
dalam mata kita. Monitor warna dapat mengirim proporsi RGB yang berbeda
pada tiap-tiap piksel dan mata akan melihat jutaan cahaya dengan warnanya
masing-masing.
6.2. Mode RGBA versus mode indeks warna
Pada layar komputer, hardware menyebabkan di setiap piksel dari layar
tersebut dipancarkan cahaya RGB dalam jumlah yang berbeda-beda, yang
disebut nilai RGB. Nilai ini biasanya dipaket bersama (kadang-kadang dengan
nilai keempat yang disebut dengan Alpha (A)), dan nilai dari paket tersebut
disebut dengan nilai RGB (atau RGBA). Informasi warna dari tiap-tiap piksel
dapat disimpan dalam mode RGBA, dimana nilaii RGBA disimpan untuk tiap-tiap
piksel, atau dengan mode indeks warna, dimana sebuah nilai (disebut indeks
warna) disimpan untuk tiap-tiap piksel. Setiap indeks warna ditunjukkan oleh
suatu nilai dalam tabel yang mendefinisikan nilai-nilai RGB. Tabel tersebut
disebut dengan peta warna.
Pada mode indeks warna atau RGB, suatu nilai tertentu dari data warna
disimpan pada tiap-tiap piksel. Nilai ini ditentukan oleh jumlah bitplane dalam
framebuffer. Sebuah bitplane berisi 1 bit dari data untuk tiap-tiap piksel. Jika ada
8 bitplane warna, maka terdapat 8 bit warna setiap piksel sehingga ada 2
8
= 256
warna berbeda yang bisa disimpan pada piksel.
Bitplane sering dibagi untuk menyimpan komponen RGB sehingga sistem
24 bitplane menyediakan 8 bit masing-masing untuk RGB, akan tetapi hal ini
tidak selalu benar. Untuk mengetahui jumlah bitplane yang tersedia dalam
sistem, kita bisa menggunakan perintah glGetIntegerv() dengan GL_RED_BITS,
GL_GREEN_BITS, GL_BLUE_BITS, dan GL_ALPHA_BITS sebagai parameter.
6.2.1. Mode RGBA
Pada mode RGBA, hardware menyimpan jumlah bitplane untuk tiap-tiap komponen RGBA.
Nilai RGBA disimpan sebagai integer dan diskalakan dengan jumlah bit yang tersedia untuk
penyimpanan. Sebagai contoh jika sistem menyediakan 8 bit untuk komponen R, maka integer
antara 0-255 dapat disimpan, sehingga 0, 1, 2, ..., 255 pada bitplane dapat diartikan nilai R
sebesar
0
/
255
= 0.0,
1
/
255
,
2
/
255
, ...,
255
/
255
= 1.0. Tanpa memperhatikan jumlah bitplane, 0.0
menghasilkan intensitas minimum dan 1.0 menghasilkan intensitas maksimum.
Gambar 6-1. Nilai RGB dari bitplane
Jumlah macam warna yang dapat ditampilkan pada tiap-tiap piksel tergantung jumlah bitplane
dan kapasitas dari hardware untuk menginterpretasikan bitplane tersebut. Jumlah warna tidak
dapat melebihi 2
n
, dimana n adalah jumlah bitplane sehingga mesin dengan 24 bitplane untuk
RGB dapat menampilkan lebih dari 16,77 juta macam warna.
6.2.2. Dithering
Beberapa hardware grafik menggunakan dithering untuk meningkatkan jumlah warna yang
dapat ditampilkan dengan mengorbankan resolusi spatial. Dithering adalah teknik untuk
menggunakan beberapa warna untuk membentuk efek warna lain. Untuk menggambarkan
bagaimana proses dithering bekerja, anggaplah sistem kita hanya mempunyai 1 bit masing-
masing untuk RGB. Jadi sistem tersebut hanya bisa menampilkan 8 warna, yaitu hitam, putih,
merah, hijau, biru, kuning, cyan dan magenta. Untuk menampilkan warna pink pada suatu
daerah, hardware dapat mengisi daerah tersebut dengan warna merah dan putih. Karena mata
kita cukup jauh dari layar sehingga tidak dapat membedakan tiap-tiap piksel,daerah tersebut
akan tampak berwarna pink, rata-rata dari warna merah dan putih. Warna pink yang lebih
merah dapat dihasilkan dengan mengisi proporsi piksel yang lebih banyak dengan warna
merah, sedangkan warna pink yang lebih putih dapat dihasilkan dengan mengisi proporsi
piksel lebih banyak dengan warna putih, dan seterusnya.
Dengan cara ini, tidak ada piksel yang berwarna pink. Satu-satunya jalan untuk menghasilkan
efek di atas adalah dilakukan pada suatu daerah yang terdiri dari berbagai piksel. Kita tidak
bisa melakukan proses dithering pada satu piksel saja. Jika kita membentuk suatu nilai RGB
untuk suatu warna yang tidak tersedia dan mengisi suatu poligon, hardware mengisi piksel
yang berada di dalam poligon dengan campuran dari warna-warna terdekat sehingga
menampilkan warna rata-rata untuk mata kita sesuai dengan warna yang kita inginkan.
Gambar 6-2. Dhitering hitam dan putih untuk menghasilkan abu-abu
Dengan 8 bit pada tiap-tiap RGB, kita bisa mendapatkan gambar berkualitas tinggi tanpa
proses dithering. Tapi walaupun mesin kita mempunyai 24 bitplane bukan berarti proses
dithering tidak terjadi. Sebagai contoh, jika kita menggunakan mode double-buffer, bitplane
mungkin dibagi menjadi 2, masing-masing 12 sehingga hanya ada 4 bit pada tiap-tiap
komponen RGB. Tanpa dithering, 4 bit setiap komponen warna akan memberi hasil yang
kurang memuaskan.
6.2.3. Mode indeks warna
Dengan mode indeks warna, OpenGL menggunakan peta warna yang mirip dengan
menggunakan palet untuk mencampur cat pada saat melukis. Palet seorang pelukis
menyediakan tempat untuk mencampur cat, dan mirip dengan hal tesebut, peta warna
menunjukkan dimana nilai RGB dicampur.
Gambar 6-3. Peta warna
Pelukis memilih sebuah warna dari palet warna dan melukis dengan
warna tersebut. Komputer menyimpan indeks warna dalam bitplane untuk tiap-
tiap piksel. Nilai bitplane tersebut menunjuk ke peta warna dan layar akan
diwarnai dengan nilai RGB dari peta warna.
Gambar 6-4. Menggunakan peta warna untuk mewarnai gambar
Pada mode indeks warna, jumlah warna yang tersedia terbatas oleh
ukuran peta warna dan jumlah bitplane yang tersedia. Ukuran peta warna
ditentukan oleh hardware yang digunakan. Biasanya berkisar antara 256(2
8
)
sampai 4096(2
12
). Ukuran peta warna merupakan pangkat dari 2 diindeks oleh
jumlah bitplane yang tersedia pada mode indeks warna. Jika ada 2
n
indeks pada
peta warna dan m bitplane yang tersedia, maka jumlah warna yang bisa
ditampung adalah kurang dari 2
n
dan 2
m
.
Dengan mode RGBA, tiap-tiap warna piksel tidak tergantung piksel lain.
Sedangkan pada mode indeks warna, tiap-tiap piksel dengan indeks yang sama
disimpan pada lokasi yang sama. Jika isi dari peta warna berubah, seluruh piksel
yang berindeks sama akan ikut berubah.
6.2.4. Memilih antara mode RGBA atau mode indeks warna
Kita mungkin lebih baik menggunakan mode indeks warna pada kasus-kasus di bawah ini:
- Jika kita melanjutkan aplikasi yang sudah ada dan menggunakan
mode indeks warna.
- Jika kita hanya mempunyai bitplane dalam jumlah sedikit dan jika kita
hanya perlu warna kurang dari 2
n
.
- Jika kita mempunyai bitplane dalam jumlah terbatas, mode RGBA
mungkin akan menyebabkan proses shading yang kasar, sehingga
lebih baik memilih mode indeks warna.
- Mode indeks warna akan berguna untuk berbagai macam trik, seperti
animasi.
Secara umum gunakanlah mode RGBA, karena memberikan hasil yang lebih baik untuk
texture mapping, lighting, shading, fog, antialiasing dan blending.
6.3. Penggunaan warna pada model shading
6.3.1. Pembentukan warna pada mode RGBA
Pada mode RGBA gunakan perintah glColor*() untuk memilih warna yang akan digunakan.
void glColor3{b s i f d ub us ui}(TYPEr, TYPEg, TYPEb);
void glColor4{b s i f d ub us ui}(TYPEr, TYPEg, TYPEb, TYPEa);
void glColor3{b s i f d ub us ui}v(const TYPE*v);
void glColor4{b s i f d ub us ui}v(const TYPE*v);
Perintah di atas mempunyai 3 macam akhiran yang bervariasi sesuai dengan parameter yang
diterima. Akhiran pertama adalah 3 atau 4, menunjukkan apakah kita memasukkan nilai alpha
disamping nilai RGB. Jika nilai tersebut tidak dimasukkan, otomatis akan diset 1.0. Akhiran
kedua menunjukkan tipe data untuk parameter: byte, short, integer, float, double, unsigned
byte, unsigned short atau unsigned integer. Sedangkan akhiran ketiga adalah optional v yang
menunjukkan argumen tersebut adalah pointer pada suatu array sesuai dengan tipe datanya.
6.3.2. Pembentukan warna pada mode indeks warna
Untuk mode indeks warna gunakan perintah glIndex*() untuk memilih warna yang akan
digunakan:
void glIndex{s i f d}(TYPE c);
void glIndex{s i f d}v(const TYPE *c);
Akhiran pertama dari perintah di atas menunjukkan tipe data dari parameter: short, integer,
float atau double. Akhiran kedua adalah optional v yang menunjukkan bahwa argumen
tersebut adalah nilai dari suatu array sesuai dengan tipe data yang diberikan (array tersebut
hanya berisi 1 nilai).
6.3.3. Pembentukan model shading
Sebuah garis atau poligon terisi dapat digambar dengan satu warna (flat shading) atau
dengan berbagai macam warna (smooth shading). Kita dapat menentukan teknik shading
sesuai dengan yang kita inginkan dengan perintah glShadeModel().
void glShadeModel(GLEnum mode);
Parameter mode dapat diset GL_SMOOTH(default) atau GL_FLAT. Dengan flat shading,
warna dari suatu vertex diduplikat ke seluruh vertex dari obyek tersebut. Sedangkan pada
smooth shading, warna dari tiap-tiap vertex diperlakukan sendiri-sendiri. Untuk sebuah garis,
warna-warna sepanjang segmen garis tersebut ditambahkan pada warna vertex. Sedangkan
pada poligon, warna-warna dari interior poligon tersebut ditambahkan pada warna vertex.
Dengan smooth shading, titik-titik yang berdekatan mempunyai perbedaan nilai warna
yang kecil. Pada mode RGBA hal ini kelihatan mirip sehingga perubahan warna dalam
poligon tampak halus (bertahap sedikit demi sedikit). Pada mode indeks warna titik-titik yang
berdekatan mungkin menunjuk pada lokasi yang berbeda pada tabel indeks warna, yang
mungkin tidak mirip sama sekali.
Untuk mengatasi hal tersebut, kita harus membuat suatu jalur perubahan warna yang
halus diantara indeks-indeks dalam peta warna. Pemetaan warna pada peta warna dibentuk
melalui sistem window. Untuk sementaara anggaplah kita mempunyai rutin auxSetOneColor()
yang melakukan load satu indeks pada peta warna dengan nilai RGB. Argumen pertama dari
rutin ini adalah nilai RGB. Untuk melakukan load 32 indeks warna yang berdekatan (dari
indeks 16 sampai 47) dengan sedikit perubahan dari warna kuning, kita mungkin akan
memanggil rutin auxSetOneColor() sebagai berikut:
for(i=0;i<32;i++) auxSetOneColor(16+i, 1.0*(i/32.0), 1.0*(i/32.0), 0.0);
Dengan flat shading warna dari suatu vertex menentukan warna dari seluruh obyek tersebut.
Untuk segmen garis, warnanya ditentukan oleh warna vertex kedua (vertex akhir).
PEWARNAAN PADA OPENGL
6.4. Persepsi warna
Secara fisik, cahaya adalah susunan dari foton, partikel kecil dari cahaya yang melintas
pada jalurnya serta bergetar pada frekuensinya masing-masing. Karakteristik dari foton dibentuk
oleh posisi, arah dan frekuensi/panjang gelombang/energinya. Foton dengan panjang gelombang
antara 390 nm sampai dengan 720 nm merupakan spektrum yang terlihat, membentuk warna
pelangi. Bagaimanapun juga, mata kita merasakan banyak warna yang tidak berada dalam pelangi,
seperti putih, hitam, coklat, pink dan lain-lain. Bagaimana hal tersebut dapat terjadi?
Apa yang dilihat oleh mata kita sebenarnya adalah campuran dari foton dengan frekuensi yang
berbeda-beda. Sumber cahaya ditentukan oleh distribusi dari frekuensi foton yang mereka
pancarkan. Cahaya putih ideal terdiri dari cahaya-cahaya dari seluruh frekuensi dengan jumlah
yang sama.
Mata manusia merasakan warna ketika sel-sel pada retina yang bernama
cone tereksitasi setelah “ditembak” oleh foton. Tiga macam sel cone memberi
respon yang terbaik untuk tiga cahaya dengan panjang gelombang yang
berbeda, yaitu merah, hijau dan biru (orang yang menderita buta warna biasanya
kehilangan salah satu tipe dari sell cone di atas). Ketika campuran foton
memasuki mata, sel cone dalam retina mencatat derajat dari eksitasi
berdasarkan tipe masing-masing, dan jika campuran foton yang berbeda datang
sehingga menyebabkan eksitasi tiga tipe dari sel cone pada derajat yang sama,
warna tersebut tidak dapat dibedakan dari campuran yang pertama.
Karena masing-masing warna dicatat oleh mata sebagai level eksitasi
dari sel cone oleh foton yang datang, mata dapat merasakan warna yang tidak
berada dalam spektrum yang dihasilkan oleh prisma atau pelangi. Sebagai
contoh jika campuran dari foton merah dan biru dikirim sehingga sel cone merah
dan biru dalam retina tereksitasi, mata akan melihatnya sebagai magenta, yang
tidak ada dalam spektrum warna.
Monitor komputer mengemulasikan warna oleh partikel cahaya dengan
kombinasi cahaya RGB sesuai dengan proporsi sel cone dalam retina yang
tereksitasi. Hal itu dilakukan dengan melihat level eksitasi yang dihasilkan oleh
campuran foton yang dicoba untuk diemulasikan. Untuk menampilkan warna
tersebut, monitor mrngirimkan sejumlah cahaya RGB untuk merangsang sel cone
dalam mata kita. Monitor warna dapat mengirim proporsi RGB yang berbeda
pada tiap-tiap piksel dan mata akan melihat jutaan cahaya dengan warnanya
masing-masing.
6.5. Mode RGBA versus mode indeks warna
Pada layar komputer, hardware menyebabkan di setiap piksel dari layar
tersebut dipancarkan cahaya RGB dalam jumlah yang berbeda-beda, yang
disebut nilai RGB. Nilai ini biasanya dipaket bersama (kadang-kadang dengan
nilai keempat yang disebut dengan Alpha (A)), dan nilai dari paket tersebut
disebut dengan nilai RGB (atau RGBA). Informasi warna dari tiap-tiap piksel
dapat disimpan dalam mode RGBA, dimana nilaii RGBA disimpan untuk tiap-tiap
piksel, atau dengan mode indeks warna, dimana sebuah nilai (disebut indeks
warna) disimpan untuk tiap-tiap piksel. Setiap indeks warna ditunjukkan oleh
suatu nilai dalam tabel yang mendefinisikan nilai-nilai RGB. Tabel tersebut
disebut dengan peta warna.
Pada mode indeks warna atau RGB, suatu nilai tertentu dari data warna
disimpan pada tiap-tiap piksel. Nilai ini ditentukan oleh jumlah bitplane dalam
framebuffer. Sebuah bitplane berisi 1 bit dari data untuk tiap-tiap piksel. Jika ada
8 bitplane warna, maka terdapat 8 bit warna setiap piksel sehingga ada 2
8
= 256
warna berbeda yang bisa disimpan pada piksel.
Bitplane sering dibagi untuk menyimpan komponen RGB sehingga sistem
24 bitplane menyediakan 8 bit masing-masing untuk RGB, akan tetapi hal ini
tidak selalu benar. Untuk mengetahui jumlah bitplane yang tersedia dalam
sistem, kita bisa menggunakan perintah glGetIntegerv() dengan GL_RED_BITS,
GL_GREEN_BITS, GL_BLUE_BITS, dan GL_ALPHA_BITS sebagai parameter.
6.2.5. Mode RGBA
Pada mode RGBA, hardware menyimpan jumlah bitplane untuk tiap-tiap komponen RGBA.
Nilai RGBA disimpan sebagai integer dan diskalakan dengan jumlah bit yang tersedia untuk
penyimpanan. Sebagai contoh jika sistem menyediakan 8 bit untuk komponen R, maka integer
antara 0-255 dapat disimpan, sehingga 0, 1, 2, ..., 255 pada bitplane dapat diartikan nilai R
sebesar
0
/
255
= 0.0,
1
/
255
,
2
/
255
, ...,
255
/
255
= 1.0. Tanpa memperhatikan jumlah bitplane, 0.0
menghasilkan intensitas minimum dan 1.0 menghasilkan intensitas maksimum.
Gambar 6-1. Nilai RGB dari bitplane
Jumlah macam warna yang dapat ditampilkan pada tiap-tiap piksel tergantung jumlah bitplane
dan kapasitas dari hardware untuk menginterpretasikan bitplane tersebut. Jumlah warna tidak
dapat melebihi 2
n
, dimana n adalah jumlah bitplane sehingga mesin dengan 24 bitplane untuk
RGB dapat menampilkan lebih dari 16,77 juta macam warna.
6.2.6. Dithering
Beberapa hardware grafik menggunakan dithering untuk meningkatkan jumlah warna yang
dapat ditampilkan dengan mengorbankan resolusi spatial. Dithering adalah teknik untuk
menggunakan beberapa warna untuk membentuk efek warna lain. Untuk menggambarkan
bagaimana proses dithering bekerja, anggaplah sistem kita hanya mempunyai 1 bit masing-
masing untuk RGB. Jadi sistem tersebut hanya bisa menampilkan 8 warna, yaitu hitam, putih,
merah, hijau, biru, kuning, cyan dan magenta. Untuk menampilkan warna pink pada suatu
daerah, hardware dapat mengisi daerah tersebut dengan warna merah dan putih. Karena mata
kita cukup jauh dari layar sehingga tidak dapat membedakan tiap-tiap piksel,daerah tersebut
akan tampak berwarna pink, rata-rata dari warna merah dan putih. Warna pink yang lebih
merah dapat dihasilkan dengan mengisi proporsi piksel yang lebih banyak dengan warna
merah, sedangkan warna pink yang lebih putih dapat dihasilkan dengan mengisi proporsi
piksel lebih banyak dengan warna putih, dan seterusnya.
Dengan cara ini, tidak ada piksel yang berwarna pink. Satu-satunya jalan untuk menghasilkan
efek di atas adalah dilakukan pada suatu daerah yang terdiri dari berbagai piksel. Kita tidak
bisa melakukan proses dithering pada satu piksel saja. Jika kita membentuk suatu nilai RGB
untuk suatu warna yang tidak tersedia dan mengisi suatu poligon, hardware mengisi piksel
yang berada di dalam poligon dengan campuran dari warna-warna terdekat sehingga
menampilkan warna rata-rata untuk mata kita sesuai dengan warna yang kita inginkan.
Gambar 6-2. Dhitering hitam dan putih untuk menghasilkan abu-abu
Dengan 8 bit pada tiap-tiap RGB, kita bisa mendapatkan gambar berkualitas tinggi tanpa
proses dithering. Tapi walaupun mesin kita mempunyai 24 bitplane bukan berarti proses
dithering tidak terjadi. Sebagai contoh, jika kita menggunakan mode double-buffer, bitplane
mungkin dibagi menjadi 2, masing-masing 12 sehingga hanya ada 4 bit pada tiap-tiap
komponen RGB. Tanpa dithering, 4 bit setiap komponen warna akan memberi hasil yang
kurang memuaskan.
6.2.7. Mode indeks warna
Dengan mode indeks warna, OpenGL menggunakan peta warna yang mirip dengan
menggunakan palet untuk mencampur cat pada saat melukis. Palet seorang pelukis
menyediakan tempat untuk mencampur cat, dan mirip dengan hal tesebut, peta warna
menunjukkan dimana nilai RGB dicampur.
Gambar 6-3. Peta warna
Pelukis memilih sebuah warna dari palet warna dan melukis dengan
warna tersebut. Komputer menyimpan indeks warna dalam bitplane untuk tiap-
tiap piksel. Nilai bitplane tersebut menunjuk ke peta warna dan layar akan
diwarnai dengan nilai RGB dari peta warna.
Gambar 6-4. Menggunakan peta warna untuk mewarnai gambar
Pada mode indeks warna, jumlah warna yang tersedia terbatas oleh
ukuran peta warna dan jumlah bitplane yang tersedia. Ukuran peta warna
ditentukan oleh hardware yang digunakan. Biasanya berkisar antara 256(2
8
)
sampai 4096(2
12
). Ukuran peta warna merupakan pangkat dari 2 diindeks oleh
jumlah bitplane yang tersedia pada mode indeks warna. Jika ada 2
n
indeks pada
peta warna dan m bitplane yang tersedia, maka jumlah warna yang bisa
ditampung adalah kurang dari 2
n
dan 2
m
.
Dengan mode RGBA, tiap-tiap warna piksel tidak tergantung piksel lain.
Sedangkan pada mode indeks warna, tiap-tiap piksel dengan indeks yang sama
disimpan pada lokasi yang sama. Jika isi dari peta warna berubah, seluruh piksel
yang berindeks sama akan ikut berubah.
6.2.8. Memilih antara mode RGBA atau mode indeks warna
Kita mungkin lebih baik menggunakan mode indeks warna pada kasus-kasus di bawah ini:
- Jika kita melanjutkan aplikasi yang sudah ada dan menggunakan
mode indeks warna.
- Jika kita hanya mempunyai bitplane dalam jumlah sedikit dan jika kita
hanya perlu warna kurang dari 2
n
.
- Jika kita mempunyai bitplane dalam jumlah terbatas, mode RGBA
mungkin akan menyebabkan proses shading yang kasar, sehingga
lebih baik memilih mode indeks warna.
- Mode indeks warna akan berguna untuk berbagai macam trik, seperti
animasi.
Secara umum gunakanlah mode RGBA, karena memberikan hasil yang lebih baik untuk
texture mapping, lighting, shading, fog, antialiasing dan blending.
6.6. Penggunaan warna pada model shading
6.3.4. Pembentukan warna pada mode RGBA
Pada mode RGBA gunakan perintah glColor*() untuk memilih warna yang akan digunakan.
void glColor3{b s i f d ub us ui}(TYPEr, TYPEg, TYPEb);
void glColor4{b s i f d ub us ui}(TYPEr, TYPEg, TYPEb, TYPEa);
void glColor3{b s i f d ub us ui}v(const TYPE*v);
void glColor4{b s i f d ub us ui}v(const TYPE*v);
Perintah di atas mempunyai 3 macam akhiran yang bervariasi sesuai dengan parameter yang
diterima. Akhiran pertama adalah 3 atau 4, menunjukkan apakah kita memasukkan nilai alpha
disamping nilai RGB. Jika nilai tersebut tidak dimasukkan, otomatis akan diset 1.0. Akhiran
kedua menunjukkan tipe data untuk parameter: byte, short, integer, float, double, unsigned
byte, unsigned short atau unsigned integer. Sedangkan akhiran ketiga adalah optional v yang
menunjukkan argumen tersebut adalah pointer pada suatu array sesuai dengan tipe datanya.
6.3.5. Pembentukan warna pada mode indeks warna
Untuk mode indeks warna gunakan perintah glIndex*() untuk memilih warna yang akan
digunakan:
void glIndex{s i f d}(TYPE c);
void glIndex{s i f d}v(const TYPE *c);
Akhiran pertama dari perintah di atas menunjukkan tipe data dari parameter: short, integer,
float atau double. Akhiran kedua adalah optional v yang menunjukkan bahwa argumen
tersebut adalah nilai dari suatu array sesuai dengan tipe data yang diberikan (array tersebut
hanya berisi 1 nilai).
6.3.6. Pembentukan model shading
Sebuah garis atau poligon terisi dapat digambar dengan satu warna (flat shading) atau
dengan berbagai macam warna (smooth shading). Kita dapat menentukan teknik shading
sesuai dengan yang kita inginkan dengan perintah glShadeModel().
void glShadeModel(GLEnum mode);
Parameter mode dapat diset GL_SMOOTH(default) atau GL_FLAT. Dengan flat shading,
warna dari suatu vertex diduplikat ke seluruh vertex dari obyek tersebut. Sedangkan pada
smooth shading, warna dari tiap-tiap vertex diperlakukan sendiri-sendiri. Untuk sebuah garis,
warna-warna sepanjang segmen garis tersebut ditambahkan pada warna vertex. Sedangkan
pada poligon, warna-warna dari interior poligon tersebut ditambahkan pada warna vertex.
Dengan smooth shading, titik-titik yang berdekatan mempunyai perbedaan nilai warna
yang kecil. Pada mode RGBA hal ini kelihatan mirip sehingga perubahan warna dalam
poligon tampak halus (bertahap sedikit demi sedikit). Pada mode indeks warna titik-titik yang
berdekatan mungkin menunjuk pada lokasi yang berbeda pada tabel indeks warna, yang
mungkin tidak mirip sama sekali.
Untuk mengatasi hal tersebut, kita harus membuat suatu jalur perubahan warna yang
halus diantara indeks-indeks dalam peta warna. Pemetaan warna pada peta warna dibentuk
melalui sistem window. Untuk sementaara anggaplah kita mempunyai rutin auxSetOneColor()
yang melakukan load satu indeks pada peta warna dengan nilai RGB. Argumen pertama dari
rutin ini adalah nilai RGB. Untuk melakukan load 32 indeks warna yang berdekatan (dari
indeks 16 sampai 47) dengan sedikit perubahan dari warna kuning, kita mungkin akan
memanggil rutin auxSetOneColor() sebagai berikut:
for(i=0;i<32;i++) auxSetOneColor(16+i, 1.0*(i/32.0), 1.0*(i/32.0), 0.0);
Dengan flat shading warna dari suatu vertex menentukan warna dari seluruh obyek tersebut.
Untuk segmen garis, warnanya ditentukan oleh warna vertex kedua (vertex akhir).
PENCAHAYAAN PADA OPENGL
Ketika kita melihat suatu permukaan, persepsi mata kita terhadap warna
tergantung dari distribusi energi foton yang tiba dan merangsang sel cone seperti
yang telah dijelaskan pada bab sebelumnya. Foton-foton datang dari satu
ataupun kombinasi dari beberapa sumber cahaya dimana sebagian diserap dan
sebagian lagi dipantulkan oleh permukaan tersebut.
Model pencahayaan OpenGL terdiri dari 3 komponen sinar. Komponen-
komponen sinar tersebut antara lain:
- Ambient
Sinar yang datang ke permukaan obyek dari sembarang arah sebagai
akibat dari pantulan ruangan di sekeliling obyek sehingga tidak
mempunyai arah datang yang khusus.
- Diffuse
Sinar yang datang dari arah tertentu tetapi dipantulkan ke segala arah
oleh permukaan obyek. Jika sinar diarahkan langsung tanpa melalui
sudut tertentu maka obyek pada sisi dimana sinar menyorot akan
tampak lebih terang dari sisi yang lain.
- Specular
Sinar yang terarah, jadi datang dari arah tertentu dan terpantul ke
arah tertentu pula.
Warna material tergantung pada prosentase dari sinar RGB yang
dipantulkan. Contohnya sebuah bola yang berwarna merah memantulkan semua
sinar merah yang datang dan menyerap sinar hijau dan biru. Jika bola tersebut
diberi sinar putih (campuran dari warna RGB dalam jumlah yang sama), seluruh
sinar merah dipantulkan sehingga bola terlihat berwarna merah. Begitu pula jika
sinar yang diberikan berwarna merah. Jika sinar yang diberikan berwarna hijau,
maka bola tersebut akan tampak berwarna hitam karena seluruh sinar hijau akan
diserap sedangkan tidak ada sinar yang dipantulkan, karena tidak ada sinar
merah.
7.1. Pembentukan sumber cahaya
Sumber cahaya mempunyai sejumlah properti, seperti warna, posisi dan
arah. Perintah yang digunakan untuk membentuk properti tersebut adalah
glLight*(), yang membutuhkan 3 argumen. Argumen pertama menunjukkan
cahaya dimana propertinya ingin dibentuk, yang kedua adalah propertinya dan
yang terakhir adalah nilai yang diinginkan dari properti pada argumen kedua.
void glLight{i f}[v](Glenum light, Glenum pname, TYPEparam);
Perintah di atas digunakan untuk membentuk sumber cahaya yang bisa
merupakan GL_LIGHT0, GL_LIGHT1, …, GL_LIGHT7. Karakteristik dari cahaya
didefinisikan oleh pname yang berisi parameter-parameter (lihat tabel).
Sedangkan argumen param merupakan nilai untuk mengisi parameter kedua.
Nama parameter Nilai default Keterangan
GL_AMBIENT (0.0, 0.0, 0.0, 1.0) Intensitas sinar ambient
GL_DIFFUSE (1.0, 1.0, 1.0, 1.0) Intensitas sinar diffuse
GL_SPECULAR (1.0, 1.0, 1.0, 1.0) Intensitas sinar specular
GL_POSITION (0.0, 0.0, 1.0, 0.0) Posisi sinar (x,y,z,w)
GL_SPOT_DIRECTION (0.0, 0.0, -1.0) Arah spotlight (x,y,z)
GL_SPOT_EXPONENT 0.0
GL_SPOT_CUTOFF 180.0
GL_CONSTANT_ATTENUATION 1.0
GL_LINEAR_ATTENUATION 0.0
GL_QUADRATIC_ATTENUATION 0.0
Tabel parameter dari glLight*()
Di bawah ini adalah salah satu contoh penggunaan perintah glLight*() untuk membentuk
sumber cahaya:
GLfloat light_ambient[] = {0.0, 0.0, 0.0, 1.0};
GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
Ada dua macam tipe dari sumber cahaya, yang pertama dinamakan sumber cahaya
directional. Sumber cahaya ini jaraknya sangat jauh (tak terbatas), salah satu contohnya adalah
cahaya matahari. Tipe yang kedua adalah sumber cahaya positional. Disebut begitu karena
posisinya menentukan efek yang tampak, khususnya arah dari datangnya sinar. Contoh dari tipe ini
adalah lampu belajar.
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
Seperti yang terlihat, kita memberikan sebuah vektor dengan 4 nilai (x, y, z, w) untuk
parameter GL_POSITION. Jika nilai terakhir (w) bernilai nol, maka cahaya yang terbentuk bertipe
directional dan nilai x, y, z menggambarkan arahnya. Jika w tidak nol maka tipe yang terbentuk
adalah positional dan nilai x, y, z membentuk lokasi dari sumber cahaya.
Kita dapat membentuk sumber cahaya positional seakan-akan seperti lampu sorot. Untuk
membentuknya kita harus menentukan penyebaran cahaya yang dinginkan dengan jalan mengeset
parameter GL_SPOT_CUTOFF. Sudut dari penyebaran cahaya tersebut adalah dua kali dari nilai
yang diisikan ke parameter GL_SPOT_CUTOFF.
7.2. Penentuan model cahaya
Model cahaya pada OpenGL mempunyai 3 komponen. Komponen-komponen tersebut
adalah:
- Intensitas cahaya ambient global
- Posisi sudut pandang apakah bersifat lokal ataukah dianggap
mempunyai jarak yang sangat jauh.
- Apakah perhitungan cahaya dibuat berbeda antara permukaan depan
dan belakang obyek.
7.2.1. Cahaya ambient global
Setiap sumber cahaya dapat memberikan cahaya ambient ke scene.
Untuk membentuk intensitas RGBA dari cahaya ambient global, gunakan
parameter GL_LIGHT_MODEL_AMBIENT seperti di bawah ini:
GLfloat lmodel_ambient[] = {0.2, 0.2, 0.2, 1.0};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
Karena nilai di atas menghasilkan cahaya ambient berwarna putih dalam jumlah
kecil, maka walaupun kita tidak menambah sumber cahaya lain ke scene, kita masih
dapat melihat obyek dalam scene.
7.2.2. Sudut pandang
Letak dari sudut pandang mempengaruhi perhitungan untuk cahaya yang
dihasilkan oleh pantulan specular. Lebih khusus, intensitas cahaya pada suatu vertex
tergantung dari bentuk normal vertex tersebut, arah dari vertex ke sumber cahaya dan
arah dari vertex ke sudut pandang.
Dengan sudut pandang tak terbatas, arah antara sudut pandang dan setiap
vertex pada scene adalah konstan. Sudut pandang lokal cenderung memberi hasil yang
lebih realistis, tetapi karena arahnya harus selalu dihitung untuk tiap-tiap vertex
menyebabkan berkurangnya kinerja (lambat). Oleh karena itu sudut pandang tak terbatas
digunakan sebagai default.
7.2.3. Pencahayaan dua sisi
Perhitungan cahaya dibentuk untuk seluruh poligon, apakah permukaan depan
atau belakang. Karena kita biasa mengeset kondisi cahaya dengan permukaan depan
dari poligon, permukaan belakangnya tidak diberi cahaya dengan tepat.
Gambar 7-1. Sphere
Pada gambar 7-1 dimana obyeknya adalah sebuah sphere, hanya permukaan
depan saja yang terlihat. Jadi dalam hal ini tidak penting bagaimana tampilan dari
permukaan belakang. Jika sphere tersebut dipotong sehingga permukaan dalamnya
terlihat, mungkin kita perlu menyoroti permukaan dalam dari sphere tersebut dengan
cahaya yang telah kita definisikan. Kita dapat merubah model cahaya menjadi 2
permukaan, yaitu depan dan belakang dengan perintah di bawah ini:
glLightModeli(LIGHT_MODEL_TWO_SIDE, GL_TRUE);
7.2.4. Mengaktifkan cahaya
Pada OpenGL kita harus mengaktifkan cahaya secara eksplisit dengan
menggunakan perintah:
glEnable(GL_LIGHTING);
Sedangkan untuk membuat cahaya menjadi disable perinahnya adalah:
glEnable(GL_LIGHTING);
Kita juga harus mengaktifkan tiap-tiap sumber cahaya yang telah kita definisikan dengan
perintah yang sama, hanya saja parameternya adalah tia-tiap sumber cahaya seperti
GL_LIGHT0, GL_LIGHT1, …, GL_LIGHT7.
7.3. Pendefinisian properti material
Kita telah mengetahui bagaimana membentuk sumber cahaya beserta karakteristiknya dan
bagaimana mendefinisikan model cahaya yang kita inginkan. Pada bagian ini kita akan membahas
bagaimana mendefinisikan properti material dari suatu obyek dalam scene. Perintah yang
digunakan adalah gl Material*().
void glMeterial{i f}[v]( Glenum face, Glenum pname,TYPE param);
Parameter face dapat diisi GL_FRONT, GL_BACK atau
GL_FRONT_AND_BACK untuk menunjukkan permukaan dari obyek tempat
material diterapkan. Sedangkan untuk mengisi parameter pname dapat dilihat
pada tabel di bawah ini:
Nama parameter Nilai default Keterangan
GL_AMBIENT (0.2, 0.2, 0.2, 1.0) Warna ambient dari material
GL_DIFFUSE (0.8, 0.8, 0.8, 1.0) Warna diffuse dari material
GL_AMBIENT_AND_DIFFUSE Warna ambient dan specular
dari material
GL_SPECULAR (0.0, 0.0, 0.0, 1.0) Warna specular dari material
GL_SHININESS 0.0 Tingkat pancaran cahaya
specular
GL_EMISSION (0.0, 0.0, 0.0, 1.0) Pemancaran warna dari
material
GL_COLOR_INDEXES (0, 1, 1) Indeks warna dari cahaya
ambient, diffuse dan specular
7.3.1. Refleksi diffuse dan ambient
Parameter GL_DIFFUSE dan GL_AMBIENT yang diset pada glMaterial*()
mempengaruhi warna dari cahaya diffuse dan ambient yang dipantulkan oleh sebuah obyek.
Pemantulan diffuse mempunyai pengaruh penting untuk menentukan warna yang kita lihat dari
sebuah obyek. Hal itu dipengaruhi oleh warna dari cahaya diffuse dan sudut jatuhnya cahaya
tersebut dengan garis normal (yang paling kuat adalah jika cahaya jatuh tegak lurus ke
permukaan). Posisi sudut pandang tidak mempengaruhi pemantulan diffuse sama sekali.
Pemantulan ambient berpengaruh pada warna obyek secara keseluruhan. Karena
pemantulan diffuse lebih terang pada bagian obyek yang disinari, pemantulan ambient tampak
pada bagian obyek yang tidak disinari. Pemantulan ambient total dari sebuah obyek dipengaruhi
oleh cahaya ambient global dan cahaya ambient dari sumber cahaya. Seperti juga pemantulan
diffuse, pemantulan ambient juga tidak dipengaruhi oleh letak sudut pandang.
Untuk obyek nyata, pemantulan ambient dan diffuse biasanya menggunakan warna yang
sama sehingga OpenGL memberikan jalan untuk mengeset nilai yang sama untuk keduanya secara
serentak dengan menggunakan perintah glMaterial*(). Contoh:
GLfloat mat_amb_diff[] = {0.1, 0.5, 0.8, 1.0};
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
mat_amb_diff);
7.3.2. Refleksi specular
Pemantulan specular dari sebuah obyek menghasilkan sorotan. Tidak seperti pemantulan
ambient dan diffuse, pemantulan specular tergantung pada sudut pandang. Contohnya adalah jika
kita memandang bola logam yang terkena sinar matahari. Jika kita menggerakkan kepala kita,
maka sorotan yang dihasilkan oleh sinar matahari akan ikut bergerak.
OpenGL memungkinkan kita untuk mengeset warna RGBA dari sorotan
specular (dengan GL_SPECULAR) dan tingkat kecerahan dari sorotan specular
(dengan GL_SHININESS). Kita dapat mengisi GL_SHININESS dengan nilai
antara 0.0 sampai dengan 128.0. Contoh:
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat low_shininess[] = {5.0};
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
7.3.3. Emisi
Dengan menggunakan warna RGBA untuk GL_EMISSION, kita dapat membuat
sebuah obyek terlihat memancarkan cahaya sesuai dengan warna yang kita set. Karena
sebagian besar obyek nyata tidak memancarkan cahaya, kita mungkin akan menggunakan
perintah ini kebanyakan untuk simulasi lampu atau sumber cahaya lain dalam scene.
Contoh:
GLfloat mat_emission[] = {0.3, 0.2, 0.2, 0.0};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
TEKSTUR MAPPING
8.1. Penentuan tekstur
Perintah glTexImage2D() mendefinisikan tekstur 2 dimensi. Perintah tersebut
memerlukan beberapa argumen yang diterangkan di bawah ini:
void glTexImage2D(Glenum target, Glint level, Glint components, Glsizei
width, Glsizei height, Glint border, Glenum format, GLenum type, const Glvoid
*pixels);
Parameter target dimaksudkan untuk penggunaan kelak oleh OpenGL,
dalam hal ini harus diset GL_TEXTURE_2D. Parameter level digunakan jika kita
mempunyai berbagai resolusi dari tekstur. Jika hanya ada satu resolusi, maka
parameter ini diset nol.
Parameter berikutnya, components, adalah integer antara 1 sampai
dengan 4 yang menunjukkan komponen R, G, B dan A yang dipilih untuk
digunakan pada proses modulating dan blending. Nilai 1 memilih komponen R, 2
memilih komponen R dan A, 3 memilih komponen R, G dan B serta nilai 4
memilih komponen RGBA.
Parameter width dan height adalah ukuran dari image tekstur. Border
menunjukkan lebar garis tepi, biasanya berisi nol. Width dan height berukuran
2
m
+2b dimana m adalah integer dan b adalah nilai dari border.
Parameter format dan type menggambarkan format dan tipe data dari image
tekstur. Parameter format dapat diisi GL_COLOR_INDEX, GL_RGB, GL_RGBA,
GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_LUMINANCE atau
GL_LUMINANCE_ALPHA. Sedangkan parameter type dapat diisi dengan GL_BYTE,
GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT,
GL_UNSIGNED_INT, GL_FLOAT atau GL_BITMAP. Terakhir, pixels berisi data
image tekstur.
8.1.1. Mipmapping
Seperti obyek yang lain, obyek bertekstur dapat ditampilkan dalam berbagai jarak
dengan titik pandang. Oleh karena itu jika obyek tersebut bergeser menjauhi titik
pandang, maka ukuran dari tekstur pun harus berkurang sesuai dengan ukuran dari
obyeknya. Untuk itu OpenGL harus memfilter tekstur map ke ukuran yang tepat untuk
dimapke obyek. Kita dapat menentukan serangkaian tekstur map dalam resolusi yang
lebih kecil yang disebut dengan mipmaps. Kemudian OpenGL menentukan tekstur mana
yang akan dimap ke obyek. Dengan pendekatan ini jika image dari obyek mengecil maka
ukuran dari tekstur map juga berkurang.
Gambar 8-1. mipmaps
Teknik ini disebut dengan mipmapping (mip adalah singkatan dari bahasa
latin multim in parvo yang artinya sesuatu yang banyak di tempat yang
kecil/sempit). Untuk menggunakan mipmapping, kita menyediakan semua ukuran
tekstur dalam pangkat dari 2 antara ukuran terbesar sampai dengan ukuran 1x1.
Sebagai contoh jika resolusi terbesarnya adalah 64x16, kita juga harus
menyediakan map untuk ukuran 32x8, 16x4, 8x2, 4x1, 2x2 dan 1x1.
Untuk menentukan tekstur ini, gunakan perintah glTexImage2D() sekali
tiap resolusi atau ukuran dari tekstur map, dengan nilai yang berbeda dari
parameter level, width, height dan image. Dimulai dari nol, level menunjukkan
tekstur mana yang dipilih. Seperti pada contoh di atas, tekstur dengan ukuran
64x16 dideklarasikan dengan level=0, 32x8 dengan level=1, dan seterusnya.
8.1.2. Mengontrol filtering
Tekstur map berbentuk bujursangkar atau persegipanjang, tetapi setelah dimap ke
poligon atau permukaan dan ditransformasi ke koordinat layar, sebuah teksel dari tekstur
jarang diwakili oleh sebuah piksel dari image pada layar. Tergantung dari transformasi
dan tekstur mapping yang digunakan, sebuah piksel pada layar dapat mewakili sebagian
dari teksel (magnification) atau sekumpulan teksel (minification) seperti pada gambar 8-2.
Jika mipmap perlu untuk dibesarkan (atau dikecilkan) magnifikasi (atau minifikasi)
diperlukan. Untuk menentukan magnifikasi atau minifikasi, gunakan perintah di bawah
ini:
Gambar 8-2. Magnifikasi dan minifikasi tekstur
glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
Argumen pertama dari glTexParameter*() adalah GL_TEXTURE_2D atau
GL_TEXTURE_1D tergantung tekstur yang digunakan 2 dimensi ataukah 1 dimensi.
Argumen yang kedua adalah GL_TEXTURE_MAG_FILTER atau
GL_TEXTURE_MIN_FILTER untuk menentukan metode yang digunakan magnifikasi
ataukah minifikasi. Argumen ketiga menentukan metode filtering yang digunakan
(lengkapnya lihat tabel).
Parameter Nilai
GL_TEXTURE_MAG_FILTER GL_NEAREST, GL_LINEAR
GL_TEXTURE_MIN_FILTER GL_NEAREST, GL_LINEAR,
GL_NEAREST_MIPMAP_NEAREST,
GL_NEAREST_MIPMAP_LINEAR,
GL_LINEAR_MIPMAP_NEAREST,
GL_ LINEAR_MIPMAP_LINEAR,
Tabel metode filtering untuk magnifikasi dan minifikasi
Jika kita memilih GL_NEAREST, teksel dengan koordinat terdekat terhadap
pusat dari piksel digunakan untuk magnifikasi dan minifikasi. Jika GL_LINEAR yang
dipilih, maka rata-rata dari array terdekat 2x2 yang terdekat terhadap pusat dari piksel
digunakan untuk magnifikasi dan minifikasi.
Kita dapat memilih teksel terdekat dengan GL_NEAREST, atau dapat
pula menyisipkan nilai rata-rata dengan GL_LINER MIPMAP_NEAREST.
Menggunakan teksel terdekat akan lebih cepat tetapi memberi hasil yang kurang
memuaskan. Gunakan GL_NEAREST_MIPMAP_LINEAR atau
GL_LINEAR_MIPMAP_LINEAR untuk menyisipkan nilai teksel dari 2 mipmap
terbaik yang dipilih. GL_NEAREST_MIPMAP_LINEAR memilih teksel terdekat
dari 2 map dan menyisipkan rata-rata diantaranya. sedangkan
GL_LINEAR_MIPMAP_LINEAR menggunakan penyisipan untuk menghitung
nilai dari 2 map dan menyisipkan nilai baru diantara keduanya. Jadi
GL_LINEAR_MIPMAP_LINEAR memberikan hasil terbaik, tetapi memerlukan
waktu yang lebih banyak.
8.1.3. Tekstur 1 dimensi
Kadang-kadang tekstur 1 dimensi saja cukup bagi kita. Tekstur 1 dimensi
mempunyai sifat-sifat seperti pada tekstur 2 dimensi dengan height=1 dan tanpa
border atas dan bawah. Untuk menentukan tekstur 1 dimensi gunakan perintah di
bawah ini:
Void glTexImage1D(Glenum target, Glint level, Glint components,
Glsizei width, Glint border, Glenum format, GLenum type, const
Glvoid *pixels);
Semua parameter mempunyai arti yang sama dengan pada perintah
glTexImage2D() kecuali bahwa image sekarang merupakan array 1 dimensi.
8.2. Modulating dan blending
Pada seluruh contoh sejauh ini, nilai dari tekstur map telah digunakan sebagai
warna untuk mewarnai permukaan. Kita juga bisa menggunakan nilai dalam tekstur map
untuk mengatur warna dari permukaan yang diwarnai tanpa tekstur atau mencampur
warna dalam tekstur map dengan warna non-tekstur dari permukaan. Untuk itu gunakan
perintah di bawah ini:
void glTexEnv{i f}{v}(Glenum target, Glenum pname, TYPE
param);
Perintah tersebut mengeset fungsi tekstur. Parameter target harus diisi
GL_TEXTURE_ENV. Jika pname adalah GL_TEXTURE_ENV_MODE, param
bisa diisi GL_DECAL, GL_MODULATE atau GL_BLEND, untuk menentukan
bagaimana nilai tekstur dikombinasikan dengan nilai warna dari potongan yang
diproses. Pada mode decal dan dengan 3 komponen tekstur, warna tekstur
menggantikan warna potongan. Pada 2 mode yang lain, atau dengan 4
komponen tekstur, warna akhir adalah kombinasi dari nilai tekstur dan potongan.
Jika pname adalah GL_TEXTURE_ENV_COLOR, param adalah sebuah array
dari nilai floating point yang menunjukkan komponen RGBA.
Fungsi tekstur memilih komponen dari nilai tekstur dan warna yang akan
digunakan tanpa tekstur. Ketika kita menentukan tekstur map dengan
glTexImage*(), argumen ketiga adalah jumlah komponen RGBA yang dipilih
untuk tiap-tiap teksel. Jika yang dipilih 1 komponen maka dia adalah nilai
luminance (L). Jika 2 komponen, maka yang pertama adalah luminance dan yang
kedua adalah alpha (A). Tiga komponen akan membentuk warna RGB (C) dan 4
komponen akan menyediakan warna dalam RGBA. Komponen-komponen yang
digunakan oleh fungsi tekstur ditunjukkan dalam tabel di bawah ini:
Komponen Mode decal Mode modulate Mode blend
1 Tak terdefinisi C=L
t
C
f
, A=A
f
C=(1-L
t
)C
f
+L
t
C
c
,A=A
f
2 Tak terdefinisi C=L
t
C
f
, A=A
t
A
f
C=(1-L
t
)C
f
+L
t
C
c
,A=A
t
A
f
3 C=C
t
, A=A
f
C=C
t
C
f
, A=A
f
Tak terdefinisi
4 C=(1
t
)C
f
+A
t
C
t
, A=A
f
C=C
t
C
f
, A=A
t
A
f
Tak terdefinisi
Tabel fungsi decal, modulate dan blend
Dalam tabel tersebut, subscribe t menunjukkan nilai tekstur, f menunjukkan nilai
fragment (potongan), c menunjukkan nilai yang diberikan dengan GL_TEXTURE_ENV
COLOR dan tanpa subscribe berarti nilai akhir.
Kita menggunakan mode decal jika kita ingin menerapkan tekstur buram
untuk sebuah obyek. Sedangkan mode modulate kita gunakan untuk membuat
tekstur yang bereaksi terhadap cahaya.
8.3. Assignment koordinat pada suatu tekstur
Pada saat menggambar scene tekstur map, kita harus menyediakan koordinat
obyek dan koordinat tekstur. Koordinat tekstur bisa terdiri dari 1, 2, 3 atau 4 koordinat.
Koordinat tersebut biasanya ditunjukkan sebagai s, t, r dan q untuk membedakan dengan
koordinat obyek (x, y, z dan w). untuk tekstur 1 dimensi kita menggunakan koordinat s,
sedangkan untuk tekstur 2 dimensi kita gunakan koordinat s dan t. Untuk sementara
abaikan koordinat r. Koordinat q, seperti koordinat w pada koordinat obyek biasanya
diberi nilai 1 dan bisa digunakan untuk membuat koordinat homogen. Perintah untuk
mnentukan koordinat tekstur adalah glTexCoord*() yang mirip dengan glVertex*(),
glColor*() dan glNormal*(). Biasanya nilai koordinat tekstur berkisar antara 0 dan 1.
void glTexCoord{1 2 3 4}{s i f d}{v}(TYPE coords);
Perintah tersebut digunakan untuk mengeset koordinat tekstur (s, t, r dan
q). Jika diikuti dengan pemanggilan perintah glVertex*() maka pada vertex
tersebut diberikan koordinat tekstur yang sedang aktif. Dengan glTexCoord1*()
kita menentukan nilai s, sedangkan t dan r diset 0 dan q diset 1. Dengan
glTexCoord2*() kita menentukan nilai s dan t, sedangkan nilai r diset 0 dan q
diset 1. Dengan glTexCoord3*() kita menentukan nilai s, t dan r, sedangkan nilai
q diset 1. Dan untuk menentukan nilai dari semua koordinat kita gunakan
glTexCoord4*().
Gambar 8-3. Mengulang tekstur
Kita dapat memberikan koordinat tekstur diluar rang [0,1] dan mengulang
atau melakukan clamp dalam tekstur map. Dengan mengulang tekstur, jika kita
mempunyai bidang yang besar dengan koordinat tekstur antara 0.0 sampai
dengan 10.0 pada kedua arahnya, maka kita akan mendapatkan 100 kopi dari
tekstur tersebut dan diletakkan pada layar.
Gambar 8-4. Melakukan clamping pada tekstur
Kemungkinan yang lain adalah dengan melakukan clamp pada koordinat tekstur.
Sembarang nilai yang lebih besar dari 1.0 diset 1.0 dan yang kurang dari 0.0 diset 0.0.
Operasi clamping ini berguna untuk aplikasi dimana kita menginginkan sebuah kopi dari
tekstur ditampilkan pada permukaan. Jika koordinat tekstur permukaan antara 0.0 sampai
dengan 10.0 pada kedua arahnya, maka kopi dari tekstur akan ditampilkan di pojok
bawah.
Gambar 8-5. Mengulang sekaligus melakukan clamping pada tekstur
Kita juga bisa melakukan kombinasi dari keduanya, yaitu mengulang
sekaligus melakukan clamping. Untuk mengesetnya gunakan perintah
glTexParameter*(), yang selengkapnya adalah:
void glTexParameter{i f}{v}(Glenum target, Glenum pname, TYPE
param);
Perintah tersebut digunakan untuk mengontrol bagaimana tekstur
diterapkan pada potongan permukaan. Parameter target diisi GL_TEXTURE_2D
atau GL_TEXTURE_1D. Sedangkan nilai yang bisa diisikan pada parameter
pname dan param dapat dilihat pada tabel di bawah ini:
Parameter Nilai
GL_TEXTURE_WRAP_S GL_CLAMP, GL_REPEAT
GL_ TEXTURE_WRAP_T GL_CLAMP, GL_REPEAT
GL_TEXTURE_MAG_FILTER GL_NEAREST, GL_LINEAR
GL_TEXTURE_MIN_FILTER GL_NEAREST, GL_LINEAR,
GL_NEAREST_MIPMAP_NEAREST,
GL_NEAREST_MIPMAP_LINEAR,
GL_LINEAR_MIPMAP_NEAREST,
GL_ LINEAR_MIPMAP_LINEAR,
GL_TEXTURE_BORDER_COLOR Sembarang nilai dalam [0,1]
DAFTAR KEPUSTAKAAN
1. David F. Rogers, Procedural Elements for Computer Graphics, McGraw-Hill
Book Company, Singapore, 1985.
2. David F. Rogers, Mathematical Elements for Computer Graphics, McGraw-
Hill Book Company, Singapore, 1989.
3. Donald Hearn, M. Pauline Baker, Computer Graphics, Prentice-Hall
International, Inc., New Jersey, 1994.
4. Alan Watt, Mark Watt, Advanced Animation and Rendering Techniques -
Theory and Practice, Addison-Wesley Publishing Company, 1992.
5. Jerry R. Jackson, Java by Example, Sun Microsystems, Inc., 1996
6. Francis S. Hill, Computer Graphics, Maxwell Macmillan International Editions,
1990.
7. Jackie Neider, Tom Davis, OpenGL Programming Guide, Addison-Wesley
Publishing Company, 1996
8. Michael E. Mortenson, Geometric Modeling, Wiley Computer Publishing,
1997.

KATA PENGANTAR

Grafika

Komputer

merupakan

salah

satu

bidang

ilmu

komputer

yang

menakjubkan, dan banyak digunakan untuk menyajikan secara visual berbagai informasi dari berbagai disiplin ilmu yang lain. Penyajian informasi secara visual menggunakan grafika komputer untuk tujuan pemodelan, analisis, dan sintesis banyak dijumpai antara lain pada bidang kerekayasaan, arsitektur, kedokteran dan yang berkaitan dengan entertainment.

Berbicara tentang grafika komputer tidak terlepas dari berbagai metode dan algorithma yang diperlukan untuk membangkitkan gambar pada layar tampilan, dan cara pemanipulasian gambar tersebut sesuai dengan kebutuhan pengguna.

Dengan selesainya buku ini, penulis ingin mengucapkan terima kasih kepada semua pihak yang telah banyak membantu hingga terselesaikannya buku ini, khususnya saudara Pramudyo Ananto yang dengan segenap perhatian dan komitmennya telah menyunting dan memeriksa bab demi bab dari buku ini.

Sebagai akhir kata, penulis berharap agar buku ini dapat bermanfaat bagi para pembaca sekalian. Tak lupa, segala kritik dan saran demi sempurnanya buku ini sangat penulis harapkan.

Surabaya, Pebruari 1999

Penulis

DAFTAR ISI
Halaman Judul … … … … .… … … … … … … … … … … … … … … … … … … … … … … … ..i Kata Pengantar … … … … … … … … ...… … … … … … … … … .… … … … … … … … … … .ii Daftar Isi … … ...… … … … … … … … … … … … … … … … … … … … … … … … … … … … .iii Pendahuluan … … … … … … … … … … … … … … … … … … … … … … … … … … … … … 1 Bab 1 Metode Raster Scan … … … … … … … … … … … … … … … … … … … … … … … 4 Bab 2 Transformasi Dua Dimensi Dan Metode Parametrik … … … … … … … … … 24 Bab 3 Kurva … … ..… … … … … … … … … … … … … … … … … … … … … … … … … … ..42 Bab 4 Penggambaran Obyek Geometrik Dengan OpenGL ...… … … … … … … … 56 Bab 5 Teknik Viewing Pada OpenGL … … … .… … … … … … … ...… … … … … … … 67 Bab 6 Pewarnaan Pada OpenGL … ..… … … … … … … … … … … .… … … … … … … 84 Bab 7 Pencahayaan Pada OpenGL … … … … … … … … … … … … ..… … … … … … .92 Bab 8 Tekstur Mapping .… … … … … … … … … … … … … … … … … … … … … … … .101 Bab 9 Pembentukan Kurva dan Permukaan dengan NURBS… … … … … … … .110 Bab 10 Obyek Majemuk dan Operator Boolean… … … … … … … … … … … … … . 147 Daftar Pustaka

Selain itu Java memiliki syntax yang serupa dengan bahasa C++. Jika kita memilki kebiasaan membuat program dengan menggunakan Visual Basic. array. Seperti yang telah diutarakan di atas. Macintosh maupun yang lain. Segala sesuatu dalam Java.PENDAHULUAN Sekilas tentang Java Java merupakan bahasa pemrograman terbaru yang handal. Java juga merupakan bahasa yang benar-benar berorientasi obyek. Jadi Java secara otomatis mengumpulkan sampah (garbage collected) sehingga kita tidak perlu kuatir dengan masalah memori. kita memiliki pointer yang handal. Tetapi jika diperlukan. Selain itu mereka mengurangi penempatan dan pembebasan memori secara manual. Tetapi itu saja belum cukup. sehingga bagi programmerprogrammer yang sudah menguasai C++ tidak mengalami banyak kesulitan untuk menguasai Java. Salah satu kelebihannya yang nyata adalah run time library yang memberikan platform yang berdiri sendiri: karena kita dapat menggunakan source code yang sama pada Windows. misalnya untuk linked list. struct. Kemudian mereka menambahkan feature-feature di Java untuk mengurangi kesalahan tersebut. syntax pada Java mirip dengan syntax pada C++. Java memberikan solusi yang terbaik. bahkan melebihi C++. Multiple heritance juga dikurangi. Solaris. dan digantikan dengan interface yang menyediakan fasilitas yang kita inginkan dari multiple inheritance tanpa harus mengatur hirarkinya. kita tidak pernah menggunakan pointer. Perancang Java berpikir keras untuk mengetahui mengapa program C++ banyak menghasilkan kesalahan. kita sering menggunakan pointer untuk mengakses string. Sedangkan jika kita sering membuat program dengan C++. Unix. obyek dan file. Kita tidak lagi memerlukan pointer untuk mengakses string dan array. sehingga sering dikatakan Visual Basic kurang luwes karena tidak dapat mengmplementasikan dengan mudah beberapa struktur data yang memerlukan pointer. Selain itu Java memberikan keamanan . operator overloading dan yang lannya. Tetapi syntax pada Java tidak memerlukan file header. kecuali beberapa tipe data dasar adalah merupakan obyek.

segala sesuatu tentang Java dapat ditemukan pada http://www. Untuk lebih jelasnya. OpenGL dirancang sebagai interface yang tidak bergantung kepada hardware dan efisien untuk diimplementasikan pada berbagai macam platform hardware. Hal itu disebabkan oleh karena kita dapat mendefinisikan lebih dari satu perintah. versi lain dari perintah tersebut membutuhkan 4 argumen. GLsizei GLfloat. Pengenalan OpenGL OpenGL adalah suatu perangkat lunak interface untuk hardware grafik.java. Sedangkan konstantanya dimulai dari GL_. yaitu floating-point. Perintah OpenGL menerima sebanyak 8 tipe data yang berbeda untuk argumennya (untuk selengkapnya lihat tabel).sun. Ada juga beberapa huruf yang ditambahkan pada perintah-perintah (seperti 3f pada glColor3f()). GLboolean Glushort GLuint. seluruhnya menggunakan huruf kapital dan garis hubung bawah (underscore) untuk menghubungkan tiap-tiap kata (seperti GL_COLOR_BUFFER_BIT). karena kita tidak akan pernah dapat mengakses pointer yang rusak atau membuat kesalahan pada alokasi memori. GLclampd GLubyte. Perintah OpenGL menggunakan awalan gl dan inisial huruf kapital untuk tiap-tiap kata dari nama perintah (contohnya glColor()). GLclampf GLdouble. tergantung dari argumen yang kita berikan.bit unsigned integer Tipe data C signed char Short Long Float Double unsigned char unsigned short unsigned long Tipe data OpenGL GLbyte GLshort GLint. Akhiran b s i f d ub us ui Tipe data 8-bit integer 16-bit integer 32-bit integer 32-bit floating point 64-bit floating point 8-bit unsigned integer 16-bit unsigned integer 32.GLenum.yang benar-benar terjamin. Akhiran 3 menunjukkan ada 3 argumen yang diberikan.GLbitfield Tabel tipe data argumen . Akhiran f menunjukkan tipe data dari argumennya.com. Interface ini terdiri dari 120 perintah yang digunakan untuk membentuk obyek dan operasi yang diperlukan untuk menghasilkan aplikasi tiga dimensi yang interaktif.

hanya saja yang pertama membentuk koordinat vertex sebagai integer 32 bit.0.glVertex2I(1. 0. Berikut ini contoh perintah yang mempunyai versi vektor dan nonvektor: glColor3f(1.0.com/products/magician/index. 0.0). glColor3fv(color_array). Ada perintahperintah yang mempunyai versi vektor dan nonvektor. Dua perintah di atas adalah senilai. 3. Beberapa perintah OpenGL mempunyai huruf akhir v yang menunjukkan bahwa argumennya adalah sebuah pointer ke vektor (atau array).0.0. 0.hermetica.0. segala sesuatu tentang OpenGL dapat ditemukan pada http://www. tetapi ada pula yang hanya mempunyai versi nonvektor saja. float color_array[] = {1. 0. 3). sedangkan yang kedua membentuknya sebagai floating point.0}. Untuk lebih jelasnya.html .0). glVertex2f(1.

Pada bab ini kita akan mempelajari hal tersebut.METODE RASTER SCAN Peralatan raster scan memerlukan prosedur khusus untuk menghasilkan tampilan dan menggambar garis lurus atau kurva. sebagai contoh. Pemilihan elemen raster untuk garis vertikal. Sedangkan untuk orientasi lain rasterisasi akan manghasilkan kecerahan yang tidak rata. serta 45ο yang mempunyai tingkat kecerahan konstan sepanjang garis. Bahkan pada kasus khusus. Adapun syarat-syarat tersebut antara lain: garis yang ditampilkan harus lurus garis harus berawal dan berakhir pada titik yang tepat garis harus memiliki kerapatan yang konstan serta tidak bergantung pada panjang dan orientasi garis harus digambar secara cepat ? ? ? ? Gambar 2-1 Hanya untuk garis vertikal. sedangkan untuk garis dengan orientasi yang lain hal itu akan menjadi lebih sulit. Sebelum membicarakan algoritma pembangkitan garis.1 ALGORITMA PEMBANGKITAN GARIS Karena tabung sinar katoda (CRT-Catoda Ray Tube) dapat dianggap sebagai sebuah matrik dari piksel diskrit. 1. Proses penentuan titik mana yang akan dijadikan pilihan terbaik untuk garis yang diinginkan dikenal sebagai rasterisasi. hal itu memungkinkan kita untuk menggambar garis lurus dari satu titik ke titik yang lain. serta 45ο cukup mudah. perlu kiranya kita mengingat syarat-syarat umum dari algoritma pembangkitan garis. horisontal. kecerahan tergantung pada orientasi. horisontal. perhatikan bahwa spasi .

Persamaan di atas merepresentasikan sebuah hubungan perulangan untuk nilai y berturutturut sepanjang garis yang diinginkan.efektif antar piksel untuk garis 45ο lebih besar dari garis vertikal dan horisontal. Salah satu contohnya adalah: position = start step = increment if position . Hal ini membuat garis vertikal dan horisontal akan tampak lebih cerah dari garis 45ο. y2 adalah titik awal dan akhir dari garis yang diinginkan dan y i adalah nilai inisialisasi untuk setiap langkah sepanjang garis. Untuk membuat kecerahan yang sama sepanjang garis dengan berbagai macam variasi panjang dan orientasi memerlukan perhitungan dengan akar kuadrat. Hal ini akan memperlambat proses perhitungan. Hal itu dinamakan Digital Differential .end < accuracy then 4 if position > end then 2 if position < end then 3 position = position – step go to 1 position = position + step go to 1 finish 1 2 3 4 1. Sebagian besar algoritma menggunakan metode incremental untuk menyederhanakan perhitungan. = y2 − y1 ∆x x2 − x1 yi + 1 = yi + ∆y y2 − y1 yi + 1 = yi + ∆x x2 − x1 dimana x1.2 DIGITAL DIFFERENTIAL ANALYZER Suatu teknik untuk menghasilkan garis lurus adalah dengan menggunakan persamaan diferensial untuk garis lurus: dy dx ∆y = kons . y1 dan x2. Cara mengatasi yang biasa digunakan adalah dengan melakukan perhitungan hanya kurang lebih sepanjang garis serta mereduksi perhitungan sampai seminimal mungkin dengan menggunakan bilangan integer.

y1) then Length = abs(x2. y1) dan (x2.0.x1) else Length = abs(y2. Untuk DDA sederhana. Rutin digital differential analyzer (DDA) untuk rastersasi garis Titik awal dan akhir adalah (x1. Integer(y)) x = x + ∆x y = y + ∆y i=i+1 end while finish contoh1: Buat garis dari (0. menghitung panjang garis if abs(x2.5 y = 0. Inisialisasi x1 = 0 y1 = 0 x2 = 5 y2 = 5 Length = 5 ∆x = 1 ∆y = 1 x = 0. =0 atau >0.1 sesuai nilai argumen apakah <0.0) ke (5.y1) end if memilih yang terbesar dari ∆x atau ∆y untuk unit raster ∆x = (x2.x1) >= abs(y2.5) dengan menggunakan DDA.Analizer (DDA).y1)/Length gunakan fungsi Sign agar algoritma berjalan di seluruh kuadran x = x1 + 0.x1)/Length ∆y = (y2.5*Sign(∆x) y = y1 + 0. antara ∆x atau ∆y.5*Sign(∆y) loop utama i=1 while(i<=length) Plot(Integer(x). Sign mengembalikan nilai –1. y2) diasumsikan tidak sama.5 . yang terbesar dipilih sebagai unit raster.

maka piksel pada posisi (5.5 3.5) akan diaktifkan. Sebagai tambahan.5 4.5) akan menghasilkan titik akhir yang tidak tepat (lihat gambar 2-2).0) X 0.loop utama I Plot 1 2 3 4 5 (0.5 (2. Hal ini akan menyebabkan hasil yang tidak diharapkan.5 (4. Jika i diinisialisasi 0 sebagai pengganti 1.1) 2.5 5.3) 4.0) ke (-8.5 1.4) 5.5) akan diaktifkan dua kali.5 (1.5 Y 0.5 1. pertama pada akhir dari garis yang pertama dan kedua pada awal garis yang kedua.5 5 4 3 2 1 0 0 1 2 3 4 Gambar 2-2 5 Hasilnya terlihat pada gambar 2-2. piksel di posisi (5. Inisialisasi x1 = 0 y1 = 0 .2) 3. Contoh2: Buat garis dari (0. Hal ini menyebabkan piksel menjadi lebih terang dan/atau piksel mempunyai warna yang salah. jika dua garis digambar secara berurutan. pengaktifan piksel pada posisi (5.5 (3.5 2. Jika titik awal berada di pojok kiri bawah. Perhatikan bahwa titik awal dan akhir terlihat tepat dan piksel yang terpilih mempunyai jarak yang sama sepanjang garis.-4) dengan menggunakan DDA.

4) dan (8. Jadi garis menjadi tergantung pada orientasi dan tidak sesuai dengan syarat umum di atas.-2) -4.5 loop utama i Plot 1 2 3 4 5 6 7 8 (-1.0 -3.-4) akan terlihat bahwa rasterisasi garis condong ke salah satu bagian (dalam hal ini bawah) dari garis yang sebenarnya.5 (-2.5 -8 -7 -6 -5 -4 -3 -2 -1 0 0 -1 -2 -3 -4 Gambar 2-3 Meskipun hasil yang tampak dalam gambar 2-3 kelihatan bisa diterima. Sehingga harus digunakan algoritma yang .-3) -6.-3) -5. Lebih jauh.5 -3.0 -4.5 -4.5 y = -0.5 Y 0. Selain itu titik tambahan terjadi pada akhir dari garis.5 -2.5 (-4. hasilnya akan berbeda lagi.5 (-3.0) ke (-8.5 (-7. jika fungsi integer diasumsikan menggunakan fungsi floor (pembulatan ke bawah).5 -1.5 (-6.5 -1.5 x = -0.-1) x -0.-4) -7.0 -2.x2 = -8 y 2 = -4 Length = 8 ∆x = -1 ∆y = -0.-4) -8. pada garis dari (0.0 -1.-2) -3.5 (-8.-1) -2.5 (-5.

0) Algoritma tersebut dirancang dengan bagus sehingga hanya tanda dari kondisi error ini yang perlu diperiksa.1) (1.1) ? ? x (0. Jarak ini disebut sebagai error. algoritma Bresenham juga cocok digunakan pada CRT. Perhatikan bahwa jika gradien dari garis yang melalui (0. Increment terhadap variabel yang lain dapat bernilai 0 atau1 tergantung pada jarak antara lokasi aktual dengan lokasi piksel grid terdekat. Untuk gradien tepat ½ maka kita dapat memilih salah satu dari keduanya. Untuk melaksanakan hal itu algoritma ini selalu increment 1 unit baik x maupun y tergantung pada gradien garisnya.3 ALGORITMA BRESENHAM Meskipun sebenarnya dibuat untuk plotter. maka pada saat x=1 garis dengan y=1 akan lebih dekat daripada garis dengan y=0. atau akurasi dari posisi titik akhir disesuaikan. 1.rumit dan lambat.0) Gambar 2-4 (1.0) lebih dari ½. Pada gambar 2-4 diperlihatkan sebuah garis pada oktan pertama.1) lebih baik untuk dipilih daripada titik (1. Sehingga titik (1.0). y (0. Dalam hal ini kita memilih (1. Jika gradien kurang dari ½ maka berlaku sebaliknya. . yaitu garis dengan gradien antara 0 dan 1.1). Algoritma tersebut mencari lokasi raster yang optimal untuk merepresentasikan garis lurus. Dengan kata lain algoritma ini kurang bagus karena harus dibentuk dengan menggunakan floating point.

1) menjadi pilihan yang lebih baik. Di sini e bernilai positif sehingga garis melalui atas pertengahan titik.0) dapat ditentukan dengan menjumlahkan gradien dari garis pada nilai dari kondisi error. Sebelum melanjutkan pada titik berikutnya. Sehingga y di-increment satu unit.5 0 -0. Karena yang diperlukan hanya tanda dari kondisi error.1 0 0 1 0. nilai dari kondisi error pada titik raster satu unit berikutnya (1. garis akan berada di bawah dari pertengahan piksel. maka nilai error diinisialisasi dengan -½. Sehingga jika gradien dari garis lebih dari atau sama dengan ½.5 -1 Gambar 2-5 1 2 3 Tidak semua garis tepat berada di titik raster. Elemen raster pada level vertikal yang lebih tinggi (2. Hal ini diperlihatkan pada gambar 2-5 di mana sebuah garis dengan gradien 3/8 yang melalui titik raster (0. Juga diperlihatkan perhitungan error dalam merepresentasikan garis dengan piksel diskrit. Jadi.0) dan secara berurutan melalui tiga titik.0). Kemudian increment lagi kondisi error dengan gradien sehingga menghasilkan: e = -1/8 + 3/8 = ¼ pada titik raster berikutnya (2. maka: e = -½ + 3/8 = -1/8 karena e negatif. yaitu: e=e+m dimana m adalah gradien garis. Sehingga piksel pada level horisontal yang sama dengan titik sebelumnya lebih baik dipilih sehingga y tidak di-increment. kondisi error direinisialisasi terlebih dahulu. Dalam hal ini karena e diinisialisasi -½. . Hal itu dilakukan dengan mengurangi error dengan 1.

e real inisialisasi variabel x = x1 y = y1 ∆x = x2 .1 = -3/8 Karena e negatif.y1 e = ∆y /∆x – ½ loop utama for i=1 to ∆x Plot(x. Inisialisasi x=0 y=0 ∆x = 5 ∆y = 5 e=1–½=½ loop utama i Plot e x y ½ 0 0 1 (0.0) -½ 0 1 ½ 1 1 2 (1. y.5) dengan menggunakan algoritma Bresenham.y) while(e>=0) y=y+1 e=e-1 end while x=x+1 e = e + ∆y /∆x next i finish contoh: Buat garis dari (0. Algoritma Bresenham untuk rasterisasi garis pada oktan pertama Titik awal dan akhir adalah (x1.2) . ∆x. Hal-hal di atas menunjukkan bahwa kondisi error merupakan penentu dari perubahan nilai y pada garis yang diinginkan pada tiap-tiap elemen raster dimulai dari -½. ∆y diasumsikan integer.1) -½ 1 2 ½ 2 2 3 (2. nilai y tidak di-increment.e = ¼ .x1 ∆y = y2 . y1) dan (x2. x.0) ke (5. y2) diasumsikan tidak sama.

transformasi sederhana ε = 2*e*∆x è e = ε /(2*∆x) dari kondisi error pada algoritma sebelumnya menghasilkan algoritma integer. Unit raster ini dapat diaktifkan dengan merubah looping for-next menjadi 0 ke ∆x.3) -½ ½ 5 (4. Hal ini tentu saja mengurangi kecepatan dari pembangkitan garis tersebut. Untuk meningkatkan kecepatan tersebut digunakan perhitungan dengan menggunakan bilangan integer. Unit raster pertama pada (0.5) tidak diaktifkan.4 ALGORITMA BRESENHAM INTEGER Algoritma Bresenham di atas memerlukan penggunaan floating point dalam perhitungannya.4) -½ ½ 2 3 3 4 4 5 3 3 4 4 5 5 5 4 3 2 1 0 0 1 2 3 4 Gambar 2-6 5 Hasilnya ditunjukkan pada gambar 2-6. 1. Karena yang penting hanyalah tanda dari kondisi error.0) dapat dihilangkan dengan memindah statemen Plot ke posisi tepat sebelum next i. Perhatikan bahwa unit raster pada (5. .-½ ½ 4 (3.

Kapan x atau y dinaikkan +1 tergantung dari kuadrannya (Lihat gambar 2-7). y dinaikkan 1 dan kondisi error digunakan untuk menentukan kapan x dinaikkan. . Hal itu dilakukan dengan mempertimbangkan kuadran di mana garis tersebut berada beserta kemiringannya.y) while(ε>=0) y=y+1 ε = ε – 2*∆x end while x=x+1 ε = ε + 2*∆y next i finish è e = ε ∆y ∆x − 1 2 ∆y 1 2 * ∆x ε 2 * ∆x = = ∆x 2 2 * ∆y − ∆x 2 * ∆x − e = ε * = ε e − 1 = ∆ y ∆ x = ε 2 * ∆ x + 2 * ∆ y 2 * ∆ x è 2 ε 2 * ∆ x ∆ x e + − 2 2 * * ∆ x ∆ x è e 2 * ∆ x 1.Algoritma Bresenham Integer untuk oktan pertama Titik awal dan akhir adalah (x1.5 ALGORITMA BRESENHAM UMUM Implementasi algoritma Bresenham secara penuh memerlukan modifikasi untuk garis yang berada pada oktan yang berbeda. y1) dan (x2. Pada saat nilai absolute dari kemiringan garis lebih dari 1. Semua variabel diasumsikan integer Inisialisasi variabel x = x1 y = y1 ∆x = x2 – x1 ∆y = y2 – y1 ε = 2*∆y -∆x loop utama for i=1 to ∆x Plot(x. y2) diasumsikan tidak sama.

y2) diasumsikan tidak sama.x1) s2 = Sign(y2. =0 atau >0.y y++ y++ x-- x=x-1 y = y+1 x=x-1 y=y-1 x=x+1 y=y+1 x=x+1 y=y-1 x++ x x++ x-- y-- y-- Gambar 2-7 Algoritma Bresenham Integer untuk seluruh kuadran Titik awal dan akhir adalah (x1. Semua variabel diasumsikan integer Sign mengembalikan nilai –1.y1) ε = 2*∆y – ∆x menukar ∆x dan ∆y sesuai dengan kemiringan garis if ∆y > ∆x then temp = ∆x ∆x = ∆y ∆y = temp interchange = 1 else interchange = 0 end if . inisialisasi x = x1 y = y1 ∆x = abs(x2.y1) s1 = Sign(x2.x1) ∆y = abs(y2.0. y1) dan (x2.1 sesuai nilai argumen apakah <0.

y) while(ε>=0) if interchange=1 then x = x + s1 else y = y + s2 end if ε = ε – 2*∆x end while if interchange=1 then y = y + s2 else x = x + s1 end if ε = ε + 2*∆y next i finish Contoh: Buat garis dari (0.-2) 0 -4 -2 5 (-4.0) -16 0 -1 -8 -1 -1 2 (-1.-1) -16 -2 -2 -8 -3 -2 4 (-3. Inisialisasi x=0 y=0 ∆x = 8 ∆y = 4 s1 = -1 s2 = -1 Interchange = 0 ε=0 loop utama i Plot X Y ε 0 0 0 1 (0.-1) 0 -2 -1 3 (-2.-2) -16 -4 -3 -8 -5 -3 6 (-5.-3) .0) ke (-8.-4) dengan menggunakan algoritma bresenham.loop utama for i=1 to ∆x Plot(x.

6 PEMBANGKITAN LINGKARAN . . Untuk memulai. Lihat gambar 2-9. Bagian yang lain dapat dihasilkan dengan pencerminan secara berturut-turut. Salah satu algoritma yang paling mudah dan efisien adalah algoritma Bresenham. Pada sub bab ini kita akan membahas algoritma pembangkitan lingkaran. Hasil kuadran pertama ini dicerminkan pada garis y=0 untuk menghasilkan kuadran yang kedua. elips. parabola. seperti lingkaran. Dan akhirnya kombinasi dari hasil-hasil tersebut dicerminkan pada garis x=0 untuk melengkapi lingkaran. Oktan kedua dapat dihasilkan dengan pencerminan oktan pertama terhadap garis y=x untuk menghasilkan kuadran pertama. perhatikan bahwa hanya satu oktan dari lingkaran yang perlu untuk dibangkitkan.ALGORITMA BRESENHAM Selain rasterisasi garis lurus penting juga untuk mampelajari rasterisasi fungsi yang lebih rumit. serta hiperbola.0 7 (-6.-3) -16 -8 8 (-7.-4) 0 -6 -6 -7 -8 -3 -4 -4 -4 -8 -7 -6 -5 -4 -3 -2 -1 0 0 -1 -2 -3 -4 Gambar 2-8 1.

lalu secara searah jarum jam y akan berkurang terhadap fungsi x pada kuadran pertama (lihat gambar 2-10). Kali ini kita akan menggunakan cara yang pertama. x=R. lalu secara berlawanan arah jarum jam x akan berkurang terhadap fungsi y pada kuadran pertama. y (0.y kuadran 1 dicerminkan thd grs y (x=0) oktan 1 dicerminkan thd grs y=x digenerate 3 2 4 5 6 7 1 8 x separuh lingkaran dicerminkan thd grs x (y=0) Gambar 2-9 Untuk membuat lingkaran kita akan mempelajari algoritma Bresenham untuk kuadran pertama.R) R x Gambar 2-10 . Kita juga bisa memulai dari y=0. Perhatikan bahwa algoritma dimulai pada x=0. y=R. Pusat lingkaran serta titik awal dianggap tepat berada pada piksel.

yi .1)2 . . Selisih antara kuadrat jarak dari pusat lingkaran ke piksel diagonal (xi + 1.yi-1) Gambar 2-11 Perhitungan dapat disederhanakan dengan memperhatikan bahwa hanya ada lima kemungkinan tipe perpotongan dari lingkaran dan piksel grid seperti yang terlihat pada gambar 2-12.1) dan titik lingkaran sebenarnya adalah: ∆i = (xi + 1)2 + (yi . kita juga hanya akan menggunakan tanda dari kondisi error agar hanya bilangan integer saja yang digunakan. serta diagonal ke kanan bawah (mD). mH = |(xi + 1)2 + (yi)2 . Ketiganya adalah vertikal ke bawah (mV).yi-1) (xi+1.yi) mV (x i. Algoritma akan memilih piksel berikutnya yang memiliki jarak minimum dengan lingkaran sebenarnya.R2| mD = |(xi + 1)2 + (yi .R2| mV = |(xi)2 + (yi . horisontal ke kanan (mH).Pada pemilihan piksel berikutnya.yi) mH mD (x i+1. hanya ada tiga kemungkinan piksel yang akan menghasilkan lingkaran yang diinginkan.1)2 -R2 Seperti pada algoritma Bresenham untuk pembangkitan garis.1)2 -R2| (x i.

sehingga: (xi + 1)2 + (yi)2 -R2 >= 0 (xi + 1)2 + (yi .yi+1) (x i. (mD) lebih besar dari jarak antara lingkaran sebenarnya dengan piksel horisontal (mH).R2| . Jadi jika δ pilihlah mH(xi + 1.(x i+1. Jadi kita harus memilih titik mH atau mD.|(xi + 1)2 + (yi . sedangkan jika δ pilihlah mD(xi + 1.1)2 -R2| = Jika δ maka jarak antara lingkaran sebenarnya dengan piksel diagonal <0.yi-1) 3 5 Gambar 2-12 Jika ∆i<0.yi) mH mD (x i+1.yi) 2 mV 1 (xi+1. Untuk menentukannya. yi <=0 >0 1).yi-1) 4 (x i.R2 + (xi + 1)2 + (yi .1) berada di dalam lingkaran yang sebenarnya. yakni kondisi 1 dan 2 pada gambar 2-12. yi . yi). maka titik diagonal (xi + 1. maka akan diperoleh: .1)2 -R2 < 0 jadi. Perhitungan di atas bisa disederhanakan dengan memperhatikan bahwa pada kondisi 1 piksel diagonal selalu berada di dalam lingkaran sedangkan piksel horisontal selalu berada di luar lingkaran. pada kondisi 1 kita memerlukan selisih antara kuadrat jarak dari lingkaran sebenarnya ke titik mH dan kuadrat jarak dari lingkaran sebenarnya ke titik mD. yaitu: δ |(xi + 1)2 + (yi)2 . δ (xi + 1)2 + (yi)2 .yi-1) (x i-1.1)2 -R2 = dengan manambahkan (yi .1)2 dan mengurangi dengan (yi)2.

δ= (xi + 1)2 + (yi . sehingga: (xi + 1)2 + (yi .1)2 . Jika ∆i>0.1).R2| ’ Jika δ maka jarak antara lingkaran sebenarnya dengan piksel vertikal ’ <0.1)2 -R2 ’ dengan manambahkan (xi + 1)2 dan mengurangi dengan (xi)2. yi . Sedangkan jika kita berada pada kondisi 5 maka piksel yang kita pilih adalah mD(xi + 1.|(xi)2 + (yi . Perhitungan di atas bisa disederhanakan dengan memperhatikan bahwa pada kondisi 3 piksel diagonal selalu berada di luar lingkaran sedangkan piksel horisontal selalu berada di dalam lingkaran. y i). yi .R2] . yaitu: δ= |(xi + 1)2 + (yi .1).xi) .1)2 -R2 >= 0 (xi)2 + (yi .1) yang akan kita pilih.1 = dengan persamaan dari ∆i maka: δ 2(∆i + yi) . maka titik diagonal (xi + 1.1)2 -R2 + (xi)2 + (yi .1 ’ dengan persamaan dari ∆i maka persamaan akan menjadi: δ= 2(∆i .δ 2[(xi + 1)2 + (yi .1)2 .R2] + 2yi . yi ’ >0 . yakni kondisi 3 dan 4 pada gambar 2-12. sedangkan jika δ pilihlah mV(xi.1)2 -R2| .2xi . maka akan diperoleh: δ= 2[(xi + 1)2 + (yi .1).1 ’ Jika berada pada kondisi 2 kita tentu saja akan memilih piksel mH(xi + 1. (mV) lebih besar dari jarak antara lingkaran sebenarnya dengan piksel diagonal (mD).1) berada di luar lingkaran yang sebenarnya. Jadi kita harus memilih titik mV atau mD.1)2 . Jadi jika δ ’ <=0 pilihlah mD(xi + 1. . pada kondisi 3 kita memerlukan selisih antara kuadrat jarak dari lingkaran sebenarnya ke titik mV dan kuadrat jarak dari lingkaran sebenarnya ke titik mD.1)2 -R2 < 0 jadi.1 = yang menjadi jauh lebih sederhana. dan jika berada pada kondisi 4 maka piksel mV(xi. yi . yi . Untuk menentukannya.

1 ∆i = ∆i + 2xi .1 ’ if δ<= 0 then 20 ’ if δ> 0 then 30 ’ melakukan perpindahan piksel piksel mH 10 xi = xi + 1 ∆i = ∆i + 2xi + 1 go to 1 piksel mD 20 xi = xi + 1 y i = yi . Finish . 3 atau 4.Algoritma lingkaran Bresenham untuk kuadran pertama Semua variabel diasumsikan integer Inisialisasi xi = 0 yi = R ∆i = 2(1-R) Limit = 0 1 Plot(xi.1 = if δ 0 then 10 <= if δ 0 then 20 > menentukan berada di kondisi 3 atau 4 3 δ= 2∆i + 2xi .2y i + 1 go to 1 piksel mV 30 y i = yi .yi) menentukan berada di kondisi 1 atau 2.2y i + 1 go to 1 4. atau 5 if yi <= Limit then 4 if ∆i < 0 then 2 if ∆i > 0 then 3 if ∆i = 0 then 20 menentukan berada di kondisi 1 atau 2 2 δ 2∆i + 2y i .1 ∆i = ∆i .

Inisialisasi x=0 y=0 ∆i = 2(1 .4) 4 3 7 3 (7.7) -3 7 5 6 (5.8) -12 3 3 7 (3.5) 9 -11 7 4 (7.8) = -14 Limit = 0 loop utama Plot X y ∆i δ δ ’ -14 0 8 (0. Kuadran yang lain dapat kita hasilkan dengan mudah menggunakan algoritma di atas.7) -3 -11 4 7 (4.6) 1 5 6 5 (6.3) 18 -7 8 2 (8.8) -6 -7 2 8 (2.0) Hasilnya ditunjukkan pada gambar 2-13. .1) 18 17 8 0 (8.8) -11 -13 1 8 (1.Contoh: Buat kuadran pertama lingkaran dengan jari-jari 8. Gunakan algoritma Bresenham.2) 17 19 8 1 (8.

0) Gambar 2-13 (8.0) .8) x (0.y (0.

maka: [x a 0 y]   = [ ax 0 1 y ] = [ x' y '] . serta dilatasi. Karena pada perhitungan matrik perkalian dengan matrik identitas sama dengan perkalian dengan 1 pada perhitungan biasa.1 TRANSFORMASI DUA DIMENSI Titik beserta garis yang menghubungkannya digunakan untuk merepresentasikan obyek. maka jika matrik P[x y] dikalikan dengan matrik identitas hasilnya adalah tidak ada perubahan [x koordinat dari titik P. 1 0 y]  = [x 0 1 y ] = [ x' y '] Jika d diberi nilai 1 dan b serta c diberi nilai 0. sehingga kemampuan untuk mentransformasikannya merupakan dasar dari grafika komputer.1 TRANFORMASI TITIK Perhatikan hasil dari perkalian dari matrik [x y] yang berisi koordinat dari sebuah titik P dengan matrik transformasi 2x2: [x a b  y]   = [( ax + by ) ( cx + dy )] = [ x ' c d  y '] Notasi di atas berarti bahwa koordinat awal x dan y ditransformasikan ke x’dan y’ di mana x’ . Untuk merepresentasikan sebuah obyek. =(ax+cy) dan y’ =(bx+dy). kita mungkin akan memerlukan operasi-operasi transformasi seperti refleksi.1. 2.TRANSFORMASI DUA DIMENSI DAN METODE PARAMETRIK 2. rotasi. Jadi x’ dan y’ adalah koordinat transformasi dari titik P.

Dan ketika a=d=1. Jika kita memberi nilai a=d=1. Hal ini disebut dengan efek shear. transformasi menghasilkan pergeseran sejajar sumbu y. Jika b=c=0. Hasil dari transformasi di atas terlihat pada gambar 2-1a. seperti yang ditunjukkan pada gambar 2-1c. Sekarang perhatikan efek dari diagonal sekunder. . d=1. Jika b=c=0. sedangkan a=-1: [x − 1 0 y]   = [− x  0 1 y ] = [ x' y '] Dan terjadi refleksi terhadap sumbu y. d=-1. Untuk membuktikannya perhatikan notasi di bawah ini.Dimana karena x’ =ax menghasilkan perubahan skala pada komponen x dari vektor posisi. dan a=d<0 refleksi terjadi terhadap titik awal. Sekarang perhatikan notasi di bawah ini: [x a 0  y]   = [ ax dy ] = [ x ' 0 d  y '] Notasi di atas menghasilkan perubahan skala pada koordinat x dan y dari koordinat awal vektor P. akan terjadi refleksi terhadap sumbu atau bidang. sementara y’ tergantung secara linier terhadap koordinat awal. a=1. seperti yang terlihat pada gambar 2-1f. seperti yang ditunjukkan gambar 2-1b. Hal ini ditunjukkan pada gambar 2-1d dengan a=-1. Perhatikan bahwa baik pada refleksi maupun scaling dari koordinat hanya melibatkan diagonal primer dari matrik transformasi. Jika a=d>1 maka akan terjadi perbesaran terhadap koordinat P. maka terjadi refleksi terhadap sumbu x. b=0. seperti yang ditunjukkan pada gambar 2-1e. maka: [x 1 b y]   = [ x (bx + y )] = [ x ' 0 1 y '] Perhatikan bahwa koordinat x dari titik P tidak berubah. dan c=0. Jika a dan/atau d bernilai negatif. dimana b=c=0. sedangkan jika 0<a=d<1 maka yang akan terjadi adalah sebaliknya. dan d=-1.

2 ROTASI y 8 6 4 2 x 0 2 4 6 8 Gambar 2-2 Perhatikan segitiga ABC yang ditunjukkan oleh gambar 2-2. Segitiga tersebut dirotasikan 90ο dari posisi awal berlawanan arah dengan jarum jam dengan matrik transformasi:  0 1 − 1 0   .y y y P' P P' x (a) P' P x (c) P x (e) y P' y P y P P' P x (b) P' (d) x (f) x Gambar 2-1 2.1.

dihasilkan dengan menggunakan matrik transformasi: − 1 0   0 − 1   Dan rotasi 270ο derajat terhadap posisi awal menggunakan matrik: 0 − 1 1 0    Tentu saja matrik identitas: 1 0 0 1   Akan menghasilkan rotasi 0ο atau 360ο terhadap posisi awal. Contoh-contoh di atas menggambarkan rotasi tertentu terhadap posisi awal: 0ο. maka: 3 − 1  1 3 4 1  0 1 = − 1 4   − 1 0   − 1 2 2 1      Yang menghasilkan segitiga A’ C’ Rotasi 180ο terhadap posisi awal akan B’ . 90ο. Bagaimana jika kita menginginkan rotasi terhadap posisi awal dengan sudut yang berubah-ubah? . 180ο.Jika kita menggunakan matrik 3x2 yang berisi koordinat dari segitiga. 270ο.

1.3 REFLEKSI sin θ  cosθ   . Y P' | | | | | y' | | | | P | | y | | θ φ Gambar 2-3 X -----------x---------------------------x'------------------ Vektor posisi P dan P’dituliskan sebagai: P ' = [' x P = [ y ]= [cosφ r sin φ] x r y ']= [cos(φ+ θ ) r sin(φ+ θ ) ] r Berdasarkan rumus matematika penjumlahan sudut dimana: cos(φ±θ ) = cosφcosθ ±sin φcosθ sin(φ±θ ) = cosφsin θ ±sin φcosθ Diperoleh: P ' = [' x y ']= [(cosφcosθ − sin φsin θ ) r (cosφsin θ + sin φcosθ ) ] r Dengan menggunakan definisi x dan y maka P’dapat ditulis sebagai: P ' = [' x y ']= [ cosθ − y sin θ x x sin θ + y cosθ ] Sehingga x’dan y’dalam bentuk matrik diperoleh:  cosθ − sin θ  2.Perhatikan gambar 2-3. Vektor posisi P dengan panjang r dan sudut φ terhadap sumbu x dirotasikan dengan sudut θ ke P’ .

Y F'' E'' D'' D F E E' F' D' Gambar 2-4 X Dua refleksi dari segitiga DEF ditunjukkan pada gambar 2-4. refleksi terhadap sumbu y diperoleh dengan matrik: − 1 0  0 1   . Sebuah refleksi terhadap garis y=0 (sumbu x) diperoleh dengan menggunakan matrik: 1 0  0 − 1   Dalam hal ini titik-titik segitiga D’ F’diperoleh dari: E’ 8 1 8 − 1  7 31 0  = 7 − 3  0 − 1    6 − 2 6 2     Sama seperti sumbu x.

Untuk lebih jelasnya perhatikan contoh di bawah ini: Segitiga ABC pertama direfleksikan terhadap sumbu x. . jika determinan dari suatu matrik transformasi sama dengan –1. hasilnya akan sama dengan apabila segitiga tersebut dirotasikan dengan sudut 270ο. maka transformasi akan menghasilkan suatu refleksi. Secara umum. titik-titik D’E’F’ diperoleh dari: ’ ’ ’ 8 1  1 8 0 1  7 3   1 0 = 3 7  2 6 6 2     Seperti juga pada garis y=x.Sedangkan refleksi terhadap garis y=x terjadi untuk 0 1 1 0   Pada transformasi di atas. Jika dua refleksi terhadap garis dilakukan terhadap suatu posisi tertentu. refleksi terhadap garis y=-x diperoleh dengan:  0 − 1 − 1 0    Masing-masing matrik refleksi di atas mempunyai determinan sama dengan –1. maka operasi tersebut akan menghasilkan/sama dengan sebuah rotasi terhadap posisi tersebut. kemudian direfleksikan terhadap garis y=-x.

Y D F E 2 -2 -4 -6 -8 F'' 4 E' D' E'' D'' 6 F' 8 X Gambar 2-5 Pertama refleksikan segitiga ABC terhadap sumbu x: 5 3 5 − 3 5 11 0  = 5 − 1   0 − 1     7 2 7 − 2     Kemudian refleksikan lagi segitiga tersebut terhadap garis y=-x: 5 − 3 3 − 5 5 − 1 0 − 1 = 1 − 5  − 1 0      7 − 2   2 − 7  Hasilnya akan sama dengan rotasi dengan sudut 270ο: 5 3 3 − 5  5 10 − 1 = 1 − 5   1 0      7 2   2 − 7   .

Jika nilainya tidak sama akan terjadi distorsi.1. Secara ’ ’ ’ umum.4 SCALING Seperti yang telah kita bicarakan dalam subbab transformasi titik di atas. perbesaran 2 kali dari segitiga tersebut akan terjadi. Sedangkan transformasi dengan menggunakan matrik: 1 2 0 0 3   Menghasilkan scaling nonuniform.2. yang tampak pada segitiga A’B’C’. Gambar 2-6 Segitiga ABC ditransformasikan sehingga menghasilkan segitiga A’ C’ dimana B’ . jika matrik: a b  c d    . scaling ditentukan oleh nilai dari dua elemen diagonal primer matrik. Y 8 6 4 2 C B C'' A 2 4 6 8 10 A'' 12 X A' B'' C' B' seperti yang terlihat pada gambar 2-6. terjadi scaling uniform. Jika 2 0 0 2   matrik: Digunakan sebagai operator pada titik-titik segitiga.

akan tetapi hal tersebut tidak efisien karena memerlukan perhitungan fungsi trigonometri berulang-ulang sehingga akan memperlambat pembangkitan lingkaran. b=c=0 akan menghasilkan scaling nonuniform. maka akan terjadi perbesaran. jika a=d>1. Sedangkan jika a=d<1 obyek akan diperkecil. Pada subbab ini kita akan membahas algoritma pembangkitan lingkaran dan elips dengan menggunakan metode parametrik. Sebelumnya kita ingat bahwa meskipun jika persamaan tersebut mengincrement θ akan menghasilkan output yang bagus. akan menghasilkan scaling uniform. Untuk scaling uniform. 2. Sedangkan jika a≠d.1 LINGKARAN Sebuah lingkaran dengan pusat (0. yaitu metode parametrik. 2.2. .Dengan a=d. untuk menggambar suatu obyek kta dapat menggunakan metode yang lain.0) dan jari-jari r direpresentasikan oleh: x = r cosθ y = r sin θ 0 <= θ <= 2π Gambar 2-7 y r θ r cos θ r sinθ x Dimana θ adalah parameternya.2 PARAMETRIK Selain metode raster scan seperti yang telah dibahas pada bab pertama. b=c=0.

Sehingga algoritma ini hanya memerlukan empat perkalian. satu kali saja.2 ELIPS Pada lingkaran. serta satu pengurangan saja dalam setiap perulangannya. Sehingga koordinat kartesius dari sembarang titik pada lingkaran yang berpusat di (0. Akan tetapi jika increment sudut tersebut kita gunakan untuk menggambar . Selain itu distribusi titik-titik tersebut merata sehingga kita dapat menggunakan increment sudut yang sama. satu penjumlahan. 2. maka δ parameter yang increment di antara titik-titik tersebut merupakan suatu .0) adalah: ) xi + 1 = r cos(θi + δ ) yi + 1 = r sin(θi + δ Dimana θi adalah nilai dari parameter yang menghasilkan xi dan yi. Tentu saja hal ini sangat efisien dan akan mempercepat pembangkitan lingkaran. nilai dari sin δ dan cos δhanya perlu dihitung .Perhatikan bahwa lingkaran berada dalam range parameter θ dari 0 sampai 2π dan asumsikan terdapat sejumlah titik-titik pada keliling lingkaran. Dengan menggunakan rumus matematika penjumlahan sudut diperoleh: xi + 1 = r (cosθi cos δ− sin θi sin δ ) yi + 1 = r (cosθi sin δ+ sin θi cos δ ) Sesuai definisi x dan y dengan mengganti θ dengan θi: xi = r cosθi yi = r sin θi Sehingga akan dihasilkan persamaan yang merepresentasikan rotasi dari titik xi dan yi dengan sudut δ : xi + 1 = xi cos δ− yi sin δ yi + 1 = xi sin δ+ yi cos δ Karena δ konstan dan sama dengan 2π /(n-1) dimana n adalah jumlah titik-titik dari lingkaran tersebut.2. konstanta. sejumlah titik yang berjarak sama menghasilkan gambar yang bagus jika dihubungkan dengan garis lurus.

Dengan mengubah nilai θ antara 0 sampai 2π akan memenuhi seluruh elips. Dengan memeriksa turunan dari x dan y: dx = -a sin θ dθ dy = b cos θ dθ . Distribusi titik yang diinginkan dari sebuah elips dengan pusat (0. Dengan jumlah increment yang cukup maka akan diperoleh hasil yang lebih baik. Yang kita inginkan adalah sedikit increment pada panjang garis keliling ketika mendekati bagian ujung dimana lengkungannya besar dan banyak increment pada panjang garis keliling ketika berada di bagian sisi dimana lengkungannya kecil. sumbu mayor a dan sumbu minor b akan dihasilkan oleh persamaan: x = a cos θ y = b sin θ y x Gambar 2-8 dimana θ adalah parameternya.0). Hal itu disebabkan oleh karena mendekati bagian ujung dari elips lengkungan yang terjadi terlalu besar untuk direpresentasikan dengan titik yang hanya sedikit. maka akan diperoleh hasil yang tidak sesuai dengan apa yang kita harapkan.elips. Alternatif yang digunakan adalah dengan menggunakan increment yang sama sepanjang keliling elips.

dihasilkan jumlah titik yang lebih banyak. akan dihasilkan karena hanya memerlukan empat perkalian. Lebih jauh. n adalah jumlah titik pada keliling =2π dan θi adalah nilai dari parameter yang menghasilkan xi dan yi. Ketika θ mendekati π atau 3π yaitu sepanjang sisi. sekali lagi algoritma yang efisien .0) adalah: xi + 1 = a cos(θi + δ ) yi + 1 = b sin(θi + δ ) Dimana δ /(n-1) adalah increment dalam θ.menunjukkan bahwa increment garis keliling yang diinginkan akan dihasilkan secara otomatis. Sesuai dengan persamaan dari lingkaran. Sedangkan sepanjang sisi. |dx| ≈0 . serta satu pengurangan saja dalam setiap perulangannya. koordinat kartesius dari sembarang titik pada elips yang berpusat di (0. dan |dy| ≈bdθ. Ketika θ mendekati 0 atau π yaitu mendekati pinggir. perhatikan bahwa jika a=b maka akan dihasilkan increment garis keliling yang sama dan akan menghasilkan sebuah lingkaran. satu penjumlahan. |dx| ≈adθ /2 /2 dan |dy| ≈ 0. dimana lengkungannya kecil akan dihasilkan jumlah titik yang lebih sedikit. Jadi ketika mendekati ujung dimana lengkungannya besar. Dengan menggunakan rumus matematika penjumlahan sudut diperoleh: ) xi + 1 = a (cosθi cos δ− sin θi sin δ ) yi + 1 = b(cosθi sin δ+ sin θi cos δ Sesuai definisi x dan y dengan mengganti θ dengan θi akan dihasilkan persamaan: a  xi + 1 = xi cos δ−  yi sin δ b  b  yi + 1 =  xi sin δ+ yi cos δ a  Karena δ a dan b adalah konstan. Nilai perbandingan increment garis keliling di ujung dengan sisi adalah b/a. .

.. Secara ....1c Pemecahannya adalah dengan mengurangi persamaan (a) dengan persamaan (b) dan mengurangi persamaan (c) dengan persamaan (b)..... Persamaannya adalah: ( x1 − h) 2 + ( y1 − k ) 2 = R 2 ...... y' y x'' y'' P2 P3 P1 x x' Gambar 2-9 Seperti yang terlihat pada gambar 2-9 titik-titiknya adalah P1(x1.......................y3)..........1a ( x 2 − h) 2 + ( y 2 − k ) 2 = R 2 .................. Kita akan menggambar lingkaran melalui suatu segitiga.........y1)... P2(x2....1b ( x3 − h) 2 + ( y3 − k ) 2 = R 2 .... yang pertama berada di luar segitiga.............. sedangkan pada contoh yang kedua lingkaran tersebut berada di dalam segitiga....y2) dan P3(x3.......................3 IMPLEMENTASI Salah satu contoh implementasi yang sederhana dan umum yang akan kita bahas adalah menggambar lingkaran melalui tiga buah titik........2.

...4c Mengurangkan (a) dari (b) dan (c) menghasilkan 2 buah persamaan linear.. Lebih jauh. Sebagai tambahan..... 2 [ x '3 x' 2 ( x' 2 − x ' 3 ) + y ' 2 x ' 3 − y ' 3 x ' 2 ] 2 .....4b ( x '3 − h' ) 2 + ( y ' 3 − k ' ) 2 = R 2 ...... Solusinya adalah [(b)-(a)]x3’ -[(c)-(a)]x2’ yang menghasilkan: ....5 2( y ' 2 x ' 3 − y ' 3 x ' 2 ) k' = x' 2 + y' 2 − 2 y' 2 k ' 2 ............4a ( x ' 2 − h' ) 2 + ( y ' 2 − k ' ) 2 = R 2 ..........................7 Translasikan kembali h’dan k’sehingga menghasilkan h dan k.... maka metode alternatif harus digunakan......................... sehingga persamaannya menjadi: h' 2 + k ' 2 = R 2 .. Hasilnya diperoleh untuk k: k= 2 2 2 2 2 2 [( x12 − x 2 ) + ( y12 − y 2 )]( x3 − x2 ) − [( x3 − x2 ) + ( y 3 − y 2 )]( x1 − x 2 ) ....... kondisi untuk memeriksa apakah jari-jarinya tak terbatas (tak terdefinisi) atau titik-titiknya berada pada satu gari (kolinear) tidak dapat dilakukan dengan segera..............6 h' = 2 2 x' 2 R = ( h' 2 + k ' 2 ) 2 .... Persamaan-persamaan tersebut menampakkan beberapa kesulitan.....0)........................................... pemecahannya adalah [(a)-(b)](x3-x2)-[(c)-(b)](x1-x2) dimana huruf dalam kurung siku menunjuk pada persamaan 1. Kesulitan yang dihasilkan oleh persamaan untuk k dan h direduksi dengan mentranslasikan titik P1 ke pusat sistem koordinat (0.. cara ini sekali lagi mempunyai kesulitan jika penyebut dari persamaan 5 dan 6 adalah nol.... h dihitung dari [(a)-(b)] dan persamaan 2 menghasilkan: h= 2 2 ( x12 − x2 ) + ( y12 − y 2 ) − 2k ( y1 − y 2 ) ..... kondisi dimana jari-jarinya tak terbatas (tak terdefinisi) 1 ..3 2( x1 − x 2 ) R ditentukan dari salah satu persamaan 1....2 2[( y1 − y 2 )( x3 − x 2 ) − ( y 3 − y 2 )( x1 − x 2 )] Mirip dengan di atas... Khususnya jika penyebut dari kedua persamaan tersebut sama dengan nol........................lebih khusus...........

5. Dengan matrik transformasi yang sama.0). 4. Translasikan kembali titik pusat lingkaran dengan arah yang berlawanan dari langkah pertama sehingga diperoleh titik pusat lingkaran dari segitiga asal.1 LINGKARAN LUAR SEGITIGA Dalam menggambar lingkaran luar dari suatu segitiga ini. Gambarkan lingkaran yang diinginkan dengan pusat serta jari-jari yang telah diketahui. Rotasikan titik pusat dari lingkaran tersebut dengan sudut yang berlawanan arah dari langkah nomor 2. Translasikan salah satu titik dari segitiga ke pusat dari sistem koordinat (0. 6. Rotasikan segitiga tersebut sehingga titik yang lain berada pada sumbu x positif. B C y B' C' C'' A A'/A'' Gambar 2-10 B'' x 3.3.atau titik-titiknya segaris (kolinear) sekali lagi tidak dapat segera ditentukan. Lihat gambar 2-10. 2. Pada gambar 2-10 diperlihatkan bahwa segitiga ABC telah mengalami operasi translasi dan rotasi sehingga titik A berada di pusat sistem koordinat dan titik B berada pada sumbu x positif sehingga persamaan lingkarannya adalah: . translasikan pula titik-titik yang lain. Untuk itu. 2. Untuk mengatasi kesulitan-kesulitan tersebut gunakan langkah-langkah yang dijelaskan di bawah ini. kita akan menggunakan operasi-operasi transformasi yang telah kita pelajari di atas. seperti yang tampak pula pada gambar 2-10. perhatikan langkah-langkah berikut ini: 1. Cari titik pusat dan jari-jari lingkaran.

x) 2 + y2 + y2 + (yC .x2 (xB .x)2 (xC . sehingga ketiga titik tersebut tidak membentuk segitiga dan tentu saja tidak ada lingkaran yang bisa dibuat dengan melalui ketiga titik tersebut. hal itu hanya akan terjadi jika ketiga titik tersebut berada pada satu garis. Perhatikan bahwa jika y3=0 maka y menjadi sangat besar (tak terdefinisi). y C (b-x) (b-x) a b (c-x) x α A x (c-x) B x c Gambar 2-11 c-x+b–x=c c + b – a = 2x . 2.3.2 LINGKARAN DALAM SEGITIGA Pada dasarnya langkah-langkah untuk membuat lingkaran dalam segitiga adalah sama dengan langkah-langkah untuk membuat lingkaran luar segitiga.y) 2 = R2 = R2 =R 2 (a) (b) (c) dengan mengurangi persamaan (a) oleh persamaan (b) akan didapatkan bahwa x = x2/2 dan dengan mengurangi persamaan (a) oleh persamaan (c) diperoleh y = ½ x3/y3 (x3 – x2) + ½ y3 sehingga berdasarkan persamaan (a) akan diperoleh juga jari-jari lingkaran . Bagaimanapun. Perbedaannya hanya terletak pada pencarian titik pusat dan jari-jari lingkaran. Dari gambar 2-11 bisa didapatkan persamaan untuk mencari titik pusat dan jarijari dari lingkaran dalam segitiga.

sehingga diperoleh x = (c+b-a)/2. Sedangkan untuk mencari y atau jari-jari yaitu: tg α = yC /x y = x tg ½ α Apabila kita sudah mendapatkan pusat dan jari-jari maka titik pusat dapat kita translasi dan rotasikan secara berlawanan arah dan lingkaran tersebut dapat kita gambar. .

i (t ) i =0 0 ≤t ≤1 dimana fungsi basis Bezier atau Bernstein adalah: n  Jn. Kurva Bezier P(t). yaitu kurva Bezier dan kurva B-Spline. bangunan. badan serta sayap pesawat terbang. Disini n adalah derajat dari fungsi basis Bernstein.1 KURVA BEZIER Gambar 3-1 Bentuk dari kurva Bezier ditentukan oleh defining polygon seperti yang terlihat pada gambar 3-1. nilainya adalah jumlah control point –1. seperti otomotif. bailngbaling. botol. . Pada baba ini kita akan mambahas mengenai pembangkitan dua macam kurva. 3. Dalam bidang teknik perancangan dan manufaktur kurva diperlukan untuk berbagai macam produk. dengan (L+1) titik dapat dinyatakan dengan: n P (t ) = ∑ BiJn.KURVA Kurva memegang peranan penting dalam kehidupan kita sehari-hari.i(t) adalah orde-n ke-i dari fungsi basis Bernstein. i (t ) =  t i (1 − t ) n− i i    n  n!  = i  i! ( n − i )!   dengan Jn. lambung kapal. sepatu. dan lain-lain.

Gambar 3-3 Adapun hal-hal yang menjadi persyaratan umum dari kurva Bezier antara lain adalah: 1. Endpoint interpolation Kurva Bezier tidak menginterpolasi semua control point. 4. Seperti yang terlihat pada gambar 3-3. Bukti: P (t ) = ∑ BiJn .Gambar 3-2 Pada gambar 3-2 diperlihatkan hasil dari fungsi basis Bezier. dan 5 titik. i (t ) i =0 n Jn. i (t = 0) = n! n (1) 1 n! =1 = n! (1 − 0) n 0 0 0! ( n − 0)! Untuk t=0 n=0 maka: Untuk t=0 n≠0 maka: . masing-masing 3. tetapi selalu menginterpolasi titik awal dan akhir.

n(1) = Bi . i (t = 1) = = n! (1 − 1) n− i 1i n!(n − i )! n! (0) n− i 1 n!( n − i )! n! = 01 n!( n − i )! =0 Sehingga: P (1) = BiJn. i (1) = BiJn. i ( 0) = B0 Untuk t=1 n=i maka: Jn.Jn. i (t = 0) = =0 Sehingga: n! (1 − 0) n− i 0 i i! ( n − i )! P ( 0) = B 0 Jn . i (t = 1) = = n! (1 − 1) n− i 1i n!(n − i )! n! ( 0) n − n 1 n!( n − n)! n! 0 = 01 n!0! =1 Untuk t=1 n≠i maka: Jn.

. Convex hull Setiap titik pada kurva Bezier berada dalam convex hull dari defining polygon seperti yang terlihat pada gambar 3-5. Linier precision Jika control point ditempatkan sebagai garis lurus maka kurva Bezier yang dibangkitkan harus membentuk garis lurus juga (lihat gambar 3-4). Gambar 3-5 4. kita tidak perlu mentransformasikan seluruh titik dari kurva. Gambar 3-4 3. Affine invariance Untuk mentransformasikan kurva.2. tetapi cukup hanya control point-nya saja. i (t ) N + tr k =0 n • Ternyata untuk mentransformasi cukup dengan mentransformasi control point-nya saja. Bukti: • Dimisalkan titik P(t) akan ditransformasi ke titik baru P’ dengan matrik transformasi (t) N dan offset vektor tr menjadi: P ' (t ) = P (t ) N + tr = ∑ BiJn.

Gambar 3-7 .5. sedangkan defining polygon-nya berisolasi pada empat titik. Karena setiap titik dari kurva Bezier merupakan hasil dari proses dari seluruh control point.2 KURVA B-SPLINE Pembangkitan kurva Bezier mempunyai kelemahan yang diakibatkan oleh sifat global dari fungsi basis Bernstein. Kurva akan berisolasi maksimum dengan satu garis sama dengan isolasi dari defining polygon-nya yaitu jika kurvanya berupa garis lurus. Variation determinishing Kurva Bezier tidak akan berisolasi terhadap sembarang garis lebih banyak dari defining polygon-nya. maka perubahan dari satu control point akan mempengaruhi seluruh kurva. Gambar 3-6 3. Hal ini akan menyulitkan jika kita akan melakukan perubahan secara lokal dalam satu kurva. Pada gambar 3-6 kurva Bezier berisolasi dengan garis pada tiga titik.

x Parameter t berada antara tmin dan tmax sepanjang kurva P(t).. k − 1(t ) ( xi + k − t ) Ni + 1. .. k (t ) t min ≤t ≤t max 2 ≤k ≤n + 1 dimana Bi adalah vektor posisi dari n+1 titik defining polygon dan Ni.. k (t ) = (t − xi ) Ni ..k adalah fungsi basis B-Spline ternormalisasi....1(t ) = 〈 . .k(t) didefinisikan sebagai: 1 → if ( xi ≤t < xi + 1) Ni . Dengan P(t) sebagai vektor posisi sepanjang kurva sebagai fungsi dengan parameter t. kurva B-Spline diperoleh dari persamaan: n+ 1 i =1 P (t ) = ∑ BiNi . 0    → otherwise dan N i . k − 1(t ) + xi + k − 1 − xi xi + k − xi + 1 Nilai dari xi adalah elemen dari knot vektor yang memenuhi persamaan xi≤ i+1. Basis ini bersifat non-global. Sehingga setiap titik mempengaruhi bentuk kurva hanya pada daerah dengan nilai parameter dimana fungsi basisnya tidak nol.. jadi setiap titik Bi berhubungan dengan sebuah fungsi basis yang berbeda.. fungsi basis Ni.Ada basis lain yang dinamakan basis B-Spline yang berisi basis Bernstein dengan sifat khusus. Untuk fungsi basis B-Spline ternormalisasi dengan orde k (derajat k-1).

Untuk kurva B-Spline dengan orde k (derajat k-1) setiap titik dari kurva harus berada di dalam convex hull dari k titik yang berdekatan.Gambar 3-8 Pada dasarnya persyaratan umum dari kurva B-Spline hampir sama dengan persyaratan dari kurva Bezier. Kemudian seluruh titik dari kurva B-Spline harus berada di .

dalam garungan dari seluruh convex hull yang dibentuk oleh k control point. Jika terdapat l control point yang kolinear pada awal atau akhir dari defining polygon yang non-kolinear. k=3). maka jumlah rentang kurva yang terjadi adalah l2k+3 (lihat gambar 3-11. . perhatikan bahwa pada saat k=2 convex hull-nya adalah defining polygon itu sendiri. maka jumlah rentang kurva kolinear yang terjadi adalah l-k+1 seperti yang terlihat pada gambar 3-9 dan 3-10 (k=3). Gambar 3-9 Gambar 3-10 Dengan menggunakan convex hull akan terlihat jika seluruh control point adalah kolinear maka kurva B-Spline yang akan terbentuk merupakan garis lurus pula untuk seluruh orde k. Disini kurva BSpline yang dihasilkan juga merupakan defining polygon itu sendiri. Sedangkan jika control point yang kolinear tersebut berada pada bagian tengah dari defining polygon. Pada gambar 3-8 diperlihatkan efek dari perbedaan nilai dari k.

dan non-uniform. yaitu uniform dan open uniform. open uniform. Contohnya adalah: [0 1 2 3 4 5 6] Untuk setiap order k. Pada subbab ini kita akan membahas dua diantaranya.2.1 UNIFORM Pada knot vektor uniform. jarak dari setiap elemen knot vektor adalah sama. Pada dasarnya ada tiga x macam knot vektor. Persyaratan dari knot vektor adalah memenuhi persamaan xi≤ i+1.k(t) = Ni-1. knot vektor uniform akan menghasilkan fungsi basis periodic uniform dimana: Ni. Biasanya knot vektor uniform dimulai dari 0 sampai suatu nilai maksimum.k(t+1) Hasil dari fungsi basis dengan menggunakan knot vektor uniform terlihat pada gambar 312: . yaitu uniform.Gambar 3-11 Persamaan fungsi basis B-Spline menunjukkan bahwa pamilihan knot vektor mempunyai pengaruh penting pada hasil dari kurva B-Spline. 3.k(t-1) = Ni+1.

penggambarannya dimulai pada titik Ps = P(t=xk) dan berakhir di titik Pe = P(t=xn+1).Gambar 3-12 dimana knot vektornya adalah [0 1 2 3 4 5 6]. Sebagai contoh untuk k=3. yaitu dengan menggandakan control point yang berada di awal dan akhir dari defining polygon. jumlah control point (n+1) = 4. Sebagai contoh. Persamaannya dinyatakan sebagai: Ps = Pe = n≥k 1 ( Nk . maka: 1 Ps = ( B1 + 4 B 2 + B3) 6 1 Pe = ( Bn − 1 + Bn + Bn + 1) 6 Untuk itu diperlukan suatu cara dalam mengontrol titik-titik tersebut..2 Bn − (k − 1)! i =1 k + 3 + ∑ k Ni .3 Bn − k + 4 + . Pada kurva B-Spline periodic uniform.1B1 + Nk . untuk k=3 dengan dua control point pada awal dan akhir sehingga B1=B2 dan Bn=Bn+1 akan menghasilkan titik awal dan titik akhir seperti di bawah ini: Ps = Sedangkan untuk k=4. k − 1Bk ) (k − 1)! k 1 ( ∑ Ni . serta orde k=3. Salah satu caranya adalah dengan yang dinamakan multiple coincident vertices. + i =1 ∑N i =1 k i. k Bn + 1) Hal ini menyebabkan adanya salah satu sifat dari kurva tidak terpenuhi yaitu endpoint interpolation. 2 B 2 + . maka: 1 Ps = ( B1 + B 2) 2 1 Pe = ( Bn + Bn + 1) 2 Sedangkan untuk k=4. + Nk ... maka: ( B1 + B 2) = 2 ( 2 B1) = B1 2 1 1 Pe = ( Bn + Bn + 1) = ( 2 Bn + 1) = Bn + 1 2 2 1 1 ..

1 1 Ps = ( B1 + 4 B 2 + B 3) = (5B1 + B 2) 6 6 1 1 Pe = ( Bn − 1 + Bn + Bn + 1) = ( Bn − 1 + 5 Bn + 1) 6 6 Gambar 3-13 .

Gambar 3-14 Pada gambar 3-13 dan 3-14 diperlihatkan efek dari multiple coincident vertices. sedangkan pada bagian bawah akhir dari defining polygon kurva tersebut ditambah satu control point sehingga ada dua control point yang berhimpit. Sedangkan pada gambar 3-14 terlihat kurva dengan k=4 tanpa multiple coincident vertices. Pada gambar 3-13 terdapat sebuah kurva dengan k=3 dimana bagian atas tanpa menggunakan multiple coincident vertices. . dengan satu multiple coincident vertices dan yang paling bawahdua multiple coincident vertices (perhatikan bahwa pada contoh ini multiple coincident vertices hanya diberikan pada akhir kurva saja).

Pada kasus ini.3. orde k=4 dan jumlah control point (n+1)=4 adalah: . Sedangkan elemen knot yang tengah mempunyai jarak yang sama. knot vektor open uniform dari fungsi basis B-Spline dengan orde 4 adalah: [0 0 0 0 1 1 1 1] Hasil dari fungsi basis open uniform dengan knot vektor di atas. knot vektor yang terjadi adalah k elemen dengan nilai 0 diikuti dengan k elemen dengan nilai 1. Jika jumlah control point sama dengan orde dari fungsi basis B-Spline dan knot vektor yang digunakan adalah open uniform. maka kurva B-Spline yang dihasilkan adalah sama dengan kurva Bezier. Sebagai contoh. Secara umum.2 OPEN UNIFORM Knot vektor open uniform mempunyai nilai elemen knot yang sama pada awal dan akhir sejumlah orde k.2. persamaan knot vektor open uniform adalah: xi = 0 xi = i-k xi = n-k+2 1≤ k i≤ k+1≤ n+1 i≤ n+2≤ n+k+1 i≤ salah satu contoh knot vektor open uniform adalah: k=2 k=3 k=4 [0 0 1 2 3 4 4] [0 0 0 1 2 3 3 3] [0 0 0 0 1 2 2 2 2] Hasil dari kurva B-Spline dengan knot vektor open uniform mempunyai sifat-sifat yang hampir sama dengan kurva Bezier.

Sebagai tambahan.Gambar 3-15 Perhatikan bahwa hasil fungsi basis di atas sama dengan hasil dari fungsi basis kurva Bezier yang terlihat pada gambar 3-2. orde k=3 dan jumlah control point (n+1) = 4 adalah seperti yang terlihat pada gambar 3-15: Gambar 3-15 . hasil dari fungsi basis B-Spline dengan knot vektor [0 0 0 1 2 2 2].

Untuk pemroses kata. Parameter pada perintah glClear() menunjukkan buffer mana yang akan dibersihkan. memori menahan gambar terakhir yang kita gambarkan di komputer tersebut sehingga kita perlu membersihkannya dengan suatu warna background sebelum menggambar dengan yang baru.0. putih .5 akan menghasilkan warna abuabu.0). Sehingga mengisi dengan 0. hijau glColor(0. dan lain-lain.0. 1.0.1. maka setiap obyek geometrik yang dibuat akan digambar dengan menggunakan warna itu. set_current_color(green). akan menghasilkan obyek A dan B berwarna merah dan obyek C berwarna biru. Persiapan menggambar Pada bagian ini diterangkan hal-hal yang menyangkut persiapan menggambar seperti membersihkan window serta mengeset warna obyek yang akan digambar. perintah di bawah ini akan membersihkan window menjadi hitam: glClearColor(0. Sebelum warna yang aktif tersebut diganti. Sebagai contoh. 0. magenta glColor(1.0.1. 1.0. 0. 0.0). 1. draw_object(A).0.0 keseluruhan akan menghasilkan warna putih. draw_object(B).0. 1.0). gunakan perintah glColor3f().PENGGAMBARAN OBYEK GEOMETRIK DENGAN OPENGL 4. 1. 4. set_current_color(blue).0). 4. mengisi 1. Parameter tersebut merupakan komponen merah. hijau dan biru dari warna yang akan dihasilkan. 0. Perintah tersebut menggunakan tiga parameter yang kesemuanya merupakan angka floating-point yang besarnya antara 0. untuk game pesawat luar angkasa kita akan menggunakan warna hitam. 1. 0. 1.0.0. 0.0). Kombinasi delapan warna dari perintah glColor() adalah: glColor(0.0. Pembentukan warna OpenGL akan menyimpan warna yang sedang aktif saat itu.0.0. kuning glColor(1. 0. 0. cyan glColor(1.0). Perintah pada baris keempat yang mengeset warna menjadi biru tidak berguna. 0. merah glColor(1.0. dan 0.0).1.0). glClear(GL_COLOR_BUFFER_BIT). dan perintah selanjutnya membersihkan seluruh window dengan warna yang aktif.0.0.2. Untuk mengeset warna. Membersihkan window Menggambar di komputer tidak sama dengan menggambar di kertas dimana dimulai dari kertas kosong berwarna putih dan kita tinggal menggambar apa yang kita inginkan.0. Hal ini akan meningkatkan kinerja daripada tanpa mwnyimpan warna yang sedang aktif tersebut.0. Warna background yang dipakai tergantung pada aplikasi. hitam glColor(0. draw_object(C). 0.1.0. 1. 0. Baris pertama dari perintah di atas mengeset warna background menjadi hitam. Kita hanya perlu mengeset warna background satu kali saja di awal program dan membersihkan buffer sesering yang kita perlukan.0).0. biru glColor(0. Dalam hal ini program hanya membersihkan buffer warna tempat menyimpan gambar yang ditampilkan.0 sampai 1. Sebagai contoh baris perintah di bawah ini: set_current_color(red). Pada komputer. kita mungkin akan menggunakan warna putih.0 secara keseluruhan akan menghasilkan warna hitam.0.

z. y. dan poligon Sebuah titik direpresentasikan oleh himpunan angka floating-point yang dinamakan vertex. w). Secara umum. Untuk banyak aplikasi. . Pada OpenGL vertex tersebut kesemuanya dianggap tiga dimensi. Kedua. Gambar 4-1. baik terbuka maupun tertutup. Dalam OpenGL. sehingga OpenGL membuat beberapa batasan untuk pembentukan poligon primitif. garis berarti segmen garis. tepi dari poligon tidak boleh berpotongan.4. Suatu garis yang terdiri dari beberapa segmen garis yang terhubung ditentukan oleh vertex-vertex dari titik tepi segmen garis tersebut. Jika w tidak nol. rutin-rutin untuk membentuk obyek yang rumit disediakan dalam GLU. bukan versi matematika yang dapat diperpanjang sampai dengan tak terbatas pada kedua arahnya. Karena selurruh poligon tersebut dapat dibentuk oleh gabungan poligon-poligon sederhana. OpenGL bekerja dalam koordinat homogen tiga dimensi sehingga untuk kalkulasi internal seluruh vertex direpresentasikan dalam 4 koordinat floating-point (x. Jika ditentukan oleh user sebagai vertex dua dimensi (hanya koordinat x dan y) maka koordinat z akan dianggap nol oleh OpenGL. Terdapat cara yang mudah untuk membentuk gabungan dari beberapa segmen garis yang terhubung. poligon bisa menjadi sangat kompleks. Menggambar titik.2. Pertama. Segmen garis yang terhubung secara berurutan Poligon adalah daerah tertutup yang dibentuk oleh beberapa segmen garis. poligon dengan lubang di dalamnya. jadi tidak mempunyai lekukan. kita akan membutuhkan poligon nonconvex. atau poligon-poligon rumit yang lain. poligon harus berbesifat convex (cembung). garis.

0. Poligon valid dan invalid Karena persegi panjang merupakan bangun yang sangat umum dalam aplikasi grafik. GLdouble dvect[3] = {5. Koordinat pada contoh kedua adalah (0. 9. 2. yaitu glRect*(). Untuk menggambar persegi panjang kita memasukkan titik-titik sudutnya (x1. 3.0. glVertex3d(0. 3). Kita akan menggunakan perintah glVertex*() untuk menentukan suatu vertex. koordinat z akan dianggap nol).y1) dan (x2. Pembentukan vertex Dengan OpenGL. 0) (ingat bahwa jika tidak ditentukan. 0.15. glVertex3dv(dvect). 4. 0.0.0. 1992.5.0}. OpenGL menyediakan perintah khusus untuk menggambar persegi panjang yang terisi. Contoh ketiga menunjukkan titik dengan koordinat tiga dimensi (1.y2) sebagai parameter.1.2. tetapi akan lebih optimal jika kita menggunakan glRect*().0. 3. -1. Beberapa contoh penggunaan glVertex*() adalah: glVertex2s(2.2. Pada contoh terakhir.Gambar 4-2. GLdouble dvect[3] = {5.0.0). glVertex4f(2.0. 9. y dan z selalu dibagi dengan koordinat w).1) (intgat bahwa koordinat x.0}. dvect adalah pointer yang menunjuk sebuah array dari tiga angka dengan tipe double. -2.2. 1992.1415926535898). 4. Sebenarnya kita dapat menggambar persegi panjang sebagai suatu poligon.1415926535898) (angka dengan tipe double). 3. Contoh pertama memperlihatkan sebuah vertex koordinat tiga dimensi (2. 1. Penggambaran primitif geometrik .2. seluruh obyek geometrik digambarkan sebagai himpunan dari vertex-vertex.0.3.0. 0.

0.5). 3. 1. glVertex2f(4. Jika vertex berjumlah ganjil. 3. glEnd().0).0). glVertex2f(3. Contoh: glBegin(GL_POLYGON). Untuk melakukannya kita harus memberi batas tiaptiap himpunan vertex tersebut dengan perintah glBegin() dan glEnd(). Argumen yang diisikan pada glBegin() menentukan bangun geometrik yang akan dibentuk oleh vertexvertex tersebut. . maka segmen terakhir tidak dihiraukan.0. hasilnya adalah tampak pada gambar 4-3 (kanan).Sekarang kita telah mengetahui bagaimana membentuk vertex. glVertex2f(0.0. Poligon dan himpunan titik-titik Jika kita menggunakan GL_POINTS. sebuah garis atau sebuah poligon dari vertex-vertex tersebut. 0. dari vertex 2 ke vertex 3. glVertex2f(0. 0. glVertex2f(3. GL_LINE_STRI P Menggambar segmen garis dari vertex 1 ke vertex 2. dst. Jadi ada n-1 segmen garis. Argumen yang bisa dimasukkan pada perintah glBegin() ditunjukkan pada tabel di bawah ini: Nilai GL_POINTS GL_LINES Keterangan Menggambar titik dari n vertex Menggambar segmen garis berurutan secara terpisah. tetapi kita juga harus tahu bagaimana OpenGL membentuk himpunan titik-titik.0).0). Gambar 4-3.0.0.

3. 6 dan seterusnya. 3. 1. 5. dua atau satu vertex terakhir tidak dihiraukan. 3. GL_QUAD_STR IP Menggambar serangkaian poligon empat sisi dimulai dari vertex 0. 2. lalu vertex 4. 4 dan seterusnya. 3. vertex 1. 1. Menggambar segitiga (poligon tiga sisi) berurutan. vertex 1. vertex2. Menggambar poligon empat sisi secara berurutan. vertex 3. vertex 3. 5. Jika jumlah vertex bukan merupan kelipatan 3 maka dua atau satu vertex terakhir tidak dihiraukan. Tabel bangun geometrik sederhana Gambar 4-4 Memperlihatkan contoh-contoh bangun geometrik yang ada pada tabel di atas. 7. . lalu 0. kemudian vertex 2. Menggambar poligon dari n vertex (n>2). 4. GL_TRIANGLE _STRIP Menggambar serangkaian segitiga (poligon tiga sisi) menggunakan vertex 0. 2. 2. lalu 0.GL_LINE_LOO P GL_POLYGON GL_TRIANGLE S Sama dengan GL_LINE_STRIP hanya saja vertex terakhir dihubungkan denga vertex 1 sehingga membentuk loop. Jika jumlah vertex bukan merupakan kelipatan 4 maka tiga. vertex 4 dan seterusnya GL_TRIANGLE _FAN GL_QUADS Sama dengan triangle strip hanya saja vertexnya adalah 0. kemudian vertex 2. kemudian vertex 2.

Perintah-perintah tersebut seperti yang diperlihatkan oleh tabel di bawah ini: Perintah GlVertex*() GlColor*() GlIndex*() GlNormal*() GlEvalCoord*() GlCallList().glCa llLists() GlTexCoord*() GlEdgeFlag*() Mengeset koordinat tekstur Mengontrol penggambaran tepi Keterangan Mengeset koordinat vertex Mengeset warna yang aktif Mengeset indeks warna yang aktif Mengeset koordinat vektor normal Membuat koordinat Mengeksekusi display list .Gambar 4-4. ada beberapa perintah yang bisa dimasukkan di antara perintah glBegin() dan glEnd(). Bangun geometri sederhana Selain dengan glVertex*().

dibulatkan ke integer terdekat. Titik Untuk mengontrol ukuran dari titik.0.1. Piksel-piksel pada layar yang digambar untuk berbagai macam ukuran titik tergantung pada bagaimana antialiasing diset (antialiasing adalah teknik untuk menghaluskan titik maupun garis yang mereka bentuk).0 maka bujursangkarnya dua piksel kali dua piksel. Pada implementasi khusus. void glLineWidth(Glfloat width). pada implementasi khusus. dibulatkan ke integer terdekat. Sama dengan pada ukuran titik. defaultnya adalah 1. defaultnya adalah 1. maka ukuran dibulatkan dalam integer dan layar yang dibatasi oleh bujursangkar dari piksel digambar. memungkinkan ukuran lebar garis dalam bentuk nonintegral. dan poligon 4.3. garis. dan piksel-piksel pada bagian tepi digambar dengan intensitas lebih kecil. Jadi jika ukurannya 1. 2 atau 3 akan digambar selebar 1. Penggambaran garis. Garis Dengan OpenGL kita dapat menentukan garis dengan berbagai macam ukuran dan digambar dalam berbagai macam cara. Size harus lebih besar dari 0. Width harus lebih besar dari 0. Jika antialiasing diset enable. Menampilkan titik.0. dengan titik-titik.3. dan seterusnya.0.GlMaterial*() Mengeset properti material Tabel perintah-perintah antara glBegin() dan glEnd() 4. 4. Sebagian besar implementasi OpenGL mendukung ukuran titik yang sangat besar. ukuran titik non-antialiasing mungkin dibatasi sebesar ukuran maksimum titik antialiasing. dipengaruhi oleh bagaimana antialiasing diset.2. ukuran 1.3. . 2 atau 3 piksel. seperti pada titik.0 maka bujursangkarnya satu piksel kali satu piksel. Jika antialiasing diset enable. ukuran titik non-antialiasing mungkin dibatasi sebesar ukuran maksimum titik antialiasing. gunakan perintah glPointSize() dan isikan ukuran piksel sebagai argumen. jika ukurannya 2. Jika antialiasing diset disable (default). himpunan piksel berbentuk bundar digambar dimana piksel-piksel yang terletak di tepi digambar dengan intensitas yang lebih kecil. Tanpa antialiasing.0. garis-garis maupun campuran antara titik-titik dan garis-garis. Hal itu bertujuan untuk memperhalus tampilan bagian tepi. void glPointSize(GLfloat size). Kita bisa memperolehnya dengan menggunakan GL_POINT_SIZE_RANGE pada perintah glGetFloatv().

yaitu depan dan belakang. void glLineStipple(Glint factor. atau menggambar hanya outline atau vertex. Perintah tersebut mengontrol mode penggambaran dari permukaan depan dan belakang suatu poligon. Parameter face dapat diisi dengan GL_FRONT. 4. Tetapi kita juga bisa menggambarnya sebagai poligon outline atau sebagai titik-titik pada vertex-vertex. tetapi juga bisa diisi dengan pola tertentu dengan perintah glPolygonStipple(). dan mungkin dibangkitkan dengan cara berbeda tergantung sisi mana yang menghadap lensa. Glushort pattern). Sedangkan parameter mode dapat diisi GL_POINT. Argumen pattern adalah rangkaian 0 dan atau 1 sebanyak 16 bit. Poligon Poligon biasanya digambar dengan cara mengisi seluruh piksel yang tertutup dalam suatu batas. Sebuah poligon terisi mungkin terisi dengan solid (padat) atau digambar dengan pola tertentu.Kita bisa memperolehnya dengan menggunakan GL_LINE_WIDTH_RANGE pada perintah glGetFloatv(). 10 piksel tidak. kemudian 5 piksel tidak. gunakan perintah glPolygonMode(). Defaultnya kedua permukaan digambar terisi. maka polanya menjadi: 6 piksel digambar. Gambar 4-5. GL_BACK atau GL_FRONT_AND_BACK.3. Defaultnya kedua permukaan digambar dengan cara yang sama. garis akan digambar dengan cara sebagai berikut: 3 piksel digambar. Pola bisa diperbesar dengan factor yang mengalikan tiap-tiap sub-rangkaian. Perintah tersebut mengeset pola penggambaran garis. . GL_LINE atau GL_FILL. Nilai 1 menunjukkan penggambaran terjadi dan nilai 0 sebaliknya. Untuk merubahnya. Pola tersebut bisa diperbesar dengan menggunakan factor. sehingga jika contoh di atas menggunakan factor 2. Secara default. 12 piksel digambar dan 4 piksel tidak. 6 piksel digambar dan 2 piksel tidak (bit rendah digunakan terlebih dahulu). Sebuah poligon mempunyai dua sisi. Untuk menggambarkan garis dalam titik-titik atau garis putus-putus gunakan perintah glLineStipple() untuk mendefinisikan pola penggambaran garis tersebut dan kemudian kita bisa mengaktifkan (meng-enable) dengan glEnable(). poligon digambar dengan pola yang solid.3. Pola penggambaran garis Dengan pola 0x3F07 (yang jika dirubah dalam biner menjadi 0011111100000111).

Jika kita memanggil perintah glVertex*() setelah perintah glNormal*() akan membentuk vertex seperti yang diberikan pada normal. arah normal mungkin berbeda untuk tiap-tiap titik. tiap-tiap vertex mempunyai normal yang berbeda sehingga mengharuskan pemanggilan serangkaian perintah seperti di bawah ini: glBegin(GL_POLYGON). TYPEnx). khususnya arah relatif terhadap sumber cahaya. TYPEny. void glNormal3{b s i d f}v(const TYPE *v). 4. Normal dari suatu obyek menentukan arah dari permukaan terhadap ruang. glVertex3fv(v3). Vektor normal Sebuah vektor normal (atau singkatnya normal) adalah vektor dari suatu titik dengan arah tegak lurus dari permukaan. Sering. tetapi kita tidak bisa menetapkan normal selain pada vertex yang bersangkutan. Beberapa vertex mungkin mempunyai normal yang sama. void glNormal3{b s i d f}(TYPEnx. glVertex3fv(v2). glVertex3fv(v0). Vektor ini digunakan oleh OpenGL untuk menentukan berapa banyak cahaya yang diterima obyek pada tiap-tiap vetexnya.Perintah tersebut mendefinisikan pola penggambaran untuk poligon terisi. Gunakan perintah glNormal*() untuk mengeset normal dari nilai yang diberikan pada argumennya. satu arah cukup untuk mewakili setiap titik di seluruh permukaan. glNormal3fv(n3). . sedangkan jika 0 tidak.4. Jika nilainya 1 maka piksel yang bersesuaian pada poligon digambar. glNormal3fv(n1). glVertex3fv(v1). Dengan OpenGL kita dapat menentukan sebuah normal untuk tiap-tiap vertex. glEnd(). Argumen mask adalah pointer untuk bitmap 32x32 yang diterjemahkan sebagai 0 dan 1. glNormal3fv(n0). glNormal3fv(n2). Untuk permukaan yang datar. Tetapi untuk permukaan yang berbentuk kurva.

kita bisa menggukanan versi vektor (dengan v) dan memberikan sebuah array 3 elemen untuk menentukan normal yang diinginkan. . sebagai alternatif. nz) untuk dijadikan bentuk normal.Versi non-vektor (tanpa v) memerlukan 3 argumen yang menentukan sebuah vektor (nx. ny.

void glLoadMatrix{f d}(const TYPE *m). 5. void glLoadMatrix{f d}(const TYPE *m). m2. apakah matrik modelview ataukah matrik proyeksi. Perintah tersebut mengalikan 16 nilai yang ditunjukkan oleh m dengan matrik yang sedang aktif dan hasilnya disimpan pada matrik yang sedang aktif. yaitu GL_MODELVIEW. Jika kita menginginkan untuk menentukan suatu matrik tertentu untuk menjadi matrik yang sedang aktif. proyeksi ataukah matrik tekstur sesuai dengan nilai yang dimasukkan sebagai argumen. m16). translasi. apakah matrik modelview. … . scaling atau gabungan dari ketiganya. void glLoadIdentity(void). gunakan perintah glLoadMatrix*(). Perintah di atas digunakan untuk menentukan matrik yang akan dimodifikasi. . Kita melakukannya dengan perintah glMatrixMode(). Transformasi modeling Transformasi modeling adalah transformasi untuk menentukan posisi dan orientasi dari sebuah model. Sebagai contoh kita dapat malakukan rotasi. atau GL_PROJECTION GL_TEXTURE. Biasanya kita memanggilnya sebelum menentukan transformasi proyeksi atau viewing. Perintah-perintah umum pada OpenGL Pada bagian ini kita membahas beberapa perintah OpenGL yang berguna untuk menentukan transformasi yang kita inginkan. Perintah tersebut mengeset 16 nilai dari matrik yang sedang aktif dengan nilai yang ditunjukkan oleh m.2. Gunakan pula perintah glMultMatrix*() untuk mengalikan matrik yang sedang aktif dengan matrik yang dipassingkan sebagai argumen. Perintah tersebut mengubah matrik yang sedang aktif menjadi matrik identitas 4x4. void glMatixMode(Glenum mode).1. Pertama kali kita harus menentukan matrik yang hendak kita modifikasi.TEKNIK VIEWING PADA OPENGL 5. Argumen dari kedua perintah tersebut adalah vektor dengan 16 nilai (m1. tetapi mungkin juga kita memanggilnya sebelum menentukan transformasi modeling. Gunakan perintah glLoadIdentity() untuk meng-clear matrik yang sedang aktif.

TYPEy. TYPEz). glRotate*() dan glScale*(). Proses merotasikan obyek glRotate{f d}(TYPEangle. memutar. Perintah tersebut mengalikan matrik yang sedang aktif dengan sebuah matrik yang mentranslasikan obyek berdasarkan nilai x. TYPEz). Gambar 5-1. rotasi maupum matrik scaling dan kemudian memanggil perintah glMultMatrix*() dengan matrik tersebut sebagai argumen. TYPEy. Perintah tersebut mengalikan matrik yang sedang aktif dengan sebuah matrik yang merotasikan obyek dengan arah yang berlawanan dengan arah jarum jam. membesarkan ataupun mengecilkan obyek tersebut. y. z yang diberikan. Proses mentranslasikan obyek glTranslate{f d}(TYPEx. . Rutin-rutin tersebut mentransformasikan sebuah obyek dengan jalan menggeser. TYPEx. Perintah-perintah tersebut sama dengan jika kita membuat sebuah matrik translasi.Tiga rutin OpenGL untuk transformasi modeling adalah glTranslate*(). Gambar 5-2. Angle menyatakan sudut dari rotasi tersebut.

z dari setiap titik pada obyek dikalikan dengan argumen x. memperkecil atau merefleksikan obyek. jika nilainya kurang dari 1. Jika nilai yang dimasukkan lebih dari 1.Gambar 5-3. . glColor3f(1. 1. Perintah tersebut mengalikan matrik yang sedang aktif dengan matrik sebuah yang memperbesar. y. TYPEy. Proses merefleksikan dan scaling terhadap obyek glScale{f d}(TYPEx. glEnable(GL_LINE_STIPPLE). y.0 maka obyek akan diperkecil dan jika nilainya negatif maka obyek akan direfleksikan (dicerminkan).0.0 maka obyek akan diperbesar. 1. Contoh proses transformasi modeling glLoadIdentity().0). Masing-masing koordinat x. Perintah glScale*() merupakan satu-satunya perintah transformasi modeling yang merubah ukuran dari obyek. Berikut ini sebuah contoh dari penggunaan perintah-perintah dari transformasi modeling: Gambar 5-4.0. draw_triangle(). TYPEz). z.

Transformasi viewing Memanggil transformasi viewing dapat dianalogikan dengan mendefinisikan dan meletakkan kamera pada posisinya.0. Kita bisa menggeser titik pandang ke belakang (menjauhi obyek) yang sama artinya dengan menggeser obyek ke depan (menjauhi titik pandang). draw_triangle(). Gunakan rutin Utility Library gluLookAt() untuk mendefinisikan garis pandang. Kita juga dapat memilih untuk menggunakan letak dan orientasi default dari titik pandang. 0. glRotate(90.0. glLoadIdentity(). Buat rutin sendiri yang mengandung perintah rotasi dan translasi.0). Rutin ini mengandung perintah untuk rotasi dan translasi. Gunakan salah satu dari perintah transformasi modeling (glTranslate*() atau glRotate*()). Kita dapat membayangkan pengaruh dari transformasi ini seperti menggerakkan posisi kamera. 0.5. 5. 0x8888). glDisable(GL_LINE_STIPPLE). draw_triangle(). 0. Kita ingat bahwa .3.glLineStipple(1. 0xF0F0).0. glScale(1. Beberapa aplikasi mungkin membutuhkan rutin tersendiri yang memungkinkan kita untuk menentukan transformasi viewing yang sesuai.0. draw_triangle(). 0. glLoadIdentity().0).0. seperti yang dijelaskan di bawah ini. Langkah ini diperlukan mengingat hampir semua perintah transformasi melakukan perkalian matrik yang sedang aktif dengan suatu matrik dan hasil perkalian tersebut dijadikan matrik yang sedang aktif. Kita dapat menyelesaikan transformasi viewing dengan beberapa jalan. glLoadIdentity(). 1.0). 0xF00F). Sebelum mendefinisikan transformasi viewing perlu untuk mengeset matrik yang sedang aktif dengan memanggil perintah glLoadIdentity(). glTranslate(-20. 1. Jika matrik tersebut tidak di-clear maka kita akan melakukan operasi matrik yang baru pada matrik sebelumnya. yang terletak di pusat koordinat dan memandang ke arah sumbu z negatif.5. 0. glLineStipple(1. glLineStipple(1.

eyey dan eyez. 0. GLdouble centerz. -5. . GLdouble centery. GLdouble eyez. Rutin tersebut memerlukan 3 set argumen yang menentukan letak titik pandang. Titik pandang yang diinginkan ditentukan oleh eyex. void gluLookAt(GLdouble eyex. Argumen centerx. Jadi untuk membuat jarak 5 unit antara obyek dan titik pandang dengan menggeser titik pandang adalah sebagai berikut: glTranslate(0. mendefinisikan titik referensi terhadap arah dari kamera dan menunjukkan dimana arah atas.0. GLdouble upy. Gambar 5-5. Argumen upx.default dari depan adalah sumbu z negatif. Jika kita memutar titik pandang. Membuat jarak antara titik pandang dan obyek Seringkali programmer membentuk scene di sekitar pusat sistem koordinat atau di lokasi lain yang sesuai. centery dan centerz menyatakan sembarang titik sepanjang garis pandang tetapi biasanya ada beberapa titik di tengah scene terlihat. GLdouble upx. Seperti namanya rutin gluLookAt() dirancang untuk tujuan tersebut.0). kemudian mereka ingin melihatnya dari titik yang berubah-ubah untuk mendapatkan hasil yang sesuai. maka depan akan mempunyai arti yang berbeda.0. upy dan upz menunjukkan dimana arah atas. GLdouble upz) Perintah tersebut mendefinisikan matrik viewing dan mengalikannya dengan matrik yang sedang aktif. GLdouble eyey. GLdouble centerx.

top. Meskipun secara konsep mudah dipahami. Selengkapnya adalah: .4.3. maka kita harus memilih proyeksi perspektif ini. GLdouble bottom. gunakan rutin dari Utility Library yaitu gluPerspective().5. 5. Volume viewing didefinisiskan oleh parameter (left.1. y. Selengkapnya adalah: void glFrustum(GLdouble left. Near dan far menunjukkan jarak dari titik pandang ke clipping plane yang dekat dan jauh. bottom. glFrustum() tidak sering digunakan. Proyeksi perspektif Proyeksi perspektif adalah seperti cara kita memandang sesuatu pada kehidupan seharihari. GLdouble far). -near) menentukan koordinat (x. z) dari sudut kiri bawah dan kanan atas dari clipping plane yang dekat. sebagai contoh ruas jalan semakin jauh akan tampak semakin menyempit. Proyeksi perspektif membuat obyek yang jauh akan kelihatan kecil. Volome viewing pada proyeksi perspektif dengan glFrustum() Perintah glFrustum() menghitung matrik yang mengerjakan proyeksi perspektif dan mengalikannya dengan matrik yang sedang aktif. Ada dua macam proyeksi yang ada pada OpenGL yaitu perspektif dan ortografik. Jika kita ingin membuat gambar yang tampak nyata. Metode ini banyak digunakan untuk aplikasi animasi dan computer aided design (CAD). Perintah tersebut membentuk sebuah matrik perspektif dan mengalikannya dengan matrik yang sedang aktif. GLdouble near. Sebagai penggantinya. -near) dan (right. GLdouble right. Rutin ini membentuk volume viewing yang sama dengan yang dibentuk oleh glFrustum() tetapi dengan cara lain. Transformasi proyeksi Transformasi proyeksi menentukan bagaimana suatu obyek diproyeksikan pada layar. GLdouble top. Gambar 5-6.

GLdouble zNear.0.3. GLdouble aspect.2. Perintah selengkapnya adalah sebagai berikut: . Volume viewing pada proyeksi perspektif dengan gluPerspective() gluPerspective(GLdouble fovy. Proyeksi ortografik Proyeksi ortografik menampilkan obyek pada layar tanpa dipengaruhi oleh ukuran relatif dari obyek tersebut.Gambar 5-7. nilainya antara 0. Argumen fovy adalah sudut dari bidang pandang. Proyeksi ortografik digunakan pada aplikasi arsitektur dan computer aided design. Aspect adalah perbandingan antara lebar dan tinggi.0 sampai dengan 180. Nilai zNear dan zFar adalah jarak antara titik pandang dan clipping plane sepanjang sumbu z negatif. 5. Perintah tersebut membentuk sebuah matrik perspektif dan mengalikannya dengan matrik yang sedang aktif. GLdouble zFar).

5. GLdouble near. Apakah kita menginginkan foto seukuran dompet ataukah seukuran poster. GLdouble right. viewport adalah daerah persegi panjang pada window dimana gambar dibangkitkan. Karena di komputer. Perintah tersebut membentuk matrik volume viewing ortografik dan mengalikannya dengan matrik yang sedang aktif. top. bottom -far) dan sudut kanan atas pada (right. Volume viewing pada proyeksi ortografik void glOrtho(GLdouble left. GLdouble bottom. GLdouble top. -far). bottom -near) dan sudut kanan atas pada (right. GLdouble far). Clipping plane dekat adalah segiempat dengan sudut kiri bawah pada (left.5. top. Sedangkan clipping plane jauh juga merupakan segiempat dengan sudut kiri bawah pada (left. near). Transformasi viewport Kalau dianalogikan dengan kamera. . transformasi viewport dapat disamakan dengan bagian dimana ukuran dari foto ditentukan.Gambar 5-8.

Gambar 5-9. Default dari viewport adalah diset pada seluruh pixel dari window yang dibuka. Viewport diukur dalam koordinat window yang merefleksikan posisi pixel pada layar relatif terhadap sudut kiri bawah dari window. Parameter x dan y menentukan sudut kiri bawah viewport. Glint y. Mapping volume viewing pada viewport void glViewport(Glint x. Glsizei width. Glsizei height). Gambar 5-10. . Segiempat viewport Gambar 5-9 menunjukkan sebuah viewport yang menempati sebagian besar layar. sedangkan width dan height merupakan ukuran viewport. Perintah tersebut mendefinisikan piksel pada window dimana image dipetakan.

Perintah tersebut membentuk clipping plane. Argumen equation merupakan 4 titik koefisien dari persamaan Ax+By+Cz+D=0. Beberapa implementasi mungkin memperbolehkan lebih dari 6 clipping plane. Kita harus mengaktifkan (meng-enable) clipping plane tambahan yang telah kita definisikan dengan perintah glEnable(GL_CLIP_PLANEi) dan mendisable dengan perintah glDisable(GL_CLIP_PLANEi). Clipping plane tambahan Masing-masing Ax+By+Cz+D=0. Clipping plane tambahan Disamping enam clipping plane dari volume viewing (kiri. atas. Gambar 5-11. Kita dapat menggunakan glGetIntegerv() dengan GL_MAX_CLIP_PLANES untuk mengetahui berapa banyak clipping plane yang diperbolehkan. Hal ini berguna untuk menghilangkan sebagian dari obyek dalam scene. bawah. . seperti yang ditunjukkan pada gambar 5-11.5. Sebagai contoh jika kita ingin menampilkan potongan dari suatu obyek. plane dibentuk secara oleh koefisien dari persamaan dengan Clipping plane otomatis ditransformasi transformasi modeling dan viewing. void glClipPlane(Glenum plane.6. Sedangkan argumen plane adalah GL_CLIP_PLANEi dimana i adalah integer antara 0 sampai 5 untuk menentukan clipping plane yang didefinisikan. kanan. const GLdouble *equation). dekat) kita dapat mendefinisikan sampai dengan enam clipping plane tambahan untuk membatasi lebih jauh volume viewing. jauh.

0.0). 0. glClipPlane(GL_CLIP_PLANE1. glClipPlane(GL_CLIP_PLANE0. glFlush().0. eqn). auxWireSphere(1. -5.0). 1.0). 0. Potongan dari wireframe sphere void display(void) { GLdouble eqn = {0.Berikut ini sebuah contoh implementasi dari clipping plane.0. 0. yaitu wireframe dari sebuah sphere: Gambar 5-12. 0.0.0.0.0}. 1.0. glRotatef(90. 0.0.0.0}. 1. glColor3f(1. glPushmatrix(). 0.0. 0. glClear(GL_COLOR_BUFFER_BIT). glPopMatrix(). glTranslatef(0. 1. glEnable(GL_CLIP_PLANE0).0. 0. } void myinit(void) { .0. GLdouble eqn2 = {1. eqn2). glEnable(GL_CLIP_PLANE1).0).0.

auxInitWindow(argv[0]). } void myReshape(GLsizei w. Program ini terdiri dari planet dan matahari yang digambar dengan rutin sphere (auxSphere()). glMatrixMode(GL_PROJECTION). 2. char** argv) { auxInitDisplayMode(AUX_SINGLE | AUX_RGBA). pertama kali kita harus mengeset transormasi proyeksi dan viewing.7.glShadeModel(GL_FLAT). (GLfloat)w/(GLfloat)h. myinit(). 0. h). GLsizei h) { glViewport(0. w. 1. glLoadIdentity().0). Untuk menggambar sistem tata surya tersebut. Contohnya adalah suatu sistem tata surya dimana obyek berotasi dan berevolusi. } 5. gluPerspective(60. . auxReshapeFunc(myReshape). auxInitPosition(0. } int main(int argc.0. 500. Transformasi komposisi Bagian ini memperlihatkan bagaimana menggabungkan beberapa transformasi untuk mencapai hasil yang diinginkan. 500). 0. auxMainLoop(display).0. glMatrixMode(GL_MODELVIEW). Untuk menulisnya kita memerlukan glRotate*() untuk revolusi dan rotasi serta glTranslate*() untuk menggeser planet pada orbitnya. Untuk contoh ini digunakan gluPerspective() dan gluLookAt().

glTranslatef(2. glColor3f(1.0).Gambar 5-13. } void yearAdd(void) { year = (year + 5) % 360. Planet dan matahari static int year = 0.0. 1. auxWireSphere(1.0. 0.0). } void display(void) { glClear(GL_COLOR_BUFFER_BIT).0. glRotatef((GLfloat) day.0). 1.10) % 360. .0.0. day = 0.0. 0. void dayAdd(void) { day = (day + 10) % 360.0. 0. 0. 1.0). 0. 1.0). 0.0. } void daySubstract(void) { day = (day . glPushMatrix(). } void yearSubstract(void) { year = (year . glRotatef((GLfloat) year.5) % 360.

glPopMatrix(). auxKeyFunc(AUX_LEFT.0). dayAdd). char** argv) { auxInitDisplayMode(AUX_SINGLE | AUX_RGBA). yearSubstract).auxWireSphere(0. gluPerspective(60. auxMainLoop(display). glTranslatef(0. 1. auxInitPosition(0. } . 0. auxKeyFunc(AUX_RIGHT. } int main(int argc. GLsizei h) { glViewport(0.0. -5. 500). glLoadIdentity(). auxReshapeFunc(myReshape). h). 2. 0. } void myinit(void) { glShadeModel(GL_FLAT). daySubstract).0). glLoadIdentity().0. (GLfloat)w/(GLfloat)h. } void myReshape(GLsizei w. glMatrixMode(GL_PROJECTION). auxKeyFunc(AUX_UP. yearAdd). glMatrixMode(GL_MODELVIEW).2).0. auxKeyFunc(AUX_DOWN. w. auxInitWindow(argv[0]). glFlush().0. 0. myinit(). 500.

mata akan melihatnya sebagai magenta. Monitor komputer mengemulasikan warna oleh partikel cahaya dengan kombinasi cahaya RGB sesuai dengan proporsi sel cone dalam retina yang tereksitasi. Sebagai contoh jika campuran dari foton merah dan biru dikirim sehingga sel cone merah dan biru dalam retina tereksitasi. membentuk warna pelangi. Hal itu dilakukan dengan melihat level eksitasi yang dihasilkan oleh campuran foton yang dicoba untuk diemulasikan. pink dan lain-lain. Bagaimana hal tersebut dapat terjadi? Apa yang dilihat oleh mata kita sebenarnya adalah campuran dari foton dengan frekuensi yang berbeda-beda. arah dan frekuensi/panjang gelombang/energinya. dan jika campuran foton yang berbeda datang sehingga menyebabkan eksitasi tiga tipe dari sel cone pada derajat yang sama. monitor mrngirimkan sejumlah cahaya RGB untuk merangsang sel cone dalam mata kita. mata kita merasakan banyak warna yang tidak berada dalam pelangi. hitam. coklat. Cahaya putih ideal terdiri dari cahaya-cahaya dari seluruh frekuensi dengan jumlah yang sama. Sumber cahaya ditentukan oleh distribusi dari frekuensi foton yang mereka pancarkan. . seperti putih. yang tidak ada dalam spektrum warna. Mata manusia merasakan warna ketika sel-sel pada retina yang bernama cone tereksitasi setelah “ ditembak” oleh foton. Karakteristik dari foton dibentuk oleh posisi. Untuk menampilkan warna tersebut.PEWARNAAN PADA OPENGL 6. warna tersebut tidak dapat dibedakan dari campuran yang pertama. cahaya adalah susunan dari foton. Monitor warna dapat mengirim proporsi RGB yang berbeda pada tiap-tiap piksel dan mata akan melihat jutaan cahaya dengan warnanya masing-masing. Bagaimanapun juga. yaitu merah. partikel kecil dari cahaya yang melintas pada jalurnya serta bergetar pada frekuensinya masing-masing. Persepsi warna Secara fisik. hijau dan biru (orang yang menderita buta warna biasanya kehilangan salah satu tipe dari sell cone di atas). Tiga macam sel cone memberi respon yang terbaik untuk tiga cahaya dengan panjang gelombang yang berbeda. sel cone dalam retina mencatat derajat dari eksitasi berdasarkan tipe masing-masing. Karena masing-masing warna dicatat oleh mata sebagai level eksitasi dari sel cone oleh foton yang datang. mata dapat merasakan warna yang tidak berada dalam spektrum yang dihasilkan oleh prisma atau pelangi.1. Ketika campuran foton memasuki mata. Foton dengan panjang gelombang antara 390 nm sampai dengan 720 nm merupakan spektrum yang terlihat.

Nilai ini biasanya dipaket bersama (kadang-kadang dengan nilai keempat yang disebut dengan Alpha (A)).. dan GL_ALPHA_BITS sebagai parameter. . maka integer antara 0-255 dapat disimpan.. Tanpa memperhatikan jumlah bitplane. 2. Sebuah bitplane berisi 1 bit dari data untuk tiap-tiap piksel. atau dengan mode indeks warna.0 menghasilkan intensitas minimum dan 1.. dimana sebuah nilai (disebut indeks warna) disimpan untuk tiap-tiap piksel. Nilai ini ditentukan oleh jumlah bitplane dalam framebuffer. Tabel tersebut disebut dengan peta warna. 255 pada bitplane dapat diartikan nilai R sebesar 0/255 = 0. 6. Setiap indeks warna ditunjukkan oleh suatu nilai dalam tabel yang mendefinisikan nilai-nilai RGB. . kita bisa menggunakan perintah glGetIntegerv() dengan GL_RED_BITS. 255/255 = 1. Mode RGBA versus mode indeks warna Pada layar komputer. maka terdapat 8 bit warna setiap piksel sehingga ada 28 = 256 warna berbeda yang bisa disimpan pada piksel.1.0.6. sehingga 0.2. dimana nilaii RGBA disimpan untuk tiap-tiap piksel. Untuk mengetahui jumlah bitplane yang tersedia dalam sistem.. Jika ada 8 bitplane warna. 1/255. 0. akan tetapi hal ini tidak selalu benar.. . Mode RGBA Pada mode RGBA. 2/255. hardware menyebabkan di setiap piksel dari layar tersebut dipancarkan cahaya RGB dalam jumlah yang berbeda-beda.0. Pada mode indeks warna atau RGB. GL_GREEN_BITS. yang disebut nilai RGB. Sebagai contoh jika sistem menyediakan 8 bit untuk komponen R. Informasi warna dari tiap-tiap piksel dapat disimpan dalam mode RGBA. Bitplane sering dibagi untuk menyimpan komponen RGB sehingga sistem 24 bitplane menyediakan 8 bit masing-masing untuk RGB. dan nilai dari paket tersebut disebut dengan nilai RGB (atau RGBA). Nilai RGBA disimpan sebagai integer dan diskalakan dengan jumlah bit yang tersedia untuk penyimpanan. 1. hardware menyimpan jumlah bitplane untuk tiap-tiap komponen RGBA.0 menghasilkan intensitas maksimum.2.. suatu nilai tertentu dari data warna disimpan pada tiap-tiap piksel. GL_BLUE_BITS.

cyan dan magenta. Jadi sistem tersebut hanya bisa menampilkan 8 warna. masing-masing 12 sehingga hanya ada 4 bit pada tiap-tiap . Dithering adalah teknik untuk menggunakan beberapa warna untuk membentuk efek warna lain. merah. Jika kita membentuk suatu nilai RGB untuk suatu warna yang tidak tersedia dan mengisi suatu poligon. yaitu hitam.77 juta macam warna. sedangkan warna pink yang lebih putih dapat dihasilkan dengan mengisi proporsi piksel lebih banyak dengan warna putih.Gambar 6-1. biru. Sebagai contoh. Untuk menampilkan warna pink pada suatu daerah. hijau. Dhitering hitam dan putih untuk menghasilkan abu-abu Dengan 8 bit pada tiap-tiap RGB. Tapi walaupun mesin kita mempunyai 24 bitplane bukan berarti proses dithering tidak terjadi. dimana n adalah jumlah bitplane sehingga mesin dengan 24 bitplane untuk RGB dapat menampilkan lebih dari 16.daerah tersebut akan tampak berwarna pink. Warna pink yang lebih merah dapat dihasilkan dengan mengisi proporsi piksel yang lebih banyak dengan warna merah.2. Kita tidak bisa melakukan proses dithering pada satu piksel saja. dan seterusnya. Dithering Beberapa hardware grafik menggunakan dithering untuk meningkatkan jumlah warna yang dapat ditampilkan dengan mengorbankan resolusi spatial. tidak ada piksel yang berwarna pink. Untuk menggambarkan bagaimana proses dithering bekerja. kita bisa mendapatkan gambar berkualitas tinggi tanpa proses dithering. Jumlah warna tidak dapat melebihi 2n. kuning. anggaplah sistem kita hanya mempunyai 1 bit masingmasing untuk RGB. Dengan cara ini. hardware mengisi piksel yang berada di dalam poligon dengan campuran dari warna-warna terdekat sehingga menampilkan warna rata-rata untuk mata kita sesuai dengan warna yang kita inginkan.2. bitplane mungkin dibagi menjadi 2. putih. Nilai RGB dari bitplane Jumlah macam warna yang dapat ditampilkan pada tiap-tiap piksel tergantung jumlah bitplane dan kapasitas dari hardware untuk menginterpretasikan bitplane tersebut. Satu-satunya jalan untuk menghasilkan efek di atas adalah dilakukan pada suatu daerah yang terdiri dari berbagai piksel. 6. rata-rata dari warna merah dan putih. Gambar 6-2. Karena mata kita cukup jauh dari layar sehingga tidak dapat membedakan tiap-tiap piksel. jika kita menggunakan mode double-buffer. hardware dapat mengisi daerah tersebut dengan warna merah dan putih.

Komputer menyimpan indeks warna dalam bitplane untuk tiaptiap piksel. Mode indeks warna Dengan mode indeks warna. dan mirip dengan hal tesebut. peta warna menunjukkan dimana nilai RGB dicampur. OpenGL menggunakan peta warna yang mirip dengan menggunakan palet untuk mencampur cat pada saat melukis. 4 bit setiap komponen warna akan memberi hasil yang kurang memuaskan. . Nilai bitplane tersebut menunjuk ke peta warna dan layar akan diwarnai dengan nilai RGB dari peta warna. 6. Gambar 6-3.2. Tanpa dithering.komponen RGB. Palet seorang pelukis menyediakan tempat untuk mencampur cat.3. Peta warna Pelukis memilih sebuah warna dari palet warna dan melukis dengan warna tersebut.

Dengan mode RGBA.4. Menggunakan peta warna untuk mewarnai gambar Pada mode indeks warna. Ukuran peta warna ditentukan oleh hardware yang digunakan. maka jumlah warna yang bisa ditampung adalah kurang dari 2n dan 2m. jumlah warna yang tersedia terbatas oleh ukuran peta warna dan jumlah bitplane yang tersedia. Jika ada 2n indeks pada peta warna dan m bitplane yang tersedia. - .Gambar 6-4. Ukuran peta warna merupakan pangkat dari 2 diindeks oleh jumlah bitplane yang tersedia pada mode indeks warna. Jika kita hanya mempunyai bitplane dalam jumlah sedikit dan jika kita hanya perlu warna kurang dari 2n. 6. Biasanya berkisar antara 256(28) sampai 4096(212). Sedangkan pada mode indeks warna. tiap-tiap warna piksel tidak tergantung piksel lain. seluruh piksel yang berindeks sama akan ikut berubah.2. Memilih antara mode RGBA atau mode indeks warna Kita mungkin lebih baik menggunakan mode indeks warna pada kasus-kasus di bawah ini: - Jika kita melanjutkan aplikasi yang sudah ada dan menggunakan mode indeks warna. Jika isi dari peta warna berubah. tiap-tiap piksel dengan indeks yang sama disimpan pada lokasi yang sama.

-

Jika kita mempunyai bitplane dalam jumlah terbatas, mode RGBA mungkin akan menyebabkan proses shading yang kasar, sehingga lebih baik memilih mode indeks warna.

-

Mode indeks warna akan berguna untuk berbagai macam trik, seperti animasi.

Secara umum gunakanlah mode RGBA, karena memberikan hasil yang lebih baik untuk texture mapping, lighting, shading, fog, antialiasing dan blending.

6.3.

Penggunaan warna pada model shading

6.3.1. Pembentukan warna pada mode RGBA Pada mode RGBA gunakan perintah glColor*() untuk memilih warna yang akan digunakan. void glColor3{b s i f d ub us ui}(TYPEr, TYPEg, TYPEb); void glColor4{b s i f d ub us ui}(TYPEr, TYPEg, TYPEb, TYPEa); void glColor3{b s i f d ub us ui}v(const TYPE*v); void glColor4{b s i f d ub us ui}v(const TYPE*v); Perintah di atas mempunyai 3 macam akhiran yang bervariasi sesuai dengan parameter yang diterima. Akhiran pertama adalah 3 atau 4, menunjukkan apakah kita memasukkan nilai alpha disamping nilai RGB. Jika nilai tersebut tidak dimasukkan, otomatis akan diset 1.0. Akhiran kedua menunjukkan tipe data untuk parameter: byte, short, integer, float, double, unsigned byte, unsigned short atau unsigned integer. Sedangkan akhiran ketiga adalah optional v yang menunjukkan argumen tersebut adalah pointer pada suatu array sesuai dengan tipe datanya. 6.3.2. Pembentukan warna pada mode indeks warna Untuk mode indeks warna gunakan perintah glIndex*() untuk memilih warna yang akan digunakan: void glIndex{s i f d}(TYPE c); void glIndex{s i f d}v(const TYPE *c); Akhiran pertama dari perintah di atas menunjukkan tipe data dari parameter: short, integer, float atau double. Akhiran kedua adalah optional v yang menunjukkan bahwa argumen tersebut adalah nilai dari suatu array sesuai dengan tipe data yang diberikan (array tersebut hanya berisi 1 nilai).

6.3.3.

Pembentukan model shading Sebuah garis atau poligon terisi dapat digambar dengan satu warna (flat shading) atau dengan berbagai macam warna (smooth shading). Kita dapat menentukan teknik shading sesuai dengan yang kita inginkan dengan perintah glShadeModel(). void glShadeModel(GLEnum mode); Parameter mode dapat diset GL_SMOOTH(default) atau GL_FLAT. Dengan flat shading, warna dari suatu vertex diduplikat ke seluruh vertex dari obyek tersebut. Sedangkan pada smooth shading, warna dari tiap-tiap vertex diperlakukan sendiri-sendiri. Untuk sebuah garis, warna-warna sepanjang segmen garis tersebut ditambahkan pada warna vertex. Sedangkan pada poligon, warna-warna dari interior poligon tersebut ditambahkan pada warna vertex. Dengan smooth shading, titik-titik yang berdekatan mempunyai perbedaan nilai warna yang kecil. Pada mode RGBA hal ini kelihatan mirip sehingga perubahan warna dalam poligon tampak halus (bertahap sedikit demi sedikit). Pada mode indeks warna titik-titik yang berdekatan mungkin menunjuk pada lokasi yang berbeda pada tabel indeks warna, yang mungkin tidak mirip sama sekali. Untuk mengatasi hal tersebut, kita harus membuat suatu jalur perubahan warna yang halus diantara indeks-indeks dalam peta warna. Pemetaan warna pada peta warna dibentuk melalui sistem window. Untuk sementaara anggaplah kita mempunyai rutin auxSetOneColor() yang melakukan load satu indeks pada peta warna dengan nilai RGB. Argumen pertama dari

rutin ini adalah nilai RGB. Untuk melakukan load 32 indeks warna yang berdekatan (dari indeks 16 sampai 47) dengan sedikit perubahan dari warna kuning, kita mungkin akan memanggil rutin auxSetOneColor() sebagai berikut: for(i=0;i<32;i++) auxSetOneColor(16+i, 1.0*(i/32.0), 1.0*(i/32.0), 0.0); Dengan flat shading warna dari suatu vertex menentukan warna dari seluruh obyek tersebut. Untuk segmen garis, warnanya ditentukan oleh warna vertex kedua (vertex akhir).

PEWARNAAN PADA OPENGL
6.4. Persepsi warna

Secara fisik, cahaya adalah susunan dari foton, partikel kecil dari cahaya yang melintas pada jalurnya serta bergetar pada frekuensinya masing-masing. Karakteristik dari foton dibentuk oleh posisi, arah dan frekuensi/panjang gelombang/energinya. Foton dengan panjang gelombang antara 390 nm sampai dengan 720 nm merupakan spektrum yang terlihat, membentuk warna pelangi. Bagaimanapun juga, mata kita merasakan banyak warna yang tidak berada dalam pelangi, seperti putih, hitam, coklat, pink dan lain-lain. Bagaimana hal tersebut dapat terjadi? Apa yang dilihat oleh mata kita sebenarnya adalah campuran dari foton dengan frekuensi yang berbeda-beda. Sumber cahaya ditentukan oleh distribusi dari frekuensi foton yang mereka pancarkan. Cahaya putih ideal terdiri dari cahaya-cahaya dari seluruh frekuensi dengan jumlah yang sama.

Mata manusia merasakan warna ketika sel-sel pada retina yang bernama cone tereksitasi setelah “ ditembak” oleh foton. Tiga macam sel cone memberi respon yang terbaik untuk tiga cahaya dengan panjang gelombang yang berbeda, yaitu merah, hijau dan biru (orang yang menderita buta warna biasanya kehilangan salah satu tipe dari sell cone di atas). Ketika campuran foton memasuki mata, sel cone dalam retina mencatat derajat dari eksitasi berdasarkan tipe masing-masing, dan jika campuran foton yang berbeda datang sehingga menyebabkan eksitasi tiga tipe dari sel cone pada derajat yang sama, warna tersebut tidak dapat dibedakan dari campuran yang pertama. Karena masing-masing warna dicatat oleh mata sebagai level eksitasi dari sel cone oleh foton yang datang, mata dapat merasakan warna yang tidak berada dalam spektrum yang dihasilkan oleh prisma atau pelangi. Sebagai contoh jika campuran dari foton merah dan biru dikirim sehingga sel cone merah dan biru dalam retina tereksitasi, mata akan melihatnya sebagai magenta, yang tidak ada dalam spektrum warna. Monitor komputer mengemulasikan warna oleh partikel cahaya dengan kombinasi cahaya RGB sesuai dengan proporsi sel cone dalam retina yang tereksitasi. Hal itu dilakukan dengan melihat level eksitasi yang dihasilkan oleh campuran foton yang dicoba untuk diemulasikan. Untuk menampilkan warna tersebut, monitor mrngirimkan sejumlah cahaya RGB untuk merangsang sel cone dalam mata kita. Monitor warna dapat mengirim proporsi RGB yang berbeda pada tiap-tiap piksel dan mata akan melihat jutaan cahaya dengan warnanya masing-masing.

.. 6. Untuk mengetahui jumlah bitplane yang tersedia dalam sistem. Mode RGBA versus mode indeks warna Pada layar komputer.5. 255/255 = 1. Informasi warna dari tiap-tiap piksel dapat disimpan dalam mode RGBA. hardware menyebabkan di setiap piksel dari layar tersebut dipancarkan cahaya RGB dalam jumlah yang berbeda-beda. GL_GREEN_BITS.6. 1/255. 2.5.. Setiap indeks warna ditunjukkan oleh suatu nilai dalam tabel yang mendefinisikan nilai-nilai RGB.0 menghasilkan intensitas maksimum. Sebagai contoh jika sistem menyediakan 8 bit untuk komponen R. maka terdapat 8 bit warna setiap piksel sehingga ada 28 = 256 warna berbeda yang bisa disimpan pada piksel.0. Nilai ini ditentukan oleh jumlah bitplane dalam framebuffer.0 menghasilkan intensitas minimum dan 1. akan tetapi hal ini tidak selalu benar. dimana sebuah nilai (disebut indeks warna) disimpan untuk tiap-tiap piksel.. dan GL_ALPHA_BITS sebagai parameter. maka integer antara 0-255 dapat disimpan. 2/255. Jika ada 8 bitplane warna.0. suatu nilai tertentu dari data warna disimpan pada tiap-tiap piksel.. Nilai RGB dari bitplane . . . sehingga 0.2. Sebuah bitplane berisi 1 bit dari data untuk tiap-tiap piksel. Gambar 6-1. Bitplane sering dibagi untuk menyimpan komponen RGB sehingga sistem 24 bitplane menyediakan 8 bit masing-masing untuk RGB. dan nilai dari paket tersebut disebut dengan nilai RGB (atau RGBA). Mode RGBA Pada mode RGBA.. 255 pada bitplane dapat diartikan nilai R sebesar 0/255 = 0. 1. dimana nilaii RGBA disimpan untuk tiap-tiap piksel. Tabel tersebut disebut dengan peta warna. atau dengan mode indeks warna. kita bisa menggunakan perintah glGetIntegerv() dengan GL_RED_BITS. Pada mode indeks warna atau RGB. 0. Nilai ini biasanya dipaket bersama (kadang-kadang dengan nilai keempat yang disebut dengan Alpha (A)). yang disebut nilai RGB. GL_BLUE_BITS. Tanpa memperhatikan jumlah bitplane. Nilai RGBA disimpan sebagai integer dan diskalakan dengan jumlah bit yang tersedia untuk penyimpanan. hardware menyimpan jumlah bitplane untuk tiap-tiap komponen RGBA.

Karena mata kita cukup jauh dari layar sehingga tidak dapat membedakan tiap-tiap piksel. sedangkan warna pink yang lebih putih dapat dihasilkan dengan mengisi proporsi piksel lebih banyak dengan warna putih. yaitu hitam. Dengan cara ini. Sebagai contoh. Tapi walaupun mesin kita mempunyai 24 bitplane bukan berarti proses dithering tidak terjadi. kita bisa mendapatkan gambar berkualitas tinggi tanpa proses dithering. merah.2. Gambar 6-2. anggaplah sistem kita hanya mempunyai 1 bit masingmasing untuk RGB. jika kita menggunakan mode double-buffer. hijau. 6. biru. dimana n adalah jumlah bitplane sehingga mesin dengan 24 bitplane untuk RGB dapat menampilkan lebih dari 16. Jumlah warna tidak dapat melebihi 2n. cyan dan magenta. rata-rata dari warna merah dan putih. kuning. Jadi sistem tersebut hanya bisa menampilkan 8 warna. masing-masing 12 sehingga hanya ada 4 bit pada tiap-tiap . hardware dapat mengisi daerah tersebut dengan warna merah dan putih. Kita tidak bisa melakukan proses dithering pada satu piksel saja. Warna pink yang lebih merah dapat dihasilkan dengan mengisi proporsi piksel yang lebih banyak dengan warna merah.daerah tersebut akan tampak berwarna pink.6. dan seterusnya.77 juta macam warna. Dithering Beberapa hardware grafik menggunakan dithering untuk meningkatkan jumlah warna yang dapat ditampilkan dengan mengorbankan resolusi spatial. putih.Jumlah macam warna yang dapat ditampilkan pada tiap-tiap piksel tergantung jumlah bitplane dan kapasitas dari hardware untuk menginterpretasikan bitplane tersebut. tidak ada piksel yang berwarna pink. Untuk menggambarkan bagaimana proses dithering bekerja. Dhitering hitam dan putih untuk menghasilkan abu-abu Dengan 8 bit pada tiap-tiap RGB. bitplane mungkin dibagi menjadi 2. Satu-satunya jalan untuk menghasilkan efek di atas adalah dilakukan pada suatu daerah yang terdiri dari berbagai piksel. hardware mengisi piksel yang berada di dalam poligon dengan campuran dari warna-warna terdekat sehingga menampilkan warna rata-rata untuk mata kita sesuai dengan warna yang kita inginkan. Dithering adalah teknik untuk menggunakan beberapa warna untuk membentuk efek warna lain. Untuk menampilkan warna pink pada suatu daerah. Jika kita membentuk suatu nilai RGB untuk suatu warna yang tidak tersedia dan mengisi suatu poligon.

Palet seorang pelukis menyediakan tempat untuk mencampur cat. Nilai bitplane tersebut menunjuk ke peta warna dan layar akan diwarnai dengan nilai RGB dari peta warna. 4 bit setiap komponen warna akan memberi hasil yang kurang memuaskan. 6. Gambar 6-3. Tanpa dithering. Mode indeks warna Dengan mode indeks warna. . Peta warna Pelukis memilih sebuah warna dari palet warna dan melukis dengan warna tersebut. peta warna menunjukkan dimana nilai RGB dicampur. Komputer menyimpan indeks warna dalam bitplane untuk tiaptiap piksel. dan mirip dengan hal tesebut.komponen RGB.2.7. OpenGL menggunakan peta warna yang mirip dengan menggunakan palet untuk mencampur cat pada saat melukis.

Sedangkan pada mode indeks warna. Biasanya berkisar antara 256(28) sampai 4096(212). Dengan mode RGBA.8.Gambar 6-4. seluruh piksel yang berindeks sama akan ikut berubah. - . Ukuran peta warna ditentukan oleh hardware yang digunakan. Menggunakan peta warna untuk mewarnai gambar Pada mode indeks warna. Jika isi dari peta warna berubah. tiap-tiap piksel dengan indeks yang sama disimpan pada lokasi yang sama. tiap-tiap warna piksel tidak tergantung piksel lain. Memilih antara mode RGBA atau mode indeks warna Kita mungkin lebih baik menggunakan mode indeks warna pada kasus-kasus di bawah ini: - Jika kita melanjutkan aplikasi yang sudah ada dan menggunakan mode indeks warna. Ukuran peta warna merupakan pangkat dari 2 diindeks oleh jumlah bitplane yang tersedia pada mode indeks warna. 6. maka jumlah warna yang bisa ditampung adalah kurang dari 2n dan 2m. jumlah warna yang tersedia terbatas oleh ukuran peta warna dan jumlah bitplane yang tersedia. Jika ada 2n indeks pada peta warna dan m bitplane yang tersedia.2. Jika kita hanya mempunyai bitplane dalam jumlah sedikit dan jika kita hanya perlu warna kurang dari 2n.

unsigned byte. warna dari tiap-tiap vertex diperlakukan sendiri-sendiri. Akhiran pertama dari perintah di atas menunjukkan tipe data dari parameter: short.3. unsigned short atau unsigned integer. integer. Kita dapat menentukan teknik shading sesuai dengan yang kita inginkan dengan perintah glShadeModel(). 6. TYPEa). TYPEg. warna-warna sepanjang segmen garis tersebut ditambahkan pada warna vertex. menunjukkan apakah kita memasukkan nilai alpha disamping nilai RGB. Parameter mode dapat diset GL_SMOOTH(default) atau GL_FLAT. fog. Argumen pertama dari . Sedangkan pada smooth shading. Perintah di atas mempunyai 3 macam akhiran yang bervariasi sesuai dengan parameter yang diterima. Pembentukan warna pada mode indeks warna Untuk mode indeks warna gunakan perintah glIndex*() untuk memilih warna yang akan digunakan: void glIndex{s i f d}(TYPE c). Untuk sementaara anggaplah kita mempunyai rutin auxSetOneColor() yang melakukan load satu indeks pada peta warna dengan nilai RGB.- Jika kita mempunyai bitplane dalam jumlah terbatas. kita harus membuat suatu jalur perubahan warna yang halus diantara indeks-indeks dalam peta warna. Dengan flat shading. titik-titik yang berdekatan mempunyai perbedaan nilai warna yang kecil. integer. sehingga lebih baik memilih mode indeks warna. float atau double. mode RGBA mungkin akan menyebabkan proses shading yang kasar.0. Secara umum gunakanlah mode RGBA. Akhiran pertama adalah 3 atau 4. Pada mode indeks warna titik-titik yang berdekatan mungkin menunjuk pada lokasi yang berbeda pada tabel indeks warna. Penggunaan warna pada model shading 6. Pemetaan warna pada peta warna dibentuk melalui sistem window. Sedangkan akhiran ketiga adalah optional v yang menunjukkan argumen tersebut adalah pointer pada suatu array sesuai dengan tipe datanya.4. Akhiran kedua menunjukkan tipe data untuk parameter: byte. shading. Untuk sebuah garis.5.6. void glColor3{b s i f d ub us ui}v(const TYPE*v). Pada mode RGBA hal ini kelihatan mirip sehingga perubahan warna dalam poligon tampak halus (bertahap sedikit demi sedikit). TYPEg. seperti animasi. Jika nilai tersebut tidak dimasukkan. lighting. Untuk mengatasi hal tersebut. void glColor3{b s i f d ub us ui}(TYPEr.3. double. void glIndex{s i f d}v(const TYPE *c). karena memberikan hasil yang lebih baik untuk texture mapping. 6. void glColor4{b s i f d ub us ui}(TYPEr. Akhiran kedua adalah optional v yang menunjukkan bahwa argumen tersebut adalah nilai dari suatu array sesuai dengan tipe data yang diberikan (array tersebut hanya berisi 1 nilai). Dengan smooth shading. void glShadeModel(GLEnum mode). float. antialiasing dan blending. yang mungkin tidak mirip sama sekali.6. Pembentukan model shading Sebuah garis atau poligon terisi dapat digambar dengan satu warna (flat shading) atau dengan berbagai macam warna (smooth shading). TYPEb). - Mode indeks warna akan berguna untuk berbagai macam trik. otomatis akan diset 1. 6. TYPEb. warna-warna dari interior poligon tersebut ditambahkan pada warna vertex. Sedangkan pada poligon. void glColor4{b s i f d ub us ui}v(const TYPE*v). Pembentukan warna pada mode RGBA Pada mode RGBA gunakan perintah glColor*() untuk memilih warna yang akan digunakan. short. warna dari suatu vertex diduplikat ke seluruh vertex dari obyek tersebut.3.

warnanya ditentukan oleh warna vertex kedua (vertex akhir). .i++) auxSetOneColor(16+i. 0.0*(i/32.0*(i/32.0). Dengan flat shading warna dari suatu vertex menentukan warna dari seluruh obyek tersebut.0).i<32.0). kita mungkin akan memanggil rutin auxSetOneColor() sebagai berikut: for(i=0.rutin ini adalah nilai RGB. Untuk segmen garis. Untuk melakukan load 32 indeks warna yang berdekatan (dari indeks 16 sampai 47) dengan sedikit perubahan dari warna kuning. 1. 1.

PENCAHAYAAN PADA OPENGL Ketika kita melihat suatu permukaan. Jika sinar yang diberikan berwarna hijau. persepsi mata kita terhadap warna tergantung dari distribusi energi foton yang tiba dan merangsang sel cone seperti yang telah dijelaskan pada bab sebelumnya. Pembentukan sumber cahaya . Jika sinar diarahkan langsung tanpa melalui sudut tertentu maka obyek pada sisi dimana sinar menyorot akan tampak lebih terang dari sisi yang lain. maka bola tersebut akan tampak berwarna hitam karena seluruh sinar hijau akan diserap sedangkan tidak ada sinar yang dipantulkan. seluruh sinar merah dipantulkan sehingga bola terlihat berwarna merah. karena tidak ada sinar merah. Foton-foton datang dari satu ataupun kombinasi dari beberapa sumber cahaya dimana sebagian diserap dan sebagian lagi dipantulkan oleh permukaan tersebut. Specular Sinar yang terarah. Jika bola tersebut diberi sinar putih (campuran dari warna RGB dalam jumlah yang sama). Diffuse Sinar yang datang dari arah tertentu tetapi dipantulkan ke segala arah oleh permukaan obyek. jadi datang dari arah tertentu dan terpantul ke arah tertentu pula. Model pencahayaan OpenGL terdiri dari 3 komponen sinar. Warna material tergantung pada prosentase dari sinar RGB yang dipantulkan. Begitu pula jika sinar yang diberikan berwarna merah. Komponenkomponen sinar tersebut antara lain: Ambient Sinar yang datang ke permukaan obyek dari sembarang arah sebagai akibat dari pantulan ruangan di sekeliling obyek sehingga tidak mempunyai arah datang yang khusus. Contohnya sebuah bola yang berwarna merah memantulkan semua sinar merah yang datang dan menyerap sinar hijau dan biru. 7.1.

y.0.0.z.z) Tabel parameter dari glLight*() Di bawah ini adalah salah satu contoh penggunaan perintah glLight*() untuk membentuk sumber cahaya: GLfloat light_ambient[] = {0. Argumen pertama menunjukkan cahaya dimana propertinya ingin dibentuk. 1.0.0}. glLightfv(GL_LIGHT0. void glLight{i f}[v](Glenum light. yang membutuhkan 3 argumen. … . 0.0.0. 1. 0. GLfloat light_position[] = {1.y.0.0. Perintah di atas digunakan untuk membentuk sumber cahaya yang bisa merupakan GL_LIGHT0.0) 0. 1. 0. 1.0 0. 1. glLightfv(GL_LIGHT0.0. 1.0}.0 Keterangan Intensitas sinar ambient Intensitas sinar diffuse Intensitas sinar specular Posisi sinar (x.0.0) (0. 1. seperti warna. 1. GLfloat light_specular[] = {1.0) (0. 0. 1.0.0 0. GL_DIFFUSE.0.0 180. 0. Sedangkan argumen param merupakan nilai untuk mengisi parameter kedua. 1. Perintah yang digunakan untuk membentuk properti tersebut adalah glLight*(). GL_AMBIENT. glLightfv(GL_LIGHT0. light_specular).0. Glenum pname. 1. light_ambient). 1. yang kedua adalah propertinya dan yang terakhir adalah nilai yang diinginkan dari properti pada argumen kedua.0. 1.0. .0. 0. 1.0.0.0. posisi dan arah. GL_LIGHT1. GLfloat light_diffuse[] = {1.Sumber cahaya mempunyai sejumlah properti. 1. -1. 0. Nama parameter GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_POSITION GL_SPOT_DIRECTION GL_SPOT_EXPONENT GL_SPOT_CUTOFF GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION Nilai default (0.0}.0.0. 1.0. glLightfv(GL_LIGHT0. GL_LIGHT7.0. TYPEparam). GL_POSITION. GL_SPECULAR.0. light_diffuse).0.0) (1. Karakteristik dari cahaya didefinisikan oleh pname yang berisi parameter-parameter (lihat tabel).w) Arah spotlight (x.0 1. 0. light_position).0.0.0) (1.0}. 1.

gunakan parameter GL_LIGHT_MODEL_AMBIENT seperti di bawah ini: GLfloat lmodel_ambient[] = {0. yang pertama dinamakan sumber cahaya directional. z menggambarkan arahnya. GL_POSITION. kita memberikan sebuah vektor dengan 4 nilai (x. kita masih dapat melihat obyek dalam scene. Komponen-komponen tersebut - Intensitas cahaya ambient global Posisi sudut pandang apakah bersifat lokal ataukah dianggap mempunyai jarak yang sangat jauh.0}. 0.0. - Apakah perhitungan cahaya dibuat berbeda antara permukaan depan dan belakang obyek. 1. Karena nilai di atas menghasilkan cahaya ambient berwarna putih dalam jumlah kecil.0}. 7.2. arah dari vertex ke sumber cahaya dan arah dari vertex ke sudut pandang. glLightModelfv(GL_LIGHT_MODEL_AMBIENT.2. Untuk membentuknya kita harus menentukan penyebaran cahaya yang dinginkan dengan jalan mengeset parameter GL_SPOT_CUTOFF. khususnya arah dari datangnya sinar. light_position). Contoh dari tipe ini adalah lampu belajar. adalah: Penentuan model cahaya Model cahaya pada OpenGL mempunyai 3 komponen. Disebut begitu karena posisinya menentukan efek yang tampak.1.2. . 0. 7. w) untuk parameter GL_POSITION. Untuk membentuk intensitas RGBA dari cahaya ambient global. intensitas cahaya pada suatu vertex tergantung dari bentuk normal vertex tersebut.Ada dua macam tipe dari sumber cahaya. Cahaya ambient global Setiap sumber cahaya dapat memberikan cahaya ambient ke scene.0. glLightfv(GL_LIGHT0.2. 1. GLfloat light_position[] = {1.2. 7. z membentuk lokasi dari sumber cahaya. y.2. 0. maka cahaya yang terbentuk bertipe directional dan nilai x. Kita dapat membentuk sumber cahaya positional seakan-akan seperti lampu sorot. y. Tipe yang kedua adalah sumber cahaya positional. salah satu contohnya adalah cahaya matahari. Lebih khusus. Sudut pandang Letak dari sudut pandang mempengaruhi perhitungan untuk cahaya yang dihasilkan oleh pantulan specular. y. 1.0. Sumber cahaya ini jaraknya sangat jauh (tak terbatas). Jika nilai terakhir (w) bernilai nol. maka walaupun kita tidak menambah sumber cahaya lain ke scene.2. Sudut dari penyebaran cahaya tersebut adalah dua kali dari nilai yang diisikan ke parameter GL_SPOT_CUTOFF. Jika w tidak nol maka tipe yang terbentuk adalah positional dan nilai x. Seperti yang terlihat. lmodel_ambient). z.

Karena kita biasa mengeset kondisi cahaya dengan permukaan depan dari poligon. Sphere Pada gambar 7-1 dimana obyeknya adalah sebuah sphere. hanya permukaan depan saja yang terlihat. Gambar 7-1.2. Oleh karena itu sudut pandang tak terbatas digunakan sebagai default. mungkin kita perlu menyoroti permukaan dalam dari sphere tersebut dengan cahaya yang telah kita definisikan. arah antara sudut pandang dan setiap vertex pada scene adalah konstan. tetapi karena arahnya harus selalu dihitung untuk tiap-tiap vertex menyebabkan berkurangnya kinerja (lambat). 7. Pencahayaan dua sisi Perhitungan cahaya dibentuk untuk seluruh poligon. Jadi dalam hal ini tidak penting bagaimana tampilan dari permukaan belakang. GL_TRUE). apakah permukaan depan atau belakang. yaitu depan dan belakang dengan perintah di bawah ini: glLightModeli(LIGHT_MODEL_TWO_SIDE. Jika sphere tersebut dipotong sehingga permukaan dalamnya terlihat. Sudut pandang lokal cenderung memberi hasil yang lebih realistis.Dengan sudut pandang tak terbatas.4. permukaan belakangnya tidak diberi cahaya dengan tepat. 7.3.2. Mengaktifkan cahaya . Kita dapat merubah model cahaya menjadi 2 permukaan.

0. Kita juga harus mengaktifkan tiap-tiap sumber cahaya yang telah kita definisikan dengan perintah yang sama. Pendefinisian properti material Kita telah mengetahui bagaimana membentuk sumber cahaya beserta karakteristiknya dan bagaimana mendefinisikan model cahaya yang kita inginkan. Glenum pname.1. void glMeterial{i f}[v]( Glenum face. GL_LIGHT7. Sedangkan untuk membuat cahaya menjadi disable perinahnya adalah: glEnable(GL_LIGHTING). Parameter face dapat diisi GL_FRONT.2.0.0) Keterangan Warna ambient dari material Warna diffuse dari material Warna ambient dan specular dari material GL_SPECULAR GL_SHININESS (0.2.0) 0. 1.Pada OpenGL kita harus mengaktifkan cahaya secara eksplisit dengan menggunakan perintah: glEnable(GL_LIGHTING).0. 0. 7. 0. … .0. GL_BACK atau GL_FRONT_AND_BACK untuk menunjukkan permukaan dari obyek tempat material diterapkan. Pemantulan diffuse mempunyai pengaruh penting untuk menentukan warna yang kita lihat dari sebuah obyek.2.3.0. Hal itu dipengaruhi oleh warna dari cahaya diffuse dan sudut jatuhnya cahaya .3. 0. Pada bagian ini kita akan membahas bagaimana mendefinisikan properti material dari suatu obyek dalam scene. 0.TYPE param). GL_LIGHT1.8.8.0. diffuse dan specular warna dari pancaran cahaya 7. Perintah yang digunakan adalah gl Material*(). 1. Refleksi diffuse dan ambient Parameter GL_DIFFUSE dan GL_AMBIENT yang diset pada glMaterial*() mempengaruhi warna dari cahaya diffuse dan ambient yang dipantulkan oleh sebuah obyek.0. 0. 1. Sedangkan untuk mengisi parameter pname dapat dilihat pada tabel di bawah ini: Nama parameter GL_AMBIENT GL_DIFFUSE GL_AMBIENT_AND_DIFFUSE Nilai default (0. 1.0) Pemancaran material GL_COLOR_INDEXES (0. 0.0 Warna specular dari material Tingkat specular GL_EMISSION (0. 0. 1.0) (0. hanya saja parameternya adalah tia-tiap sumber cahaya seperti GL_LIGHT0.8. 1) Indeks warna dari cahaya ambient.

mat_specular). GLfloat low_shininess[] = {5. Pemantulan ambient total dari sebuah obyek dipengaruhi oleh cahaya ambient global dan cahaya ambient dari sumber cahaya.0 sampai dengan 128. Contohnya adalah jika kita memandang bola logam yang terkena sinar matahari.0. Contoh: GLfloat mat_emission[] = {0. Karena sebagian besar obyek nyata tidak memancarkan cahaya. GL_AMBIENT_AND_DIFFUSE. Seperti juga pemantulan diffuse.0}. 0. pemantulan ambient juga tidak dipengaruhi oleh letak sudut pandang.3. kita mungkin akan menggunakan perintah ini kebanyakan untuk simulasi lampu atau sumber cahaya lain dalam scene. Contoh: GLfloat mat_specular[] = {1.2. glMaterialfv(GL_FRONT. GL_SHININESS.0}. 0. 7. GL_EMISSION. Contoh: GLfloat mat_amb_diff[] = {0. pemantulan ambient dan diffuse biasanya menggunakan warna yang sama sehingga OpenGL memberikan jalan untuk mengeset nilai yang sama untuk keduanya secara serentak dengan menggunakan perintah glMaterial*(). Kita dapat mengisi GL_SHININESS dengan nilai antara 0. Tidak seperti pemantulan ambient dan diffuse.0.1.8. Karena pemantulan diffuse lebih terang pada bagian obyek yang disinari. Jika kita menggerakkan kepala kita. GL_SPECULAR. 1. low_shininess).3.0}. OpenGL memungkinkan kita untuk mengeset warna RGBA dari sorotan specular (dengan GL_SPECULAR) dan tingkat kecerahan dari sorotan specular (dengan GL_SHININESS). maka sorotan yang dihasilkan oleh sinar matahari akan ikut bergerak. Pemantulan ambient berpengaruh pada warna obyek secara keseluruhan. 7. glMaterialfv(GL_FRONT.0. 0. pemantulan ambient tampak pada bagian obyek yang tidak disinari.2. . Posisi sudut pandang tidak mempengaruhi pemantulan diffuse sama sekali.3. 1.3. pemantulan specular tergantung pada sudut pandang.5. Refleksi specular Pemantulan specular dari sebuah obyek menghasilkan sorotan. mat_amb_diff).0}.2. Emisi Dengan menggunakan warna RGBA untuk GL_EMISSION.tersebut dengan garis normal (yang paling kuat adalah jika cahaya jatuh tegak lurus ke permukaan).0. Untuk obyek nyata. kita dapat membuat sebuah obyek terlihat memancarkan cahaya sesuai dengan warna yang kita set. 1. 1. 0. 0. glMaterialfv(GL_FRONT_AND_BACK. mat_emission). glMaterialfv(GL_FRONT.

1. Terakhir. GL_LUMINANCE atau GL_LUMINANCE_ALPHA. Parameter format dan type menggambarkan format dan tipe data dari image tekstur. G dan B serta nilai 4 memilih komponen RGBA. Kemudian OpenGL menentukan tekstur mana . 8. Jika hanya ada satu resolusi. GL_BLUE. Glint border. Glsizei width. GL_SHORT. GL_INT. Oleh karena itu jika obyek tersebut bergeser menjauhi titik pandang. Parameter target dimaksudkan untuk penggunaan kelak oleh OpenGL.1.1. Glenum format. maka ukuran dari tekstur pun harus berkurang sesuai dengan ukuran dari obyeknya. GL_RGBA. Glint level. Perintah tersebut memerlukan beberapa argumen yang diterangkan di bawah ini: void glTexImage2D(Glenum target. biasanya berisi nol. Mipmapping Seperti obyek yang lain. GL_UNSIGNED_INT.TEKSTUR MAPPING 8. Sedangkan parameter type dapat diisi dengan GL_BYTE. GL_ALPHA. dalam hal ini harus diset GL_TEXTURE_2D. G. obyek bertekstur dapat ditampilkan dalam berbagai jarak dengan titik pandang. GL_RED. GL_RGB. maka parameter ini diset nol. Glsizei height. Nilai 1 memilih komponen R. GL_UNSIGNED_SHORT. GLenum type. Parameter berikutnya. Parameter level digunakan jika kita mempunyai berbagai resolusi dari tekstur. Width dan height berukuran 2m+2b dimana m adalah integer dan b adalah nilai dari border. GL_FLOAT atau GL_BITMAP. Parameter width dan height adalah ukuran dari image tekstur. Penentuan tekstur Perintah glTexImage2D() mendefinisikan tekstur 2 dimensi. 3 memilih komponen R. GL_GREEN. pixels berisi data image tekstur. GL_UNSIGNED_BYTE. Parameter format dapat diisi GL_COLOR_INDEX. Glint components. const Glvoid *pixels). Border menunjukkan lebar garis tepi. adalah integer antara 1 sampai dengan 4 yang menunjukkan komponen R. B dan A yang dipilih untuk digunakan pada proses modulating dan blending. Untuk itu OpenGL harus memfilter tekstur map ke ukuran yang tepat untuk dimapke obyek. components. 2 memilih komponen R dan A. Kita dapat menentukan serangkaian tekstur map dalam resolusi yang lebih kecil yang disebut dengan mipmaps.

sebuah teksel dari tekstur jarang diwakili oleh sebuah piksel dari image pada layar. Dengan pendekatan ini jika image dari obyek mengecil maka ukuran dari tekstur map juga berkurang. kita menyediakan semua ukuran tekstur dalam pangkat dari 2 antara ukuran terbesar sampai dengan ukuran 1x1. dan seterusnya. Dimulai dari nol. Untuk menentukan magnifikasi atau minifikasi. tetapi setelah dimap ke poligon atau permukaan dan ditransformasi ke koordinat layar.yang akan dimap ke obyek. Magnifikasi dan minifikasi tekstur . mipmaps Teknik ini disebut dengan mipmapping (mip adalah singkatan dari bahasa latin multim in parvo yang artinya sesuatu yang banyak di tempat yang kecil/sempit). 8. dengan nilai yang berbeda dari parameter level. sebuah piksel pada layar dapat mewakili sebagian dari teksel (magnification) atau sekumpulan teksel (minification) seperti pada gambar 8-2.2. Sebagai contoh jika resolusi terbesarnya adalah 64x16. 16x4. width. level menunjukkan tekstur mana yang dipilih. gunakan perintah di bawah ini: Gambar 8-2. 4x1. Gambar 8-1.1. gunakan perintah glTexImage2D() sekali tiap resolusi atau ukuran dari tekstur map. tekstur dengan ukuran 64x16 dideklarasikan dengan level=0. Seperti pada contoh di atas. Jika mipmap perlu untuk dibesarkan (atau dikecilkan) magnifikasi (atau minifikasi) diperlukan. Untuk menggunakan mipmapping. kita juga harus menyediakan map untuk ukuran 32x8. 2x2 dan 1x1. 8x2. 32x8 dengan level=1. height dan image. Untuk menentukan tekstur ini. Tergantung dari transformasi dan tekstur mapping yang digunakan. Mengontrol filtering Tekstur map berbentuk bujursangkar atau persegipanjang.

Jadi GL_LINEAR_MIPMAP_LINEAR memberikan hasil terbaik. Tabel metode filtering untuk magnifikasi dan minifikasi Jika kita memilih GL_NEAREST. GL_NEAREST_MIPMAP_LINEAR. GL_NEAREST). glTexParameteri(GL_TEXTURE_2D. Argumen pertama dari glTexParameter*() adalah GL_TEXTURE_2D atau GL_TEXTURE_1D tergantung tekstur yang digunakan 2 dimensi ataukah 1 dimensi. atau dapat pula menyisipkan nilai rata-rata dengan GL_LINER MIPMAP_NEAREST. GL_TEXTURE_MIN_FILTER. Menggunakan teksel terdekat akan lebih cepat tetapi memberi hasil yang kurang memuaskan. GL_NEAREST_MIPMAP_LINEAR memilih teksel terdekat dari 2 map dan menyisipkan rata-rata diantaranya. Gunakan GL_NEAREST_MIPMAP_LINEAR atau GL_LINEAR_MIPMAP_LINEAR untuk menyisipkan nilai teksel dari 2 mipmap terbaik yang dipilih. Argumen yang kedua adalah GL_TEXTURE_MAG_FILTER atau GL_TEXTURE_MIN_FILTER untuk menentukan metode yang digunakan magnifikasi ataukah minifikasi. tetapi memerlukan waktu yang lebih banyak. maka rata-rata dari array terdekat 2x2 yang terdekat terhadap pusat dari piksel digunakan untuk magnifikasi dan minifikasi. GL_NEAREST_MIPMAP_NEAREST. teksel dengan koordinat terdekat terhadap pusat dari piksel digunakan untuk magnifikasi dan minifikasi.glTexParameteri(GL_TEXTURE_2D. GL_NEAREST). Argumen ketiga menentukan metode filtering yang digunakan (lengkapnya lihat tabel). GL_ LINEAR_MIPMAP_LINEAR. Jika GL_LINEAR yang dipilih. GL_TEXTURE_MAG_FILTER. GL_LINEAR_MIPMAP_NEAREST. GL_LINEAR GL_NEAREST. . Kita dapat memilih teksel terdekat dengan GL_NEAREST. GL_LINEAR. Parameter GL_TEXTURE_MAG_FILTER GL_TEXTURE_MIN_FILTER Nilai GL_NEAREST. sedangkan GL_LINEAR_MIPMAP_LINEAR menggunakan penyisipan untuk menghitung nilai dari 2 map dan menyisipkan nilai baru diantara keduanya.

warna tekstur menggantikan warna potongan. Parameter target harus diisi GL_TEXTURE_ENV. Tekstur 1 dimensi Kadang-kadang tekstur 1 dimensi saja cukup bagi kita. Kita juga bisa menggunakan nilai dalam tekstur map untuk mengatur warna dari permukaan yang diwarnai tanpa tekstur atau mencampur warna dalam tekstur map dengan warna non-tekstur dari permukaan. Glenum pname. Jika 2 komponen. TYPE param). Perintah tersebut mengeset fungsi tekstur.1. param adalah sebuah array dari nilai floating point yang menunjukkan komponen RGBA. Fungsi tekstur memilih komponen dari nilai tekstur dan warna yang akan digunakan tanpa tekstur.2. nilai dari tekstur map telah digunakan sebagai warna untuk mewarnai permukaan. Pada 2 mode yang lain. Tiga komponen akan membentuk warna RGB (C) dan 4 . Glenum format. GLenum type. Glint components. maka yang pertama adalah luminance dan yang kedua adalah alpha (A).8. Glsizei width. Jika pname adalah GL_TEXTURE_ENV_COLOR. Modulating dan blending Pada seluruh contoh sejauh ini. Untuk itu gunakan perintah di bawah ini: void glTexEnv{i f}{v}(Glenum target. Semua parameter mempunyai arti yang sama dengan pada perintah glTexImage2D() kecuali bahwa image sekarang merupakan array 1 dimensi. 8. Jika yang dipilih 1 komponen maka dia adalah nilai luminance (L). GL_MODULATE atau GL_BLEND. Untuk menentukan tekstur 1 dimensi gunakan perintah di bawah ini: Void glTexImage1D(Glenum target. Tekstur 1 dimensi mempunyai sifat-sifat seperti pada tekstur 2 dimensi dengan height=1 dan tanpa border atas dan bawah. argumen ketiga adalah jumlah komponen RGBA yang dipilih untuk tiap-tiap teksel. param bisa diisi GL_DECAL. Ketika kita menentukan tekstur map dengan glTexImage*(). Jika pname adalah GL_TEXTURE_ENV_MODE. warna akhir adalah kombinasi dari nilai tekstur dan potongan. Pada mode decal dan dengan 3 komponen tekstur. Glint border. atau dengan 4 komponen tekstur.3. untuk menentukan bagaimana nilai tekstur dikombinasikan dengan nilai warna dari potongan yang diproses. Glint level. const Glvoid *pixels).

.3.A=Af C=(1-Lt)Cf+LtCc. A=Af Mode modulate C=LtCf. glColor*() dan glNormal*(). sedangkan untuk tekstur 2 dimensi kita gunakan koordinat s dan t. c menunjukkan nilai yang diberikan dengan GL_TEXTURE_ENV COLOR dan tanpa subscribe berarti nilai akhir. A=Af C=CtCf. untuk tekstur 1 dimensi kita menggunakan koordinat s. Perintah untuk mnentukan koordinat tekstur adalah glTexCoord*() yang mirip dengan glVertex*(). modulate dan blend Dalam tabel tersebut. 2. Sedangkan mode modulate kita gunakan untuk membuat tekstur yang bereaksi terhadap cahaya. A=AtAf C=CtCf. Untuk sementara abaikan koordinat r. t dan r. Kita menggunakan mode decal jika kita ingin menerapkan tekstur buram untuk sebuah obyek. Koordinat q. A=AtAf Mode blend C=(1-Lt)Cf+LtCc. sedangkan nilai r diset 0 dan q diset 1. Koordinat tersebut biasanya ditunjukkan sebagai s. sedangkan nilai q diset 1. Dengan glTexCoord2*() kita menentukan nilai s dan t. f menunjukkan nilai fragment (potongan). Assignment koordinat pada suatu tekstur Pada saat menggambar scene tekstur map. Biasanya nilai koordinat tekstur berkisar antara 0 dan 1. subscribe t menunjukkan nilai tekstur. t.komponen akan menyediakan warna dalam RGBA. Dan untuk menentukan nilai dari semua koordinat kita gunakan glTexCoord4*(). seperti koordinat w pada koordinat obyek biasanya diberi nilai 1 dan bisa digunakan untuk membuat koordinat homogen. r dan q untuk membedakan dengan koordinat obyek (x. Dengan glTexCoord3*() kita menentukan nilai s. kita harus menyediakan koordinat obyek dan koordinat tekstur. 3 atau 4 koordinat. t. void glTexCoord{1 2 3 4}{s i f d}{v}(TYPE coords). Perintah tersebut digunakan untuk mengeset koordinat tekstur (s. 8. Komponen-komponen yang digunakan oleh fungsi tekstur ditunjukkan dalam tabel di bawah ini: Komponen Mode decal Tak terdefinisi Tak terdefinisi C=Ct. r dan q). z dan w). A=Af C=LtCf. y. Dengan glTexCoord1*() kita menentukan nilai s. Jika diikuti dengan pemanggilan perintah glVertex*() maka pada vertex tersebut diberikan koordinat tekstur yang sedang aktif. A=Af C=(1t)Cf+AtCt. sedangkan t dan r diset 0 dan q diset 1.A=AtAf Tak terdefinisi Tak terdefinisi 1 2 3 4 Tabel fungsi decal. Koordinat tekstur bisa terdiri dari 1.

Dengan mengulang tekstur. Gambar 8-4.1] dan mengulang atau melakukan clamp dalam tekstur map. Melakukan clamping pada tekstur . maka kita akan mendapatkan 100 kopi dari tekstur tersebut dan diletakkan pada layar.0 pada kedua arahnya.Gambar 8-3.0 sampai dengan 10. jika kita mempunyai bidang yang besar dengan koordinat tekstur antara 0. Mengulang tekstur Kita dapat memberikan koordinat tekstur diluar rang [0.

Untuk mengesetnya gunakan perintah glTexParameter*(). GL_LINEAR. Operasi clamping ini berguna untuk aplikasi dimana kita menginginkan sebuah kopi dari tekstur ditampilkan pada permukaan.0 pada kedua arahnya. TYPE param).0 diset 0.0 dan yang kurang dari 0.0 sampai dengan 10. Gambar 8-5. yang selengkapnya adalah: void glTexParameter{i f}{v}(Glenum target. maka kopi dari tekstur akan ditampilkan di pojok bawah. Perintah tersebut digunakan untuk mengontrol bagaimana tekstur diterapkan pada potongan permukaan. GL_LINEAR GL_NEAREST. GL_REPEAT GL_NEAREST. GL_TEXTURE_WRAP_S GL_ TEXTURE_WRAP_T GL_TEXTURE_MAG_FILTER GL_TEXTURE_MIN_FILTER . GL_NEAREST_MIPMAP_NEAREST.Kemungkinan yang lain adalah dengan melakukan clamp pada koordinat tekstur. GL_NEAREST_MIPMAP_LINEAR.0 diset 1. Glenum pname.0. yaitu mengulang sekaligus melakukan clamping. Parameter target diisi GL_TEXTURE_2D atau GL_TEXTURE_1D. Mengulang sekaligus melakukan clamping pada tekstur Kita juga bisa melakukan kombinasi dari keduanya. GL_REPEAT GL_CLAMP. Sedangkan nilai yang bisa diisikan pada parameter pname dan param dapat dilihat pada tabel di bawah ini: Parameter Nilai GL_CLAMP. Jika koordinat tekstur permukaan antara 0. Sembarang nilai yang lebih besar dari 1.

GL_ LINEAR_MIPMAP_LINEAR.GL_LINEAR_MIPMAP_NEAREST.1] . GL_TEXTURE_BORDER_COLOR Sembarang nilai dalam [0.

M. Java by Example. Geometric Modeling. Rogers. David F. 5. Advanced Animation and Rendering Techniques Theory and Practice. 3. Francis S.. Computer Graphics. 4. Rogers. Addison-Wesley Publishing Company. Prentice-Hall International. Alan Watt. Mark Watt.DAFTAR KEPUSTAKAAN 1. McGraw-Hill Book Company. Procedural Elements for Computer Graphics. Inc. Singapore. Jackson. 1992. 7. Michael E. Donald Hearn. 1997. . David F. OpenGL Programming Guide. Wiley Computer Publishing. Mathematical Elements for Computer Graphics. Computer Graphics. 1985. 1989. Hill.. 1990. Tom Davis. New Jersey. McGrawHill Book Company. Sun Microsystems. Inc. 1996 6. 1994. 2. Jackie Neider. 1996 8. Mortenson. Jerry R. Maxwell Macmillan International Editions. Singapore. Addison-Wesley Publishing Company. Pauline Baker.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->