Ada beberapa aspek untuk masalah ini. Pertama, bagaimana Anda menggambar 10.000 blok Anda? Apakah Anda benar-benar menggambar mereka sebagai 10.000 objek terpisah? Jika demikian ini hampir pasti leher botol Anda, bukan kurangnya oklusi pemusnahan. Anda harus mengelompokkan blok-blok ini ke dalam jumlah yang lebih kecil dari jerat (mungkin beberapa ribu per mesh) untuk mengurangi panggilan draw.
Adapun pertanyaan Anda yang sebenarnya, ada tiga jenis penyumbatan oklusi yang muncul di benak Anda.
1) Blok di luar tampilan frustum. Ini berarti blok yang ada di belakang Anda atau dua sisi. Ogre sudah menghapus ini melalui pemusnahan tampilan frustum.
2) Blok yang 'bawah tanah' atau dikelilingi sepenuhnya oleh blok lain sehingga tidak dapat dilihat dari sudut manapun. Anda dapat mengidentifikasi ini dengan melihat blok tetangga yang sama. Jika semuanya solid, blok Anda disembunyikan. GPU seharusnya tidak pernah mendengar tentang blok ini - mereka harus dilewati ketika Anda membangun mesh yang mewakili permukaan Anda.
3) Blok yang ada di permukaan dan dapat dilihat dari beberapa posisi di level, tetapi yang saat ini disembunyikan oleh bukit (atau sesuatu). Ini adalah kasus paling sulit yang belum saya jawab sendiri, tetapi ada kemungkinan bagus bahwa permintaan oklusi perangkat keras dapat digunakan untuk kasus ini.
Ini plug yang tidak tahu malu, tapi saya punya perpustakaan yang cukup matang yang digunakan beberapa orang untuk mengembangkan klon Minecraft, termasuk beberapa menggunakan Ogre. Anda menentukan konten volume dan menghasilkan mesh permukaan yang kemudian dapat Anda render. Ini halaman beranda:
http://www.thermite3d.org/
Dan ini adalah video proyek orang lain yang menggunakannya:
http://www.youtube.com/watch?v=Jju6WRPEK7o
Jika Anda memiliki 10.000 objek terpisah, bottleneck mungkin adalah jumlah primitif, bukan verteks, poligon, atau isi. Panggang objek Anda menjadi lebih sedikit jumlah objek poligon yang lebih tinggi untuk kecepatan.
Minecraft memiliki konsep balok batu, tetapi saya tidak dapat menemukan referensi saat ini.
Berikut ini juga eksperimen saya pada menggambar ton kubus dengan berbagai teknik. Belum termasuk baking (belum).
sumber
Apa yang saya lakukan adalah setelah saya membuat array blok saya, tetapi sebelum saya membuat simpul, saya menjalankan sub yang disebut UpdateBlockVisiblility.
Sub hanya memeriksa tetangga ke blok, dan memperbarui blok boolean facevisible sesuai.
Maka saya hanya membuat simpul untuk wajah jika terlihat! Sederhana :)
sumber