Saya sedang menulis aplikasi yang membuat pulau acak ditanami pohon. Pohon-pohon saat ini adalah dua paha depan, bersilangan dan digambar dengan tekstur. Saya berencana untuk memiliki jerat yang lebih kompleks yang membentuk berbagai jenis tanaman, misalnya pohon palem, ek, rumput dll.
Masalah yang saya hadapi adalah karena teksturnya transparan saya harus menggambarnya dari belakang ke depan. Plan-b adalah panggilan menggunakan discard di frag shader, tetapi z-order memberikan hasil yang lebih baik:
uniform float uTreeAlpha;
uniform sampler2D uTexture;
varying vec2 vTexCoordOut;
void main (void)
{
vec4 colour = texture2D(uTexture, vTexCoordOut);
if (colour.a < 0.1) {
discard;
}
gl_FragColor = vec4(colour.rgb, colour.a * uTreeAlpha);
}
Masalah kedua adalah karena perubahan urutan tergantung pada kamera & lookat Saya tidak tahu cara yang efisien untuk menggambar mereka di OpenGL dalam satu panggilan.
Saat ini kode rendering saya terlihat seperti pseudocode ini:
if cameraChangedFromLastTime() then
sortTreesBackToFront();
end
for i = 0 to trees.size() -1
drawTree()
end
Di mana setiap drawTree () menetapkan beberapa seragam, mengatur tekstur, dan kemudian memanggil glDrawArrays (). Saya memiliki beberapa optimisasi untuk melewati pengaturan tekstur atau memperbarui tekstur coords jika pohon terakhir dan arus adalah sama, dan pengaturan beberapa seragam umum di luar loop, dan melewatkan pohon yang terlalu jauh tetapi pada dasarnya jika saya memiliki 3000 pohon saya pergi 3000 kali di loop.
Menggambar setiap pohon secara individu adalah pembunuh kinerja. Jika saya bisa menggambar mereka dalam satu panggilan, atau batch (sambil mempertahankan Z-order) saya mungkin akan melakukannya dalam 1/10 kali.
Jadi bagaimana saya melakukannya. Ingatlah bahwa pohon saya adalah penampung dan akhirnya saya akan memiliki:
- Jerat yang berbeda untuk pohon yang berbeda
- Skala dan sudut yang berbeda untuk pohon memberikan variasi yang lebih banyak
- Tekstur yang berbeda untuk pohon yang berbeda, kemungkinan banyak tekstur diterapkan pada mesh (mis. Meninggalkan satu tekstur, trunk yang lain)
- Semua pohon dicampur jadi tidak ada cara sederhana untuk menggambar satu jenis dan satu lagi
- Beberapa bentuk animasi siklus sederhana (cabang-cabang terombang-ambing oleh angin)
- Semua tekstur akan berada dalam satu atlas tunggal
Jadi apa pendekatan terbaik di sini? Apakah layak untuk membuat dalam satu pass? Jika saya menggunakan glDrawElements, membangun kembali indeks tetapi bukan simpul, dapatkah saya mencapai ini?
sumber
Jawaban:
Yang Anda inginkan adalah pemasangan perangkat keras . Catatan: Saya sudah melakukan ini di XNA (yaitu DirectX), tapi saya tidak tahu banyak tentang OpenGL. Saya yakin ada fitur yang sebanding. Pada dasarnya apa artinya mengikat bersama simpul dari model pohon Anda dengan aliran simpul lain yang membawa koordinat dunia untuk setiap contoh.
sumber
Transparansi hanya perlu dipesan jika menggunakan blending non-aditif. Untuk satu ton papan iklan yang jauh, pencampuran itu tidak perlu (Anda tidak bisa melihatnya). Jadikan setidaknya yang lebih lanjut dengan transparansi cutout (alfa hanya 1 atau 0) dan Anda tidak perlu mengurutkannya.
Anda dapat menggunakan semacam sprite untuk membuat berbagai jenis pohon, dengan animasi yang dipanggang. Gambarlah jerat untuk pohon yang lebih dekat yang dapat Anda hidupkan dengan kesetiaan lebih berdasarkan angin atau apa pun yang Anda inginkan.
sumber