Teknik rendering dengan Ray Tracing | Dwiperdana

Teknik rendering dengan Ray Tracing

Mon, Nov 12, 2018

Kira-kira 7 menit lah

Apa itu ray tracing? Kapan ray tracing digunakan dibanding metode rendering lain? Bagaimana kita membuat algoritma ray tracing sendiri?

Teknik rendering dengan Ray Tracing

Post ini pertama kali dibuat tahun 2013 di blog lama saya.

Tulisan kali ini diambil dari makalah yang saya buat tahun 2007 lalu sebagai persyaratan untuk mendaftar jadi asisten asisten Lab GaIB (Grafik dan Intelejensi Buatan). Topiknya tentang Ray Tracing, salah satu jenis rendering. Membuat tulisan ini memberi pelajaran yang sangat banyak untuk saya, terutama tentang bagaimana proses rendering bekerja. Dan sejak saat itu saya tidak bisa melihat film atau gambar 3D hasil computer graphic dengan sama lagi :) Karena selalu terpikir teknik apa saja yang digunakan untuk mencapai kualitas seperti itu.

Silahkan menikmati :D

Gambaran Umum Ray Tracing

Ray tracing adalah suatu metode untuk menghasilkan gambar yang dibuat dalam lingkungan komputer 3D. Cara kerjanya adalah dengan mengikuti jejak (tracing) suatu sinar (ray) dari suatu mata imajiner yang melalui sebuah pixel di layar virtual dan mengakumulasi kontribusi setiap sinar dalam scene di pixel tersebut. Setiap sinar yang berasal dari mata tersebut diperiksa apakah berpotongan/bertabrakan dengan objek-objek di dalam scene. Scene adalah kumpulan objek-objek dan sumber cahaya yang akan dilihat oleh pengamat. Setiap terjadi tabrakan antara sinar dan objek, warna pixel di-update, lalu tergantung dari jenis material objek dan algoritma yang dipakai, sinar tersebut dapat diteruskan atau dihilangkan.

Dengan metode ray tracing ini, kita dapat membuat berbagai efek yang sulit atau bahkan tidak mungkin dengan metode lain. Diantara efek-efek tersebut adalah pemantulan, tembus cahaya, dan bayangan.

Gambar 1. Contoh ray tracing sederhana

Dalam menggunakan ray tracing, umumnya dibuat suatu batasan agar lebih mangkus. Contohnya, pixel akan di-update jika sinar telah memantul n kali atau telah bergerak sejauh m tanpa berpotongan dengan apapun. n dan m adalah nilai pembatas. Intensitas cahaya dan warna dari pixel yang bersangkutan dihitung berdasarkan sejumlah algoritma, baik dengan algoritma klasik atau dengan teknik radiosity.

Salah satu metode turunan dari ray tracing adalah photon mapping. Pada photon mapping ini, sinar dibuat dari sumber cahaya dan dari mata pengamat secara independen. Sinar yang dibuat akan terus bergerak dalam scene sampai habis diserap oleh sebuah permukaan, bergerak ke arah yang tidak akan terjadi perpotongan, atau jaraknya terlalu jauh dari pengamat. Inti dari photon mapping adalah melakukan simulasi pencahayaan, namun hal ini jauh lebih lambat daripada ray tracing biasa. Konsep Ray Tracing

Ada dua konsep yang menjadi dasar teori untuk ray tracing, yaitu :

  • Kita dapat melihat sebuah benda karena benda tersebut memantulkan cahaya. Cahaya yang dipantulkan tersebut lalu akan ditangkap oleh retina mata dan diterjemahkan oleh otak menjadi apa yang kita lihat.
  • Dalam perjalanan sebuah sinar, jika sinar tersebut menabrak suatu permukaan, dapat terjadi tiga hal tergantung pada jenis permukaan yang ditabrak, yaitu penyerapan, pemantulan, dan pembiasan. Sebuah permukaan dapat memantulkan semua atau sebagian dari sinar, baik ke satu atau banyak arah. Permukaan tersebut juga dapat menyerap sebagian dari sinar, mengurangi intensitas sinar yang terpantul atau terbias. Jika permukaan tersebut mamiliki sifat tembus cahaya (transparency/translucent) maka permukaan itu akan membiaskan sebagian sinar dan menyerap sebagian atau semua spektrum sinar, sehingga dapat mengubah warna sinar.

