Top Banner
DIKTAT KULIAH GRAFIKA KOMPUTER Oleh: Rully Soelaiman JURUSAN TEKNIK INFORMATIKA FAKULTAS TEKNOLOGI INDUSTRI INSTITUT TEKNOLOGI SEPULUH NOPEMBER SURABAYA
111

Buku Grafika Diktat Kuliah

Jun 29, 2015

Download

Documents

logality
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Buku Grafika Diktat Kuliah

DIKTAT KULIAH

GRAFIKA KOMPUTER

Oleh:

Rully Soelaiman

JURUSAN TEKNIK INFORMATIKAFAKULTAS TEKNOLOGI INDUSTRI

INSTITUT TEKNOLOGI SEPULUH NOPEMBER

SURABAYA

Page 2: Buku Grafika Diktat Kuliah

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

Page 3: Buku Grafika Diktat Kuliah

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

Page 4: Buku Grafika Diktat Kuliah

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

Page 5: Buku Grafika Diktat Kuliah

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

Page 6: Buku Grafika Diktat Kuliah

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

Page 7: Buku Grafika Diktat Kuliah

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

???

?

Page 8: Buku Grafika Diktat Kuliah

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 = startstep = increment

1 if position - end < accuracy then 4if position > end then 2if position < end then 3

2 position = position – stepgo to 1

3 position = position + stepgo to 1

4 finish

1.2 DIGITAL DIFFERENTIAL ANALYZER

Suatu teknik untuk menghasilkan garis lurus adalah dengan

menggunakan persamaan diferensial untuk garis lurus:

dimana x1, y1 dan x2, y2 adalah titik awal dan akhir dari garis yang diinginkan dan

yi 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

xxx

yyyy

yyyxx

yy

x

y

konsdx

dy

ii

ii

∆−−

+=

∆+=−−

=∆∆

=

+

+

12

121

1

12

12

.

Page 9: Buku Grafika Diktat Kuliah

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 (x1, y1) dan (x2, y2) diasumsikan tidak sama.Sign mengembalikan nilai –1,0,1 sesuai nilai argumen apakah <0, =0 atau >0.

menghitung panjang garisif abs(x2- x1) >= abs(y2- y1) then

Length = abs(x2- x1)else

Length = abs(y2- y1)end if

memilih yang terbesar dari ∆x atau ∆y untuk unit raster∆x = (x2- x1)/Length∆y = (y2- y1)/Length

gunakan fungsi Sign agar algoritma berjalan di seluruh kuadranx = x1 + 0.5*Sign(∆x)y = y1 + 0.5*Sign(∆y)

loop utamai=1while(i<=length)

Plot(Integer(x), Integer(y))x = x + ∆xy = y + ∆yi = i + 1

end whilefinish

contoh1:Buat garis dari (0,0) ke (5,5) dengan menggunakan DDA.Inisialisasix1 = 0y1 = 0x2 = 5y2 = 5Length = 5∆x = 1∆y = 1x = 0.5y = 0.5

Page 10: Buku Grafika Diktat Kuliah

loop utamaI Plot X Y

0.5 0.51 (0,0)

1.5 1.52 (1,1)

2.5 2.53 (2,2)

3.5 3.54 (3,3)

