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?