Minggu, 17 Juni 2012

Bab 20. Organik rendering (cont.)


Rumput
Kita telah melihat bagaimana Render pohon adalah masalah memberikan banyak detail untuk satu objek menggunakan geometri yang sangat sedikit. Render rumput adalah cerita yang sama sekali berbeda. Setiap rumput relatif sederhana dan dapat berkisar dari satu baris ke beberapa segitiga. Namun, kita harus membuat ribuan dari mereka untuk menyampaikan tampilan padang rumput rumput nyata. Disini kompleksitas tidak terletak pada objek tertentu tetapi dalam jumlah kita akan mencoba untuk mencapai. Tidak mengherankan, rumput metode rendering sangat berbeda dari algoritma pohon.

Kami akan mengeksplorasi serangkaian algoritma yang cocok untuk rumput. Beberapa dari mereka akan memiliki keterbatasan tertentu (tidak bisa menghidupkan rumput adalah salah satu yang populer). Hanya dengan mengetahui semua algoritma secara rinci akan Anda dapat memilih salah satu yang cocok untuk anda.

Layered Grass
GrassOne pendekatan berlapis untuk rumput rendering adalah untuk menghitung rumput melalui volume rendering. Ini adalah algoritma yang sangat murah yang menghasilkan hasil yang cukup baik. Idenya sederhana: Ambil pisau individu rumput. Pisau akan vertikal atau hampir vertikal, dan sehingga mempermudah dengan garis vertikal lurus cukup akurat. Tapi berapa banyak bilah rumput yang ada di sebuah padang rumput terbuka? Jumlahnya bisa mencapai ratusan ribu, dan kami jelas tidak akan melukis garis yang banyak. Biaya akan menjadi penghalang. Kita perlu cara alternatif untuk mengatasi masalah itu, sehingga kami dapat menjaga tingkat kompleksitas jelas sementara menjaga tingkat kompleksitas yang sebenarnya itu cukup rendah.

Di sinilah konsep volume rendering kicks in Sebagai ganti lukisan pisau individu, kami akan sampel volume yang ditempati oleh padang rumput keseluruhan, dan membuat pisau sebagai piksel pada tekstur. Untuk melakukannya, kita akan menggunakan elemen volume (voxel), yang akan menyandikan tata letak pisau rumput sebagai fungsi volume. Sekarang, karena kita menyederhanakan rumput dengan garis vertikal lurus, kita kehilangan informasi Y, dan kita bisa kompres voxel 3D kami hanya bitmap 2D, yang kita akan lapisan di Y untuk menyampaikan volume.

Jadi, algoritma kami semudah melukis bitmap yang sama di iris Y beberapa. Sekarang, bitmap adalah bagian kompleks. Untuk volume rendering, bitmap akan perlu untuk mengkodekan bagian XZ dari bilah-bilah rumput. Ini berarti bitmap RGBA, di mana area yang tercakup rumput yang dicat dengan alpha = 1, dan daerah yang tidak seharusnya memiliki pisau rumput yang dicat dengan alpha = 0. Hal ini sangat penting untuk ruang semua elemen rumput merata, jadi kita tidak bisa merasakan pola ubin di rumput.

Rendering cukup sederhana. Render bidang tanah pertama. Kemudian, membuat quad sama, menggeser bersama Y untuk setiap iterasi. Antara 5 dan 20 quads akan diperlukan untuk menyampaikan rasa kontinuitas vertikal. Sebagai aturan praktis, jumlah lapisan harus dapat dihubungkan ke lapangan kamera. Sebuah kamera yang sangat bernada melihat pisau dari atas, dan dengan demikian tidak banyak iterasi yang diperlukan. Sebuah kamera yang hampir sejajar dengan tanah, di sisi lain, akan membutuhkan jumlah yang jauh lebih tinggi dari iterasi untuk enerate ilusi pisau terus menerus. Lihatlah Gambar 20,6 untuk gambar jelas.
Gambar 20.6. Lapisan tekstur peta digunakan untuk membuat rumput dan menyampaikan paralaks.

Dengan demikian, metode ini membutuhkan waktu satu peta tekstur dan quads sebanyak yang diperlukan untuk menggambarkan pisau. Kita bahkan dapat menambahkan animasi dengan mengubah tekstur rumput koordinat sedikit. Bahkan, metode ini baru-baru ini kode untuk berbagai permainan dan platform. Rumput tidak bisa melihat dekat, tapi ilusi ini cukup meyakinkan, dan biaya yang pasti plus.

Selain itu, metode ini dapat diimplementasikan dalam quad tunggal dengan menggunakan pixel shader. Di sini kita akan menghitung sudut dari pemain untuk Texel masing-masing dan sampel volume untuk menghasilkan peta tekstur. Dengan cara ini kita hanya akan menggunakan satu quad, yang akan bekerja rincian proyeksi internal. Perhatikan, bagaimanapun, bahwa pendekatan shader tidak selalu ide yang baik. Jika kita melukis quads beberapa menggunakan pendekatan pertama, kita dapat memiliki elemen setengah tenggelam di rumput realistis, seperti binatang di tengah rumput tinggi atau berdiri sepak bola di tengah lapangan. Metode shader, dengan menggunakan hanya satu quad untuk menyingkat informasi dari quads yang berbeda, menghilangkan kemungkinan ini.