4.5 4.55 (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.Inisialisasix1 = 0y1 = 0

1 54

3

3

2

2

1

00

54

Page 11: Buku Grafika Diktat Kuliah

x2 = -8y2 = -4Length = 8∆x = -1∆y = -0.5x = -0.5y = -0.5loop utamai Plot x Y

-0.5 0.51 (-1,-1)

-1.5 -1.02 (-2,-1)

-2.5 -1.53 (-3,-2)

-3.5 -2.04 (-4,-2)

-4.5 -2.55 (-5,-3)

-5.5 -3.06 (-6,-3)

-6.5 -3.57 (-7,-4)

-7.5 -4.08 (-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-10

-4 -3 -2 -1 0-7 -6 -5-8

Page 12: Buku Grafika Diktat Kuliah

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

Page 13: Buku Grafika Diktat Kuliah

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,

00 1 2 3

1

-0.5

1

-1

0.50

Page 14: Buku Grafika Diktat Kuliah

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 (x1, y1) dan (x2, y2) diasumsikan tidak sama.x, y, ∆x, ∆y diasumsikan integer; e real

inisialisasi variabelx = x1

y = y1

∆x = x2 - x1

∆y = y2 - y1

e = ∆y /∆x – ½

loop utamafor i=1 to ∆x

Plot(x,y)while(e>=0)

y = y + 1e = e - 1

end whilex = x + 1e = e + ∆y /∆x

next ifinish

contoh:Buat garis dari (0,0) ke (5,5) dengan menggunakan algoritma Bresenham.Inisialisasix = 0y = 0∆x = 5∆y = 5e = 1 – ½ = ½loop utamai Plot e x y

½ 0 01 (0,0)

- ½ 0 1½ 1 1

2 (1,1)- ½ 1 2½ 2 2

3 (2,2)

Page 15: Buku Grafika Diktat Kuliah

- ½ 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 543

2

2

1

00

3

54

Page 16: Buku Grafika Diktat Kuliah

Algoritma Bresenham Integer untuk oktan pertama

Titik awal dan akhir adalah (x1, y1) dan (x2, y2) diasumsikan tidak sama.Semua variabel diasumsikan integer

Inisialisasi variabelx = x1

y = y1

∆x = x2 – x1

∆y = y2 – y1

ε = 2*∆y -∆x è

loop utamafor i=1 to ∆x

Plot(x,y)while(ε>=0)

y = y + 1ε = ε – 2*∆x è

end whilex = x + 1ε = ε + 2*∆y è

next ifinish

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

xy

x

x

y

x

x

ye

∆∆−∆

=∆

−∆∆

=∆

−∆∆

=

*2

*2

*2

2

1

*2

2

1

ε

ε

xx

xx

ee

∆∆−

∆=

−=

*2*2

*2*2

1εε

x

y

xx

x

yee

∆∆

+∆

=∆

∆∆

+=

*2

*2

*2*2

εε

Page 17: Buku Grafika Diktat Kuliah

Gambar 2-7

Algoritma Bresenham Integer untuk seluruh kuadran

Titik awal dan akhir adalah (x1, y1) dan (x2, y2) diasumsikan tidak sama.Semua variabel diasumsikan integerSign mengembalikan nilai –1,0,1 sesuai nilai argumen apakah <0, =0 atau >0.

inisialisasix = x1

y = y1

∆x = abs(x2- x1)∆y = abs(y2- y1)s1 = Sign(x2- x1)s2 = Sign(y2- y1)ε = 2*∆y – ∆x

menukar ∆x dan ∆y sesuai dengan kemiringan garisif ∆y > ∆x then

temp = ∆x∆x = ∆y∆y = tempinterchange = 1

elseinterchange = 0

end if

x = x + 1y = y + 1y = y+1

x = x + 1

x = x - 1

y = y - 1x = x - 1y = y - 1

x

y

x++

y++

x++

y++

x--

x--

y-- y--

Page 18: Buku Grafika Diktat Kuliah

loop utamafor i=1 to ∆x

Plot(x,y)while(ε>=0)

if interchange=1 thenx = x + s1

elsey = y + s2

end ifε = ε – 2*∆x

end whileif interchange=1 then

y = y + s2

elsex = x + s1

end ifε = ε + 2*∆y

next ifinish

Contoh:Buat garis dari (0,0) ke (-8,-4) dengan menggunakan algoritma bresenham.Inisialisasix = 0y = 0∆x = 8∆y = 4s1 = -1s2 = -1Interchange = 0ε = 0loop utamai Plot ε X Y

0 0 01 (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)

Page 19: Buku Grafika Diktat Kuliah

0 -6 -37 (-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-10

-4 -3 -2 -1 0-7 -6 -5-8

Page 20: Buku Grafika Diktat Kuliah

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

245

6 7

digenerate

oktan 1 dicerminkanthd grs y=x

kuadran 1 dicerminkanthd grs y (x=0)

separuh lingkarandicerminkan thd

grs x (y=0)

(0,R)

R

x

y

Page 21: Buku Grafika Diktat Kuliah

Pada pemilihan piksel berikutnya, hanya ada tiga kemungkinan piksel

yang akan menghasilkan lingkaran yang diinginkan. Ketiganya adalah vertikal ke

bawah (mV), horisontal ke kanan (mH), serta diagonal ke kanan bawah (mD).

Algoritma akan memilih piksel berikutnya yang memiliki jarak minimum dengan

lingkaran sebenarnya.

mH = |(xi + 1)2 + (yi)2 - R2|

mV = |(xi)2 + (yi - 1)2 - R2|

mD = |(xi + 1)2 + (yi - 1)2 -R2|

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 (xi + 1, yi - 1) dan titik lingkaran sebenarnya adalah:

∆i = (xi + 1)2 + (yi - 1)2 -R2

Seperti pada algoritma Bresenham untuk pembangkitan garis, kita juga

hanya akan menggunakan tanda dari kondisi error agar hanya bilangan integer

saja yang digunakan.

(xi,yi) (xi+1,yi)

(xi,yi-1) (xi+1,yi-1)

mH

mDmV

Page 22: Buku Grafika Diktat Kuliah

Gambar 2-12

Jika ∆i<0, maka titik diagonal (xi + 1, yi - 1) berada di dalam lingkaran yang

sebenarnya, yakni kondisi 1 dan 2 pada gambar 2-12. Jadi kita harus memilih titik

mH atau mD. Untuk menentukannya, 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 - R2| - |(xi + 1)2 + (yi - 1)2 -R2|

Jika δ<0, maka jarak antara lingkaran sebenarnya dengan piksel diagonal

(mD) lebih besar dari jarak antara lingkaran sebenarnya dengan piksel horisontal

(mH). Jadi jika δ<=0 pilihlah mH(xi + 1, yi), sedangkan jika δ>0 pilihlah mD(xi + 1, yi -

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:

(xi + 1)2 + (yi)2 -R2 >= 0

(xi + 1)2 + (yi - 1)2 -R2 < 0

jadi,

δ = (xi + 1)2 + (yi)2 - R2 + (xi + 1)2 + (yi - 1)2 -R2

dengan manambahkan (yi - 1)2 dan mengurangi dengan (yi)2, maka akan

diperoleh:

(xi,yi) (xi+1,yi)

(xi,yi-1)(xi+1,yi-1)

mH

mDmV

(xi-1,yi-1)

(xi+1,yi+1)

2

3 5

1

4

Page 23: Buku Grafika Diktat Kuliah

δ = 2[(xi + 1)2 + (yi - 1)2 - R2] + 2yi - 1

dengan persamaan dari ∆i maka:

δ = 2(∆i + yi) - 1

yang menjadi jauh lebih sederhana.

Jika ∆i>0, maka titik diagonal (xi + 1, yi - 1) berada di luar lingkaran yang

sebenarnya, yakni kondisi 3 dan 4 pada gambar 2-12. Jadi kita harus memilih titik

mV atau mD. Untuk menentukannya, pada kondisi 3 kita memerlukan selisih

antara kuadrat jarak dari lingkaran sebenarnya ke titik mV dan kuadrat jarak dari

lingkaran sebenarnya ke titik mD, yaitu:

δ’ = |(xi + 1)2 + (yi - 1)2 -R2| - |(xi)2 + (yi - 1)2 - R2|

Jika δ’<0, maka jarak antara lingkaran sebenarnya dengan piksel vertikal

(mV) lebih besar dari jarak antara lingkaran sebenarnya dengan piksel diagonal

(mD). Jadi jika δ’<=0 pilihlah mD(xi + 1, yi - 1), sedangkan jika δ’>0 pilihlah mV(xi, yi

- 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:

(xi + 1)2 + (yi - 1)2 -R2 >= 0

(xi)2 + (yi - 1)2 -R2 < 0

jadi,

δ’ = (xi + 1)2 + (yi - 1)2 -R2 + (xi)2 + (yi - 1)2 -R2

dengan manambahkan (xi + 1)2 dan mengurangi dengan (xi)2, maka akan

diperoleh:

δ’ = 2[(xi + 1)2 + (yi - 1)2 - R2] - 2xi - 1

dengan persamaan dari ∆i maka persamaan akan menjadi:

δ’ = 2(∆i - xi) - 1

Jika berada pada kondisi 2 kita tentu saja akan memilih piksel mH(xi + 1,

yi), dan jika berada pada kondisi 4 maka piksel mV(xi, yi - 1) yang akan kita pilih.

Sedangkan jika kita berada pada kondisi 5 maka piksel yang kita pilih adalah

mD(xi + 1, yi - 1).

Page 24: Buku Grafika Diktat Kuliah

Algoritma lingkaran Bresenham untuk kuadran pertama

Semua variabel diasumsikan integer

Inisialisasixi = 0yi = R∆i = 2(1-R)Limit = 01 Plot(xi,yi)

menentukan berada di kondisi 1 atau 2, 3 atau 4, atau 5if yi <= Limit then 4if ∆i < 0 then 2if ∆i > 0 then 3if ∆i = 0 then 20

menentukan berada di kondisi 1 atau 22 δ = 2∆i + 2yi - 1

if δ <= 0 then 10if δ > 0 then 20

menentukan berada di kondisi 3 atau 43 δ’ = 2∆i + 2xi - 1

if δ’ <= 0 then 20if δ’ > 0 then 30

melakukan perpindahan pikselpiksel mH

10 xi = xi + 1∆i = ∆i + 2xi + 1go to 1

piksel mD

20 xi = xi + 1yi = yi - 1∆i = ∆i + 2xi - 2yi + 1go to 1

piksel mV

30 yi = yi - 1∆i = ∆i - 2yi + 1go to 1

4. Finish

Page 25: Buku Grafika Diktat Kuliah

Contoh:Buat kuadran pertama lingkaran dengan jari-jari 8. Gunakan algoritmaBresenham.Inisialisasix = 0y = 0∆i = 2(1 - 8) = -14Limit = 0loop 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.

Page 26: Buku Grafika Diktat Kuliah

Gambar 2-13

(0,0)

(0,8)

(8,0)x

y

Page 27: Buku Grafika Diktat Kuliah

TRANSFORMASI DUA DIMENSIDAN 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:

]''[])()([][ yxdycxbyaxdcba

yx =++=

]''[][1001

][ yxyxyx ==

]''[][100

][ yxyaxa

yx ==

Page 28: Buku Grafika Diktat Kuliah

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][ yxdyax

da

yx ==

]''[][1001

][ yxyxyx =−=

]''[])([10

1][ yxybxx

byx =+=

Page 29: Buku Grafika Diktat Kuliah

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

PP

PP

P'

P'

P'

P'P'

(a) (c)

(f)(d)

(e)

(b)

− 01

10

2 4 6 8

2

4

6

8

0x

y

Page 30: Buku Grafika Diktat Kuliah

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?

−−=

214131

0110

121413

−−

1001

0110

1001

Page 31: Buku Grafika Diktat Kuliah

Perhatikan gambar 2-3. Vektor posisi P dengan panjang r dan sudut φ terhadap

sumbu x dirotasikan dengan sudut θ ke P’.

Gambar 2-3Vektor 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'

φθ

[ ] [ ]φφ sincos rryxP ==[ ] [ ])sin()cos(''' θφθφ ++== rryxP

θφθφθφθφθφθφ

cossinsincos)sin(cossincoscos)cos(

±=±±=±

[ ] [ ])cossinsin(cos)sinsincos(cos''' θφθφθφθφ +−== rryxP

[ ] [ ]θθθθ cossinsincos''' yxyxyxP +−==

− θθ

θθcossinsincos

Page 32: Buku Grafika Diktat Kuliah

Gambar 2-4Dua 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:

− 1001

−−−

=

263718

1001

263718

1001

E'' D''

F''

E'

D'

F'

E

D

F

X

Y

Page 33: Buku Grafika Diktat Kuliah

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ο.

0110

=

627381

0110

263718

−0110

Page 34: Buku Grafika Diktat Kuliah

Gambar 2-5Pertama refleksikan segitiga ABC terhadap sumbu x:

Kemudian refleksikan lagi segitiga tersebut terhadap garis y=-x:

Hasilnya akan sama dengan rotasi dengan sudut 270ο:

−−−

=

271535

1001

271535

F''

F'

F

X

Y

D

D''D'

E

E''

E'2 4 6 8

-2

-4

-6

-8

−−−

=

−−−

725153

0110

271535

−−−

=

725153

0110

271535

Page 35: Buku Grafika Diktat Kuliah

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-6Segitiga 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:

2002

B

X

Y

A

2 4 6 8 1210

2

4

6

8

C

B'

A'

C'

B''

A''

C''

3002

1

dcba

Page 36: Buku Grafika Diktat Kuliah

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.

πθθθ

20sincos

<=<===

ryrx

r

θr sin

r cos θ

θ

x

y

Page 37: Buku Grafika Diktat Kuliah

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 xi dan yi. 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 xi

dan yi 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

δθδθ

+=+=

+

+

ii

ii

ryrx

)cossinsin(cos)sinsincos(cos

1

1

δθδθδθδθ

iii

iii

ryrx

+=−=

+

+

ii

ii

ryrx

θθ

sincos

==

δδδδ

cossinsincos

1

1

iii

iii

yxyyxx

+=−=

+

+

Page 38: Buku Grafika Diktat Kuliah

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

Page 39: Buku Grafika Diktat Kuliah

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 xi dan yi. 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

δθδθ

+=+=

+

+

ii

ii

byax

)cossinsin(cos)sinsincos(cos

1

1

δθδθδθδθ

iii

iii

byax

+=−=

+

+

δδ

δδ

cossin

sincos

1

1

iii

iii

yxab

y

yba

xx

+

=

−=

+

+

Page 40: Buku Grafika Diktat Kuliah

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 P1(x1,y1),

P2(x2,y2) dan P3(x3,y3). Persamaannya adalah:

Pemecahannya adalah dengan mengurangi persamaan (a) dengan

persamaan (b) dan mengurangi persamaan (c) dengan persamaan (b). Secara

cRkyhx

bRkyhx

aRkyhx

1..........................................)()(

1..........................................)()(

1..........................................)()(

223

23

222

22

221

21

=−+−=−+−=−+−

P1

P3

P2

x

x''

x'

y

y''

y'

Page 41: Buku Grafika Diktat Kuliah

lebih khusus, pemecahannya adalah [(a)-(b)](x3-x2)-[(c)-(b)](x1-x2) 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 P1 ke pusat sistem koordinat (0,0), sehingga

persamaannya menjadi:

Mengurangkan (a) dari (b) dan (c) menghasilkan 2 buah persamaan

linear. Solusinya adalah [(b)-(a)]x3’-[(c)-(a)]x2’, 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

))](()[())](()[(

21232321

2122

23

22

2323

22

21

22

21

xxyyxxyyxxyyxxxxyyxx

k−−−−−

−−+−−−−+−=

3........................)(2

)(2)()(

21

2122

21

22

21

xxyykyyxx

h−

−−−+−=

cRkyhx

bRkyhx

aRkh

4....................)''()''(

4....................)''()''(

4....................''

223

23

222

22

222

=−+−=−+−=+

7..................................................)''(

6..........................................'2

''2'''

5.............)''''(2

]'''')''(''['

2122

2

222

22

2332

2233

223223

khR

xkyyx

h

xyxyxyxyxxxx

k

+=

−+=

−−+−=

Page 42: Buku Grafika Diktat Kuliah

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-103. 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

BC

A'/A''

B'C'

B''

C''

Page 43: Buku Grafika Diktat Kuliah

x2 + y2 = R2 (a)

(xB - x)2 + y2 = R2 (b)

(xC - x)2 + (yC - y)2 = R2 (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 .

Perhatikan bahwa jika y3=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)

α

Page 44: Buku Grafika Diktat Kuliah

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.

Page 45: Buku Grafika Diktat Kuliah

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 Jn,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.

10

)()(0

,

≤≤

= ∑=

t

tJBtPn

i

ini

)!(!!

)1()(,

inin

in

ttin

tJ iniin

−=

= −

Page 46: Buku Grafika Diktat Kuliah

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

ini tJBtP0

, )()(

1

1)1(!!

0)01()!0(!0

!)0( 0,

=

=

−−

==

n

nin

nn

nntJ

Page 47: Buku Grafika Diktat Kuliah

Sehingga:

Untuk t=1 n=i maka:

Untuk t=1 n≠ i maka:

Sehingga:

0

0)01()!(!

!)0(,

=

−−

== − iinin

inin

tJ

1

10!0!

!

1)0()!(!

!

1)11()!(!

!)1(

0

,

=

=

−=

−−

==

nn

nnnn

innn

tJ

nn

iinin

0

,0 )0()0(B

JBP in

==

0

01)!(!

!

1)0()!(!

!

1)11()!(!

!)1(,

=−

=

−=

−−

==

innn

innn

innntJ

in

iinin

i

nni

in

BJB

BiJP

==

=)1(

)1()1(,

,

Page 48: Buku Grafika Diktat Kuliah

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-43. 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.

trNtJB

trNtPtP

in

n

k

i +=

+=

∑=

)(

)()('

,

0

Page 49: Buku Grafika Diktat Kuliah

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

Page 50: Buku Grafika Diktat Kuliah

Ada basis lain yang dinamakan basis B-Spline yang berisi basis Bernstein

dengan sifat khusus. Basis ini bersifat non-global, jadi setiap titik Bi 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 Bi adalah vektor posisi dari n+1 titik defining polygon dan Ni,k adalah

fungsi basis B-Spline ternormalisasi.

Untuk fungsi basis B-Spline ternormalisasi dengan orde k (derajat k-1),

fungsi basis Ni,k(t) didefinisikan sebagai:

dan

Nilai dari xi adalah elemen dari knot vektor yang memenuhi persamaan xi≤xi+1.

Parameter t berada antara tmin dan tmax sepanjang kurva P(t).

12

)()(

maxmin

1

1

,

+≤≤≤≤

= ∑+

=

nkttt

tNBtPn

i

kii

otherwisextxif

tNii

i →

<≤→⟨=

+...........

11,

0)(1

)(

1

1,1

1

1,,

)()()()()(

++

−++

−+

−−+

−−=

iki

kiki

iki

kiiki

xxtNtx

xxtNxt

tN

Page 51: Buku Grafika Diktat Kuliah

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

Page 52: Buku Grafika Diktat Kuliah

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).

Page 53: Buku Grafika Diktat Kuliah

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 xi≤xi+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:

Ni,k(t) = Ni-1,k(t-1) = Ni+1,k(t+1)

Hasil dari fungsi basis dengan menggunakan knot vektor uniform terlihat pada gambar 3-

12:

Page 54: Buku Grafika Diktat Kuliah

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 Ps = P(t=xk) dan berakhir di titik Pe = P(t=xn+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 B1=B2 dan Bn=Bn+1 akan menghasilkan titik awal dan titik akhir

seperti di bawah ini:

Sedangkan untuk k=4, maka:

kn

BNBNBNk

P

BNBNBNk

P

k

i

k

i

k

i

nkikniknie

kkkkks

+++−

=

+++−

=

∑ ∑ ∑= = =

++−+−

)...()!1(

1

)...()!1(

1

1 1 1

1,43,32,

1,22,11,

)(21

)(21

1

21

++=

+=

nne

s

BBP

BBP

)(61

)4(61

11

321

+− ++=

++=

nnne

s

BBBP

BBBP

111

1121

)2(21

)(21

)2(21)(

21

+++ ==+=

==+=

nnnne

s

BBBBP

BBBBP

Page 55: Buku Grafika Diktat Kuliah

Gambar 3-13

)5(61)(

61

)5(61)4(

61

1111

21321

+−+− +=++=

+=++=

nnnnne

s

BBBBBP

BBBBBP

Page 56: Buku Grafika Diktat Kuliah

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).

Page 57: Buku Grafika Diktat Kuliah

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:

xi = 0 1≤i≤k

xi = i-k k+1≤i≤n+1

xi = 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:

Page 58: Buku Grafika Diktat Kuliah

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

Page 59: Buku Grafika Diktat Kuliah

PENGGAMBARAN OBYEK GEOMETRIKDENGAN OPENGL

4.1. Persiapan menggambar

Pada bagian ini diterangkan hal-hal yang menyangkut persiapan menggambar sepertimembersihkan window serta mengeset warna obyek yang akan digambar.

4.1.1. Membersihkan windowMenggambar di komputer tidak sama dengan menggambar di kertas dimana dimulai dari

kertas kosong berwarna putih dan kita tinggal menggambar apa yang kita inginkan. Padakomputer, memori menahan gambar terakhir yang kita gambarkan di komputer tersebut sehinggakita perlu membersihkannya dengan suatu warna background sebelum menggambar dengan yangbaru. Warna background yang dipakai tergantung pada aplikasi. Untuk pemroses kata, kitamungkin akan menggunakan warna putih, untuk game pesawat luar angkasa kita akanmenggunakan warna hitam, dan lain-lain. Sebagai contoh, perintah di bawah ini akanmembersihkan 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, danperintah selanjutnya membersihkan seluruh window dengan warna yang aktif. Parameter padaperintah glClear() menunjukkan buffer mana yang akan dibersihkan. Dalam hal ini program hanyamembersihkan buffer warna tempat menyimpan gambar yang ditampilkan. Kita hanya perlumengeset warna background satu kali saja di awal program dan membersihkan buffer seseringyang kita perlukan.

4.1.2. Pembentukan warnaOpenGL akan menyimpan warna yang sedang aktif saat itu. Sebelum warna yang aktif

tersebut diganti, maka setiap obyek geometrik yang dibuat akan digambar dengan menggunakanwarna itu. Hal ini akan meningkatkan kinerja daripada tanpa mwnyimpan warna yang sedang aktiftersebut. 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 padabaris keempat yang mengeset warna menjadi biru tidak berguna.

Untuk mengeset warna, gunakan perintah glColor3f(). Perintah tersebut menggunakantiga parameter yang kesemuanya merupakan angka floating-point yang besarnya antara 0.0 sampai1.0. Parameter tersebut merupakan komponen merah, hijau dan biru dari warna yang akandihasilkan. 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); hitamglColor(0.0, 0.0, 1.0); biruglColor(0.0, 1.0, 0.0); hijauglColor(0.0, 1.0, 1.0); cyanglColor(1.0, 0.0, 0.0); merahglColor(1.0, 0.0, 1.0); magentaglColor(1.0, 1.0, 0.0); kuningglColor(1.0, 1.0, 1.0); putih

Page 60: Buku Grafika Diktat Kuliah

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.

Page 61: Buku Grafika Diktat Kuliah

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 vertexDengan 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

Page 62: Buku Grafika Diktat Kuliah

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.

Page 63: Buku Grafika Diktat Kuliah

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.

Page 64: Buku Grafika Diktat Kuliah

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

Page 65: Buku Grafika Diktat Kuliah

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. Padaimplementasi khusus, ukuran titik non-antialiasing mungkin dibatasi sebesar ukuranmaksimum titik antialiasing, dibulatkan ke integer terdekat. Kita bisa memperolehnya denganmenggunakan GL_POINT_SIZE_RANGE pada perintah glGetFloatv().

4.3.2. Garis

Dengan OpenGL kita dapat menentukan garis dengan berbagai macam ukuran dan digambardalam berbagai macam cara, dengan titik-titik, garis-garis maupun campuran antara titik-titikdan 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-antialiasingmungkin dibatasi sebesar ukuran maksimum titik antialiasing, dibulatkan ke integer terdekat.

Page 66: Buku Grafika Diktat Kuliah

Kita bisa memperolehnya dengan menggunakan GL_LINE_WIDTH_RANGE pada perintahglGetFloatv().Untuk menggambarkan garis dalam titik-titik atau garis putus-putus gunakan perintahglLineStipple() untuk mendefinisikan pola penggambaran garis tersebut dan kemudian kitabisa mengaktifkan (meng-enable) dengan glEnable().

void glLineStipple(Glint factor, Glushort pattern);Perintah tersebut mengeset pola penggambaran garis. Argumen pattern adalah rangkaian 0 danatau 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 akandigambar dengan cara sebagai berikut: 3 piksel digambar, kemudian 5 piksel tidak, 6 pikseldigambar dan 2 piksel tidak (bit rendah digunakan terlebih dahulu). Pola tersebut bisadiperbesar 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 pikseltidak.

4.3.3. Poligon

Poligon biasanya digambar dengan cara mengisi seluruh piksel yang tertutup dalam suatubatas. Tetapi kita juga bisa menggambarnya sebagai poligon outline atau sebagai titik-titikpada vertex-vertex. Sebuah poligon terisi mungkin terisi dengan solid (padat) atau digambardengan 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().

Page 67: Buku Grafika Diktat Kuliah

Perintah tersebut mendefinisikan pola penggambaran untuk poligon terisi. Argumen maskadalah pointer untuk bitmap 32x32 yang diterjemahkan sebagai 0 dan 1. Jika nilainya 1 makapiksel 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);

Page 68: Buku Grafika Diktat Kuliah

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.

Page 69: Buku Grafika Diktat Kuliah

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 darisebuah model. Sebagai contoh kita dapat malakukan rotasi, translasi, scaling atau gabungan dariketiganya.

Page 70: Buku Grafika Diktat Kuliah

Tiga rutin OpenGL untuk transformasi modeling adalah glTranslate*(), glRotate*() danglScale*(). Rutin-rutin tersebut mentransformasikan sebuah obyek dengan jalan menggeser,memutar, membesarkan ataupun mengecilkan obyek tersebut. Perintah-perintah tersebut samadengan jika kita membuat sebuah matrik translasi, rotasi maupum matrik scaling dan kemudianmemanggil 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 sudutdari rotasi tersebut.

Page 71: Buku Grafika Diktat Kuliah

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 setiaptitik pada obyek dikalikan dengan argumen x, y, z. Perintah glScale*() merupakan satu-satunyaperintah transformasi modeling yang merubah ukuran dari obyek. Jika nilai yang dimasukkan lebihdari 1.0 maka obyek akan diperbesar, jika nilainya kurang dari 1.0 maka obyek akan diperkecildan 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);

