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