Namun perlu diperhatikan bahwa ada perbedaan mendasar antara konsep diatas dengan ray tracing. Pada ray tracing, umumnya sinar berasal dari mata pengamat, sedangkan pada kenyataannya sinar selalu berasal dari sumber cahaya. Karena itu ada dua jenis ray tracing, eye-based dan light-based. Eye-based adalah ray tracing dimana sinar berasal dari mata pengamat, sedangkan pada light-based ray tracing, sinar berasal dari sumber cahaya. Algoritma Ray Tracing

Sebelum membahas algoritma ray tracing, ada beberapa hal penting yang harus kita perhatikan.

7 Hal penting tentang Ray Tracing

1. Tiga efek umum dalam ray tracing

  1. Pemantulan
  2. Tembus cahaya
  3. Bayangan

2. Ray tracing adalah fungsi rekursif.

Setiap sebuah sinar berpotongan dengan sebuah permukaan (disebut juga tabrakan), terjadi rekursi. Dari titik perpotongan tersebut, satu atau lebih sinar dibuat untuk menentukan objek apa yang terpantul di titik itu (jika memantulkan cahaya), objek apa yang terlihat melalui titik itu (jika tembus cahaya), sumber cahaya mana saja yang dapat terlihat dari titik itu (untuk menentukan bayangan), dan lain-lain.

Basis dari fungsi ray tracing ini adalah batasan dimana sinar berhenti bergerak. Basis-basis yang umum digunakan diantaranya :
- Jika tidak berpotongan dengan objek maka warna yang dihasilkan adalah warna latar belakang - Jika objek yang berpotongan terdekat adalah sumber cahaya maka warna yang dihasilkan sesuai warna cahaya - Jika jumlah pantulan melewati batas pemantulan maka sinar berhenti bergerak - Jika jarak sinar dari layar melewati jarak maksimum maka sinar berhenti bergerak

3. Sinar

Sinar yang digunakan dalam ray tracing adalah sebuah vektor. Persamaan sebuah sinar dapat ditulis sebagai :

$S + tD$

S = titik sumber sinar (x,y,z) 
t = panjang sinar  
D = arah sinar (dalam vektor satuan)

4. Fungsi Perpotongan

Untuk menentukan apakah sebuah sinar berpotongan dengan objek, diperlukan sebuah fungsi perpotongan. Fungsi ini dibuat spesifik untuk setiap jenis objek, misalnya bola atau poligon. Sebagai contoh, kita akan membuat fungsi perpotongan dengan bola.

Persamaan bola pada ruang 3D :

$(x-a)^2 + (y-b)^2 + (z-c)^2 = r^2$

(x,y,z) adalah titik pada bola
(a,b,c) adalah pusat bola

Substitusi x,y, dan z pada persamaan bola dengan persamaan sinar :