Page 72: Buku Grafika Diktat Kuliah

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

Page 73: Buku Grafika Diktat Kuliah

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.

Page 74: Buku Grafika Diktat Kuliah

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 jalansemakin jauh akan tampak semakin menyempit. Jika kita ingin membuat gambar yang tampaknyata, maka kita harus memilih proyeksi perspektif ini. Metode ini banyak digunakan untukaplikasi animasi dan computer aided design (CAD).

Gambar 5-6. Volome viewing pada proyeksi perspektif dengan glFrustum()

Perintah glFrustum() menghitung matrik yang mengerjakan proyeksi perspektif danmengalikannya 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 planeyang dekat. Near dan far menunjukkan jarak dari titik pandang ke clipping plane yang dekat danjauh.

Meskipun secara konsep mudah dipahami, glFrustum() tidak sering digunakan. Sebagaipenggantinya, gunakan rutin dari Utility Library yaitu gluPerspective(). Rutin ini membentukvolume viewing yang sama dengan yang dibentuk oleh glFrustum() tetapi dengan cara lain.Selengkapnya adalah:

Page 75: Buku Grafika Diktat Kuliah

Gambar 5-7. Volume viewing pada proyeksi perspektif dengan gluPerspective()

gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdoublezFar);

Perintah tersebut membentuk sebuah matrik perspektif dan mengalikannya dengan matrikyang sedang aktif. Argumen fovy adalah sudut dari bidang pandang, nilainya antara 0.0 sampaidengan 180.0. Aspect adalah perbandingan antara lebar dan tinggi. Nilai zNear dan zFar adalahjarak 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:

Page 76: Buku Grafika Diktat Kuliah

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.

Page 77: Buku Grafika Diktat Kuliah

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.

Page 78: Buku Grafika Diktat Kuliah

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.

Page 79: Buku Grafika Diktat Kuliah

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)

{

Page 80: Buku Grafika Diktat Kuliah

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().

Page 81: Buku Grafika Diktat Kuliah

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);

Page 82: Buku Grafika Diktat Kuliah

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);

}

Page 83: Buku Grafika Diktat Kuliah

PEWARNAAN PADA OPENGL

6.1. Persepsi warna

Secara fisik, cahaya adalah susunan dari foton, partikel kecil dari cahaya yang melintaspada jalurnya serta bergetar pada frekuensinya masing-masing. Karakteristik dari foton dibentukoleh posisi, arah dan frekuensi/panjang gelombang/energinya. Foton dengan panjang gelombangantara 390 nm sampai dengan 720 nm merupakan spektrum yang terlihat, membentuk warnapelangi. 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 yangberbeda-beda. Sumber cahaya ditentukan oleh distribusi dari frekuensi foton yang merekapancarkan. Cahaya putih ideal terdiri dari cahaya-cahaya dari seluruh frekuensi dengan jumlahyang 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.

Page 84: Buku Grafika Diktat Kuliah

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 28 = 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 untukpenyimpanan. Sebagai contoh jika sistem menyediakan 8 bit untuk komponen R, maka integerantara 0-255 dapat disimpan, sehingga 0, 1, 2, ..., 255 pada bitplane dapat diartikan nilai Rsebesar 0/255 = 0.0, 1/255, 2/255, ..., 255/255 = 1.0. Tanpa memperhatikan jumlah bitplane, 0.0menghasilkan intensitas minimum dan 1.0 menghasilkan intensitas maksimum.

