Terjemahan EBOOK Core Algorithm in Game Technology Part II

on Jumat, 29 Juni 2012
Lanjutan Posting pada blog sebelumnya.


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.

Sekarang, mari kita lihat sisa dari persamaan. Komponen difus adalah skala oleh (N dot L), dimana N adalah biasa obyek, dan L adalah vektor dari titik yang dinaungi ke sumber cahaya. Dengan asumsi kedua vektor adalah normal, ini berarti kontribusi difus adalah total setiap kali cahaya jatuh pada paralel objek untuk kembali normal-dengan demikian, dengan cara yang sempurna vertikal.  Konfigurasi ini dipamerkan pada Gambar 17.1.



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.

Anda dapat menemukan contoh lengkap tentang bagaimana pencahayaan bekerja di Lampiran B, "OpenGL", dan Lampiran C, "Direct3D."


-EOF-











0 komentar:

Posting Komentar