Distribusi statistik Algoritma
Kita sekarang akan membahas algoritma distribusi statistik, yang mencoba untuk menyampaikan kepadatan padang rumput penuh secara real time. Karena render semua rumput hanya mungkin, metode ini berfokus pada radius sekitar player dan alfa-rumput memudar seiring dengan bertambahnya jarak sehingga tidak ada pop di terjadi. Jika warna rumput memadukan baik dengan daerah ini, mata yang terkecoh, dan penampil berasumsi bahwa padang rumput seluruh efektif ditutupi oleh rumput. Menggunakan trik sederhana ini memastikan bahwa kita melukis sejumlah konstan segitiga untuk rumput, yang merupakan kunci untuk algoritma.

Geometri dicat menggunakan primitif segiempat; dan quad masing-masing mewakili beberapa bilah rumput yang dikelompokkan bersama-sama. Hal ini membantu mengurangi dampak segitiga, karena rumput pasti akan membutuhkan banyak geometri. Dengan teknik ini, penting untuk menggunakan metode rendering yang baik (seperti Rentang Array Vertex [VAR] di OpenGL atau DrawPrimitive dalam DirectX). Sayangnya, rumput tidak terdiri dari strip primitif, dan pengindeksan tidak akan membantu secara signifikan, sehingga VAR dari quads tampak seperti pilihan yang baik.

Pada titik ini, bagian statistik dari algoritma mulai bekerja untuk memastikan bahwa pola-pola terlihat tidak diinginkan dipecah sebanyak mungkin. Penonton tidak harus melihat bagaimana pisau dikelompokkan bersama, juga tidak melihat bahwa landscape tidak penuh dengan rumput. Untuk mencapai hal ini, pilihan terbaik adalah dengan menggunakan distribusi Poisson spasial, yang mendistribusikan serangkaian sampel pada bidang tanah sehingga jarak XZ antara dua sampel yang dipilih secara acak tidak pernah lebih kecil dari ambang batas tertentu. Distribusi Poisson yang populer dalam literatur komputer grafis. Mereka digunakan untuk wilayah sampel dalam ray tracing stokastik untuk efek yang sama.

Menerapkan distribusi Poisson tidak sederhana. Jika kita membutuhkan hasil 100 persen akurat, metode yang perlu digunakan disebut "anak panah melempar," yaitu, berturut-turut menambahkan elemen ke distribusi spasial secara acak, dan jika elemen baru melanggar definisi Poisson distribusi (dan tentunya memiliki lain sederhana lebih dekat dari ambang batas yang diinginkan), menghilangkannya. Dengan mengulangi rutinitas ini sampai kepadatan yang diinginkan tercapai, kita akan memperoleh distribusi Poisson sempurna. Tapi untuk permukaan besar proses ini dapat mengambil lama untuk menyelesaikan, sehingga metode-dekat Poisson digunakan: Bagilah permukaan dalam kotak persegi, tempat salah satu unsur dalam setiap node, dan menerapkan gerakan acak kecil untuk itu di kedua arah X dan Z . Gerakan kecil ini disebut jitter dan memastikan bahwa tidak ada pola yang terlihat terjadi. Jika jitter terbatas (misalnya, untuk setengah ukuran grid), kita masih mematuhi distribusi Poisson di sebagian kecil dari biaya. Untuk penciptaan rumput, metode ini (lihat Gambar 20.7) akan digunakan.
Gambar 20.7. Statistik distribusi pisau rumput. Kiri atas: Kotak. Kanan atas: Grid
jittered untuk membuat distribusi Poisson. Kiri bawah: Quads ditambahkan. Kanan bawah:
Hasil akhir di mana semua pola yang teratur telah dieliminasi.

Setelah distribusi Poisson telah dievaluasi, jitter rotasi harus diperkenalkan. Menjaga semua segmen blade selaras tentu tidak membantu menyampaikan rasa kekacauan dan kealamian. Dengan demikian, setiap segiempat akan diputar sekitar sumbu (vertikal) Y. Berikut rotasi acak polos akan melakukan pekerjaan dengan sempurna, yang memungkinkan padang rumput kacau muncul.

Sebuah langkah akhir yang lebih membantu mengurangi artefak visual menambahkan faktor skala ke quads individu, sehingga beberapa quads adalah lebih tinggi daripada yang lain. Sebuah penyimpangan 30 persen atau lebih bekerja dengan baik.

Sebuah catatan pada rendering: Seperti Anda mungkin telah ditemukan, ini adalah metode mengisi-rate intensif karena quads banyak diminta untuk menyampaikan kepadatan sebuah padang rumput yang nyata. Dengan demikian, algoritma Render harus dipilih secara teliti. Di bawah OpenGL, menggunakan Daftar Display adalah bukan ide yang baik karena kita perlu menghidupkan bilah dan yang membutuhkan mengirimkan kembali daftar. Sebuah langkah baik adalah dengan menggunakan server-side array vertex, yang dapat diperbarui jika diperlukan. Sebuah strategi yang sangat baik adalah untuk menghitung istribution Poisson pada waktu buka dan membuat sebuah array dengan semua simpul quad, koordinat tekstur, dan sebagainya. Array akan mewakili sebuah patch persegi rumput, katakanlah, 10x10 meter. Kemudian, Anda hanya menghidupkan dua simpul atas quad masing-masing melalui geser dan mengirim patch ke hardware grafis dengan menggunakan server-side array. Hal ini memungkinkan Anda untuk mengirim array yang sama beberapa kali dengan PushMatrix-Translate-PopMatrix, sehingga dapat mengisi seluruh Lembah rumput dengan mengulangi pola 10 x10. Manfaatnya jelas: Anda hanya akan menghidupkan 10 meter x10 rumput dan menggunakan sampel yang untuk menutupi banyak mil.

http://www.tar.hu/gamealgorithms/ch20lev1sec3.html (2 of 4)2/9/2009 6:13:30 PM
Core Techniques and Algorithms in Game Programming
 

Tidak ada komentar:

Posting Komentar