Page 85: Buku Grafika Diktat Kuliah

Gambar 6-1. Nilai RGB dari bitplane

Jumlah macam warna yang dapat ditampilkan pada tiap-tiap piksel tergantung jumlah bitplanedan kapasitas dari hardware untuk menginterpretasikan bitplane tersebut. Jumlah warna tidakdapat melebihi 2n, dimana n adalah jumlah bitplane sehingga mesin dengan 24 bitplane untukRGB dapat menampilkan lebih dari 16,77 juta macam warna.

6.2.2. Dithering

Beberapa hardware grafik menggunakan dithering untuk meningkatkan jumlah warna yangdapat ditampilkan dengan mengorbankan resolusi spatial. Dithering adalah teknik untukmenggunakan beberapa warna untuk membentuk efek warna lain. Untuk menggambarkanbagaimana 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 suatudaerah, hardware dapat mengisi daerah tersebut dengan warna merah dan putih. Karena matakita cukup jauh dari layar sehingga tidak dapat membedakan tiap-tiap piksel,daerah tersebutakan tampak berwarna pink, rata-rata dari warna merah dan putih. Warna pink yang lebihmerah dapat dihasilkan dengan mengisi proporsi piksel yang lebih banyak dengan warnamerah, sedangkan warna pink yang lebih putih dapat dihasilkan dengan mengisi proporsipiksel lebih banyak dengan warna putih, dan seterusnya.Dengan cara ini, tidak ada piksel yang berwarna pink. Satu-satunya jalan untuk menghasilkanefek di atas adalah dilakukan pada suatu daerah yang terdiri dari berbagai piksel. Kita tidakbisa melakukan proses dithering pada satu piksel saja. Jika kita membentuk suatu nilai RGBuntuk suatu warna yang tidak tersedia dan mengisi suatu poligon, hardware mengisi pikselyang berada di dalam poligon dengan campuran dari warna-warna terdekat sehinggamenampilkan 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 tanpaproses dithering. Tapi walaupun mesin kita mempunyai 24 bitplane bukan berarti prosesdithering 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

