Sebuah Persamaan sederhana Rendering
Demi pemrograman game, sekarang kita akan membahas beberapa metode komputasi yang mensimulasikan interaksi cahaya. Kami akan mulai dengan algoritma relatif mudah digunakan dalam aplikasi grafis banyak dan permainan. Kemudian dalam bab ini, kita akan mencari solusi lebih terlibat seperti Fungsi Distribusi reflektansi dua arah (BRDF). Tapi untuk memulainya, kita akan menggunakan model yang menghitung pencahayaan dalam huruf a sebagai hasil dari tiga komponen:
·
Ambient.
Cahaya yang berhamburan ke segala arah dan menyediakan pencahayaan dasar ke
TKP.
·
Diffuse.
Cahaya yang dipantulkan dari permukaan ke segala arah. Jumlah cahaya yang
dipantulkan sebanding dengan sudut datang cahaya mencolok permukaan. Komponen
ini adalah sudut pandang independen.
·
Specular.
Cahaya yang dipantulkan pada permukaan sepanjang arah cermin, yang menyumbang
refleksi murni antara objek dan sumber cahaya. Seperti semua cermin, intensitas
adalah melihat tergantung.
Berikut adalah persamaan
pencahayaan global untuk model seperti itu:
Color = Ka*ambientColor +
Kd*diffuseColor*(N dot L) + Ks*specularColor*(R dot V)shininess
Persamaan memiliki tiga komponen
utama, satu untuk ambien, satu untuk menyebar, dan satu untuk specular. Mari
kita tinjau masing-masing.
Ka, Kd, dan Ks melakukan kerusakan
pada komponen pencahayaan. Bahan yang berbeda memiliki proporsi yang berbeda
dari masing-masing, tetapi ketika ditambahkan, komponen ini harus 1. Nilai
tipikal adalah Ka = 0.2, Kd = 0,5 dan Ks = 0,3,
contohnya.
Tiga warna (ambientColor, diffuseColor,
dan specularColor) adalah triplet RGB menentukan warna daritiga
komponen. Mereka dapat dihitung dengan menggunakan kriteria yang berbeda. AmbientColor,
misalnya, biasanya putih atau beberapa warna halus yang ada hubungannya dengan
warna siang hari: merah muda di malam hari, dan sebagainya. Alasan untuk
menggunakan cahaya putih sebagai ambien adalah bahwa, secara umum, kita dapat
mengasumsikan bahwa adegan memiliki gelombang cahaya banyak berbeda panjang
gelombang, sehingga mereka menghasilkan cahaya putih bila dikombinasikan. Warna
diffuse dan specular tergantung pada objek warna dan warna sumber cahaya.
Komponen specular, misalnya, biasanya diinisialisasi dengan warna sumber
cahaya,sedangkan buram warna harus mengambil kedua permukaan dan warna cahaya
menjadi pertimbangan. Secara intuitif, sebuah bola putih diterangi dengan
cahaya biru tidak terlihat putih bersih, juga tidak terlihat biru murni. Jadi,
dengan menggunakan teknik berikut adalah :
ambientColor = white
diffuseColor =
surfaceColor * lightColor
specularColor
= lightColor
Perhatikan
bahwa ini adalah sebuah pendekatan. Alam tidak memiliki komponen lingkungan per
se, dan permukaan yang berlipat ganda serta warna dari sumber cahaya untuk
warna diffuse agak salah. Tapi hasilnya sangat baik dan dapat dihitung secara
real waktu.
Gambar 17.1. Penjelasan Vektor normal dan
ringan.
Semua
cahaya kemudian memantul kembali, dan kontribusi menyebar maksimal. Lalu,
kontribusi specular adalah skala dengan (R dot V), dimana R adalah vektor
cahaya yang dipantulkan, dan V adalah vektor melihat. Konfigurasi ini
dipamerkan dalam Gambar 17.2
Gambar 17.2. Normal, ringan, pantulan cahaya,
dan ilustrasi pandangan vektor.
Secara
intuitif, cahaya dipantulkan dari permukaan seperti dalam cermin, dan jika kita
angularly dekat dengan cermin yang (itu yang R dot V artinya), kita melihat
hotspot. Satu-satunya masalah adalah komputasi R dan V. Berikut adalah
persamaan:
V =
vector from the point being shaded to our position
R
= 2*N*(N dot L) – L
Formulasi
untuk R dapat mengambil keuntungan dari N titik L, yang sudah dihitung untuk
komponen menyebar. Juga, perhatikan bagaimana kita menambahkan eksponen untuk
persamaan. Secara intuitif, benda dipoles menunjukkan lebih kecil, lebih
terfokus highlight, sehingga parameter shininess membantu kita model tersebut. Berikut
ini adalah persamaan umum yang menambahkan dukungan untuk berbagai sumber dan
mengambil atenuasi mempertimbangkan:
Color = Ka*ambientColor
+ S(1/(kC+kL*di+kQdi2))*(Kd*diffuseColori* (N dot Li) + Ks * specularColori *(Ri
dot V)shininess)
Perhatikan bahwa, global sumber cahaya
kontribusi ambien independen akan ditambahkan ke jumlah dari individu kontribusi
dari masing-masing lampu dalam adegan. Kemudian, lampu masing-masing memiliki
komponen diffuse dan specular. Saya telah menambahkan subindex untuk mewakili
nilai-nilai yang harus dihitung per ringan, seperti warna dan vektor refleksi.
Sekarang, catatan pada faktor redaman:
Dalam dunia nyata, cahaya diserap oleh jarak kuadrat. Hal ini sangat baik cocok
untuk jarak yang besar hadir di dunia nyata, tetapi memberikan hasil yang aneh
dalam komputer grafis. Jadi, baik OpenGL dan DirectX menggunakan model yang
sedikit berbeda, dimana redaman adalah persamaan kuadrat umum berupa:
attenuation=1/(kC+kL*di+kQdi2)
Dalam persamaan, di adalah jarak
antara titik yang dinaungi dan sumber cahaya. Sekarang yang harus kita lakukan
adalah
tune kC, kL, dan parameter kii untuk
mencapai hasil yang kita inginkan. Sebuah pelemahan konstan, misalnya, akan dinyatakan
sebagai (kC! = 0, kL = kii = 0). Di ujung lain, persamaan kuadrat yang meniru
dunia nyata akan dicapai dengan (kC = 0, kL = 0, kii = 0). Dan atenuasi linier
yang sangat populer digunakan oleh banyak permainan dicapai dengan kC = 0, kL =
0, kii = 0.
Sebuah kata dari peringatan pada
jenis-jenis persamaan: Ini adalah model ideal yang tidak mengambil banyak
faktor ke pertimbangan. Bayangan, misalnya, perlu untuk menggabungkan geometri
adegan ke dalam persamaan. Apakah suatu titik dalam bayangan dari sumber
cahaya, komponen-komponennya diffuse dan specular baik akan dihilangkan sama
sekali (untuk buram occluders) atau skala oleh nilai
opacity (jika objek menyebabkan bayangan adalah semitransparan). Kita akan
berbicara tentang bayangan kemudian dalam bab dalam bagian mereka sendiri.
Cahaya Per-Vertex dan Per-Pixel
Cara pertama untuk menghasilkan efek
pencahayaan meyakinkan pada permainan komputer adalah dengan menggunakan
per-titik pencahayaan. Ini jenis pencahayaan dihitung pada simpul dari geometri
saja dan interpolasi di antara keduanya. Jadi, untuk menerangi segitiga kita
akan menghitung persamaan pencahayaan di
masing-masing dari tiga simpul. Kemudian, perangkat keras akan menggunakan tiga
nilai untuk interpolasi penerangan dari segitiga keseluruhan.
Persamaan render dari bagian
sebelumnya adalah pilihan yang populer karena dapat diimplementasikan dengan
mudah. Bahkan, varian dari persamaan yang digunakan secara internal oleh kedua
OpenGL dan DirectX penyaji.
Tapi per-vertex pencahayaan hanya
dihitung sebagai simpul. Jadi apa yang akan terjadi pada dinding yang besar
diwakili oleh hanya dua segitiga? Bayangkan bahwa kita menempatkan sumber
cahaya tepat di tengah dari quad, jauh dari empat simpul. Di dunia nyata,
sumber cahaya akan menciptakan hotspot sangat cerah di tengah dinding, tetapi
karena kita tidak memiliki simpul di sana, per-titik pencahayaan akan terlihat
benar-benar salah (lihat Gambar 17.3). Kita perlu baik memperbaiki mesh (yang pasti akan
berdampak pada bus dan GPU) atau menemukan cara lebih baik untuk naungan.
Gambar
17.3. Cahaya Per-vertex (kiri) dibandingkan per-pixel (kanan).
Di sinilah per-pixel shading kicks in
Ini modus pencahayaan tidak menghitung pencahayaan di simpul saja, tetapi dalam
setiap pixel di antara, sehingga pencahayaan memiliki resolusi yang lebih
tinggi dan kualitas. Teknik seperti pemetaan cahaya (dijelaskan dalam bagian
berikutnya) atau fragmen shader (dijelaskan dalam Bab 21, "Teknik
Prosedural") digunakan untuk menghitung per-pixel pencahayaan.
Tetapi jika per-vertex pencahayaan
adalah apa yang Anda cari, ada dua pilihan. Anda dapat warna pencahayaan baik
pra perhitungan dan menyimpan mereka sebagai per-titik warna, atau Anda dapat
meninggalkan tugas ini ke OpenGL atau DirectX pencahayaan mesin. yang pertama pendekatan
memiliki keuntungan menjadi lebih cepat karena tidak ada perhitungan yang
dilakukan di loop real-time (pencahayaan adalah persamaan mahal). Di sisi lain,
kontribusi specular tidak dapat pra perhitungan karena bergantung pada pandangan.
Pilihan kedua mengambil keuntungan dari saat ini generasi GPU, yang semua
perangkat keras dukungan pencahayaan dan perubahan.
-EOF-