$((S.x+t(D.x))-a)^2 + ((S.y+t(D.y)-b)^2 + ((S.z+t(D.z)-c)^2 = r^2$

Agar lebih mudah membaca rumus diatas maka kita lakukan substitusi :

$A = (D.x)^2 + (D.y)^2 + (D.z)^2$ $B = 2. ((D.x)(S.x-a) + (D.y)(S.y-b) + (D.z)(S.z-c))$ $C = ((S.x-a)^2 + (S.y-b)^2 + (S.z-c)^2) – r^2$

Didapat persamaan kuadrat :
$At^2 + Bt + C=0$

t bisa didapat dengan menyelesaikan persamaan kuadrat diatas:

$t = \frac{-B ± \sqrt{B^2-4AC})}{2A}$

Jika t adalah bilangan real, maka sinar berpotongan dengan bola. Jika tidak, maka sinar tidak berpotongan dengan bola.

5. Pemantulan

Gambar 2. Pemantulan pada ray tracing

Jika permukaan yang ditabrak sinar adalah permukaan yang memantulkan cahaya seperti cermin, ray tracer harus menentukan warna titik perpotongan tersebut dengan memperhitungkan warna permukaan dan warna yang terpantul pada titik tersebut. Hal itu dilakukan dengan menentukan arah sinar pantulan dan membuat sinar baru yang bergerak sesuai arah tersebut.

Persamaan untuk menentukan arah sinar pantul :

$P = 2_(N.(-D))_N +D$

N adalah vektor normal permukaan
D adalah arah sinar

6. Tembus cahaya

Tembus cahaya memiliki sifat yang mirip dengan pemantulan, tapi sinar tidak dipantulkan pada permukaan, melainkan dibiaskan di dalam objek yang bersangkutan. Arah sinar bias ditentukan berdasarkan indeks bias benda tersebut, jumlahnya bisa lebih dari satu atau tidak ada sama sekali. Sinar baru akan dibuat dengan arah sinar bias.

Gambar 3. Pembiasan pada ray tracing

Persamaan untuk menentukan arah sinar bias :

$T = (\frac{n1}{n2}(N.I) – \sqrt{1 - 2\frac{n1}{n2} . (1 – (N.I)2) } ) . N – \frac{n1}{n2}.I$

T adalah arah sinar bias
n1 adalah indeks bias material awal
n2 adalah indeks bias material objek
I adalah sinar awal
N adalah vektor normal permukaan

7. Bayangan

Gambar 4. Pengecekan bayangan pada ray tracing

Untuk menentukan apakah titik perpotongan dengan permukaan berada dalam suatu wilayah bayangan dilakukan pemeriksaan antara titik tersebut dengan semua sumber cahaya. Hal ini dilakukan dengan membuat sinar-sinar baru dari titik ke sumber cahaya.

Jika ada objek diantara titik dan sumber cahaya, maka titik tersebut tidak akan mendapat cahaya dari sumber yang bersangkutan, dengan kata lain, titik tersebut berada dalam bayangan. Contoh dapat dilihat pada gambar 4 diatas, titik pada objek 1 mendapat bayangan dari sumber cahaya 2, dan mendapat cahaya dari sumber cahaya 1.

Dari semua informasi diatas kita dapat membuat sebuah algoritma pseudocode untuk ray tracing :

for(semua pixel dalam layar){
    buat sinar dari mata pengamat melalui pixel
    raytrace(sinar_asal, warna_saat_ini, kedalaman_rekursi, jarak_dari_layar){
        inisialisasi objekTerdekar dan perpotonganTerdekat dengan NULL
        for(semua objek dalam scene){
            if(sinar berpotongan dengan objek){
                if(jarak perpotongan t lebih kecil dari perpotonganTerdekat){
                    set perpotonganTerdekat dengan t
                    set objekTerdekat dengan objek yang sedang diperiksa
                }
            }
        }
        if(objekTerdekat = NULL){
            isi pixel dengan warna latar belakang
        }else if(objekTerdekat adalah sumber cahaya){
            isi pixel dengan warna cahaya yang dipancarkan
        }else{
            /*buat sinar ke semua sumber cahaya untuk memeriksa bayangan*/
            for(semua sumber cahaya){
                buat sinar ke sumber cahaya
                for(semua objek dalam scene){
                    if(sinar berpotongan dengan objek){
                        titik ini berada dalam bayangan, intensitas cahaya dikurangi
                    }
                }
            }
            akumulasikan warna yang didapat dari bayangan
            /*jika permukaan memantulkan cahaya, buat sinar pantulan (rekursi)*/
            buat sinar pantulan
            if(kedalaman_rekursi < kedalaman_max dan jarak_dari_layar < jarak_max){
                raytrace(sinar_bias, warna_permukaan, kedalaman_rekursi+1, jarak_dari_layar)    
            }
        }
        akumulasikan warna yang didapat dari pembiasan
        jika tidak terjadi bayangan, pemantulan, atau pembiasan, ambil warna permukaan
        perhitungkan warna berdasarkan semua warna yang didapat sebelumnya
        isi pixel dengan warna hasil perhitungan        
    }
}
comments powered by Disqus