Page 86: Buku Grafika Diktat Kuliah

komponen RGB. Tanpa dithering, 4 bit setiap komponen warna akan memberi hasil yangkurang memuaskan.

6.2.3. Mode indeks warna

Dengan mode indeks warna, OpenGL menggunakan peta warna yang mirip denganmenggunakan palet untuk mencampur cat pada saat melukis. Palet seorang pelukismenyediakan tempat untuk mencampur cat, dan mirip dengan hal tesebut, peta warnamenunjukkan 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.

Page 87: Buku Grafika Diktat Kuliah

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(28)

sampai 4096(212). Ukuran peta warna merupakan pangkat dari 2 diindeks oleh

jumlah bitplane yang tersedia pada mode indeks warna. Jika ada 2n indeks pada

peta warna dan m bitplane yang tersedia, maka jumlah warna yang bisa

ditampung adalah kurang dari 2n dan 2m.

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 2n.

Page 88: Buku Grafika Diktat Kuliah

- 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 untuktexture mapping, lighting, shading, fog, antialiasing dan blending.

6.3. Penggunaan warna pada model shading

6.3.1. Pembentukan warna pada mode RGBAPada 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 yangditerima. Akhiran pertama adalah 3 atau 4, menunjukkan apakah kita memasukkan nilai alphadisamping nilai RGB. Jika nilai tersebut tidak dimasukkan, otomatis akan diset 1.0. Akhirankedua menunjukkan tipe data untuk parameter: byte, short, integer, float, double, unsignedbyte, unsigned short atau unsigned integer. Sedangkan akhiran ketiga adalah optional v yangmenunjukkan argumen tersebut adalah pointer pada suatu array sesuai dengan tipe datanya.

6.3.2. Pembentukan warna pada mode indeks warnaUntuk 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 argumentersebut adalah nilai dari suatu array sesuai dengan tipe data yang diberikan (array tersebuthanya berisi 1 nilai).

6.3.3. Pembentukan model shadingSebuah garis atau poligon terisi dapat digambar dengan satu warna (flat shading) atau

dengan berbagai macam warna (smooth shading). Kita dapat menentukan teknik shadingsesuai 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 padasmooth shading, warna dari tiap-tiap vertex diperlakukan sendiri-sendiri. Untuk sebuah garis,warna-warna sepanjang segmen garis tersebut ditambahkan pada warna vertex. Sedangkanpada poligon, warna-warna dari interior poligon tersebut ditambahkan pada warna vertex.

Dengan smooth shading, titik-titik yang berdekatan mempunyai perbedaan nilai warnayang kecil. Pada mode RGBA hal ini kelihatan mirip sehingga perubahan warna dalampoligon tampak halus (bertahap sedikit demi sedikit). Pada mode indeks warna titik-titik yangberdekatan mungkin menunjuk pada lokasi yang berbeda pada tabel indeks warna, yangmungkin tidak mirip sama sekali.

Untuk mengatasi hal tersebut, kita harus membuat suatu jalur perubahan warna yanghalus diantara indeks-indeks dalam peta warna. Pemetaan warna pada peta warna dibentukmelalui sistem window. Untuk sementaara anggaplah kita mempunyai rutin auxSetOneColor()yang melakukan load satu indeks pada peta warna dengan nilai RGB. Argumen pertama dari

Page 89: Buku Grafika Diktat Kuliah

rutin ini adalah nilai RGB. Untuk melakukan load 32 indeks warna yang berdekatan (dariindeks 16 sampai 47) dengan sedikit perubahan dari warna kuning, kita mungkin akanmemanggil 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).

Page 90: Buku Grafika Diktat Kuliah

PEWARNAAN PADA OPENGL

6.4. Persepsi warna

Secara fisik, cahaya adalah susunan dari foton, partikel kecil dari cahaya yang melintaspada jalurnya serta bergetar pada frekuensinya masing-masing. Karakteristik dari foton dibentukoleh posisi, arah dan frekuensi/panjang gelombang/energinya. Foton dengan panjang gelombangantara 390 nm sampai dengan 720 nm merupakan spektrum yang terlihat, membentuk warnapelangi. 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 yangberbeda-beda. Sumber cahaya ditentukan oleh distribusi dari frekuensi foton yang merekapancarkan. Cahaya putih ideal terdiri dari cahaya-cahaya dari seluruh frekuensi dengan jumlahyang 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.

Page 91: Buku Grafika Diktat Kuliah

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 28 = 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 untukpenyimpanan. Sebagai contoh jika sistem menyediakan 8 bit untuk komponen R, maka integerantara 0-255 dapat disimpan, sehingga 0, 1, 2, ..., 255 pada bitplane dapat diartikan nilai Rsebesar 0/255 = 0.0, 1/255, 2/255, ..., 255/255 = 1.0. Tanpa memperhatikan jumlah bitplane, 0.0menghasilkan intensitas minimum dan 1.0 menghasilkan intensitas maksimum.

Gambar 6-1. Nilai RGB dari bitplane

Page 92: Buku Grafika Diktat Kuliah

Jumlah macam warna yang dapat ditampilkan pada tiap-tiap piksel tergantung jumlah bitplanedan kapasitas dari hardware untuk menginterpretasikan bitplane tersebut. Jumlah warna tidakdapat melebihi 2n, dimana n adalah jumlah bitplane sehingga mesin dengan 24 bitplane untukRGB dapat menampilkan lebih dari 16,77 juta macam warna.

6.2.6. Dithering

Beberapa hardware grafik menggunakan dithering untuk meningkatkan jumlah warna yangdapat ditampilkan dengan mengorbankan resolusi spatial. Dithering adalah teknik untukmenggunakan beberapa warna untuk membentuk efek warna lain. Untuk menggambarkanbagaimana 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 suatudaerah, hardware dapat mengisi daerah tersebut dengan warna merah dan putih. Karena matakita cukup jauh dari layar sehingga tidak dapat membedakan tiap-tiap piksel,daerah tersebutakan tampak berwarna pink, rata-rata dari warna merah dan putih. Warna pink yang lebihmerah dapat dihasilkan dengan mengisi proporsi piksel yang lebih banyak dengan warnamerah, sedangkan warna pink yang lebih putih dapat dihasilkan dengan mengisi proporsipiksel lebih banyak dengan warna putih, dan seterusnya.Dengan cara ini, tidak ada piksel yang berwarna pink. Satu-satunya jalan untuk menghasilkanefek di atas adalah dilakukan pada suatu daerah yang terdiri dari berbagai piksel. Kita tidakbisa melakukan proses dithering pada satu piksel saja. Jika kita membentuk suatu nilai RGBuntuk suatu warna yang tidak tersedia dan mengisi suatu poligon, hardware mengisi pikselyang berada di dalam poligon dengan campuran dari warna-warna terdekat sehinggamenampilkan 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 tanpaproses dithering. Tapi walaupun mesin kita mempunyai 24 bitplane bukan berarti prosesdithering 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

Page 93: Buku Grafika Diktat Kuliah

komponen RGB. Tanpa dithering, 4 bit setiap komponen warna akan memberi hasil yangkurang memuaskan.

6.2.7. Mode indeks warna

Dengan mode indeks warna, OpenGL menggunakan peta warna yang mirip denganmenggunakan palet untuk mencampur cat pada saat melukis. Palet seorang pelukismenyediakan tempat untuk mencampur cat, dan mirip dengan hal tesebut, peta warnamenunjukkan 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.

Page 94: Buku Grafika Diktat Kuliah

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(28)

sampai 4096(212). Ukuran peta warna merupakan pangkat dari 2 diindeks oleh

jumlah bitplane yang tersedia pada mode indeks warna. Jika ada 2n indeks pada

peta warna dan m bitplane yang tersedia, maka jumlah warna yang bisa

ditampung adalah kurang dari 2n dan 2m.

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 2n.

Page 95: Buku Grafika Diktat Kuliah

- 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 untuktexture mapping, lighting, shading, fog, antialiasing dan blending.

6.6. Penggunaan warna pada model shading

6.3.4. Pembentukan warna pada mode RGBAPada 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 yangditerima. Akhiran pertama adalah 3 atau 4, menunjukkan apakah kita memasukkan nilai alphadisamping nilai RGB. Jika nilai tersebut tidak dimasukkan, otomatis akan diset 1.0. Akhirankedua menunjukkan tipe data untuk parameter: byte, short, integer, float, double, unsignedbyte, unsigned short atau unsigned integer. Sedangkan akhiran ketiga adalah optional v yangmenunjukkan argumen tersebut adalah pointer pada suatu array sesuai dengan tipe datanya.

6.3.5. Pembentukan warna pada mode indeks warnaUntuk 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 argumentersebut adalah nilai dari suatu array sesuai dengan tipe data yang diberikan (array tersebuthanya berisi 1 nilai).

6.3.6. Pembentukan model shadingSebuah garis atau poligon terisi dapat digambar dengan satu warna (flat shading) atau

dengan berbagai macam warna (smooth shading). Kita dapat menentukan teknik shadingsesuai 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 padasmooth shading, warna dari tiap-tiap vertex diperlakukan sendiri-sendiri. Untuk sebuah garis,warna-warna sepanjang segmen garis tersebut ditambahkan pada warna vertex. Sedangkanpada poligon, warna-warna dari interior poligon tersebut ditambahkan pada warna vertex.

Dengan smooth shading, titik-titik yang berdekatan mempunyai perbedaan nilai warnayang kecil. Pada mode RGBA hal ini kelihatan mirip sehingga perubahan warna dalampoligon tampak halus (bertahap sedikit demi sedikit). Pada mode indeks warna titik-titik yangberdekatan mungkin menunjuk pada lokasi yang berbeda pada tabel indeks warna, yangmungkin tidak mirip sama sekali.

Untuk mengatasi hal tersebut, kita harus membuat suatu jalur perubahan warna yanghalus diantara indeks-indeks dalam peta warna. Pemetaan warna pada peta warna dibentukmelalui sistem window. Untuk sementaara anggaplah kita mempunyai rutin auxSetOneColor()yang melakukan load satu indeks pada peta warna dengan nilai RGB. Argumen pertama dari

Page 96: Buku Grafika Diktat Kuliah

rutin ini adalah nilai RGB. Untuk melakukan load 32 indeks warna yang berdekatan (dariindeks 16 sampai 47) dengan sedikit perubahan dari warna kuning, kita mungkin akanmemanggil 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).

Page 97: Buku Grafika Diktat Kuliah

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

Page 98: Buku Grafika Diktat Kuliah

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 membentuksumber 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);

Page 99: Buku Grafika Diktat Kuliah

Ada dua macam tipe dari sumber cahaya, yang pertama dinamakan sumber cahayadirectional. Sumber cahaya ini jaraknya sangat jauh (tak terbatas), salah satu contohnya adalahcahaya matahari. Tipe yang kedua adalah sumber cahaya positional. Disebut begitu karenaposisinya menentukan efek yang tampak, khususnya arah dari datangnya sinar. Contoh dari tipe iniadalah 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) untukparameter GL_POSITION. Jika nilai terakhir (w) bernilai nol, maka cahaya yang terbentuk bertipedirectional dan nilai x, y, z menggambarkan arahnya. Jika w tidak nol maka tipe yang terbentukadalah positional dan nilai x, y, z membentuk lokasi dari sumber cahaya.

Kita dapat membentuk sumber cahaya positional seakan-akan seperti lampu sorot. Untukmembentuknya kita harus menentukan penyebaran cahaya yang dinginkan dengan jalan mengesetparameter GL_SPOT_CUTOFF. Sudut dari penyebaran cahaya tersebut adalah dua kali dari nilaiyang diisikan ke parameter GL_SPOT_CUTOFF.

7.2. Penentuan model cahaya

Model cahaya pada OpenGL mempunyai 3 komponen. Komponen-komponen tersebutadalah:

- 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.

Page 100: Buku Grafika Diktat Kuliah

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

Page 101: Buku Grafika Diktat Kuliah

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 danbagaimana mendefinisikan model cahaya yang kita inginkan. Pada bagian ini kita akan membahasbagaimana mendefinisikan properti material dari suatu obyek dalam scene. Perintah yangdigunakan 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 darisebuah obyek. Hal itu dipengaruhi oleh warna dari cahaya diffuse dan sudut jatuhnya cahaya

Page 102: Buku Grafika Diktat Kuliah

tersebut dengan garis normal (yang paling kuat adalah jika cahaya jatuh tegak lurus kepermukaan). Posisi sudut pandang tidak mempengaruhi pemantulan diffuse sama sekali.

Pemantulan ambient berpengaruh pada warna obyek secara keseluruhan. Karenapemantulan diffuse lebih terang pada bagian obyek yang disinari, pemantulan ambient tampakpada bagian obyek yang tidak disinari. Pemantulan ambient total dari sebuah obyek dipengaruhioleh cahaya ambient global dan cahaya ambient dari sumber cahaya. Seperti juga pemantulandiffuse, pemantulan ambient juga tidak dipengaruhi oleh letak sudut pandang.

Untuk obyek nyata, pemantulan ambient dan diffuse biasanya menggunakan warna yangsama sehingga OpenGL memberikan jalan untuk mengeset nilai yang sama untuk keduanya secaraserentak 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 pemantulanambient dan diffuse, pemantulan specular tergantung pada sudut pandang. Contohnya adalah jikakita 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);

Page 103: Buku Grafika Diktat Kuliah

TEKSTUR MAPPING

8.1. Penentuan tekstur

Perintah glTexImage2D() mendefinisikan tekstur 2 dimensi. Perintah tersebutmemerlukan beberapa argumen yang diterangkan di bawah ini:

void glTexImage2D(Glenum target, Glint level, Glint components, Glsizeiwidth, 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

2m+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. MipmappingSeperti 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

Page 104: Buku Grafika Diktat Kuliah

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

Page 105: Buku Grafika Diktat Kuliah

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.

Page 106: Buku Grafika Diktat Kuliah

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

Page 107: Buku Grafika Diktat Kuliah

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=LtCf, A=Af C=(1-Lt)Cf+LtCc,A=Af

2 Tak terdefinisi C=LtCf, A=AtAf C=(1-Lt)Cf+LtCc,A=AtAf

3 C=Ct, A=Af C=CtCf, A=Af Tak terdefinisi

4 C=(1t)Cf+AtCt, A=Af C=CtCf, A=AtAf Tak terdefinisi

Tabel fungsi decal, modulate dan blendDalam 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*().

Page 108: Buku Grafika Diktat Kuliah

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

Page 109: Buku Grafika Diktat Kuliah

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,

Page 110: Buku Grafika Diktat Kuliah

GL_LINEAR_MIPMAP_NEAREST,

GL_ LINEAR_MIPMAP_LINEAR,

GL_TEXTURE_BORDER_COLOR Sembarang nilai dalam [0,1]

Page 111: Buku Grafika Diktat Kuliah

DAFTAR KEPUSTAKAAN

1. David F. Rogers, Procedural Elements for Computer Graphics, McGraw-HillBook 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-HallInternational, 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-WesleyPublishing Company, 1996

8. Michael E. Mortenson, Geometric Modeling, Wiley Computer Publishing, 1997.