Ketika saya membuat model untuk permainan 3D, apa yang harus saya ambil sebagai ukuran dalam Poligon (segitiga) atau simpul anggaran saya? Saya telah melakukan percobaan dengan dua set 40000 kubus satu dengan 8 simpul dan 12 segitiga, yang lain dengan 24 simpul dan 12 segitiga. Semua dilakukan di Unity dan keduanya dihasilkan secara prosedural. Yang mengejutkan saya, kedua set tampil hampir sama ada perbedaan yang sangat kecil di antara mereka.
Apakah itu berarti saya tidak perlu khawatir tentang jumlah simpul dan hanya melihat jumlah segitiga?
EDIT: Saya telah membuat percobaan lain. Saya telah membuat sebuah pesawat dengan 19602 segitiga dan 10.000 simpul dan satu lagi dengan jumlah tirangles yang sama tetapi 39204 simpul. Saya telah menghasilkan 4000 dari keduanya. Sekarang lebih sedikit simpul yang memenangkan 14 fps hingga 19 fps. Jadi saya kira umumnya lebih sedikit lebih baik, tetapi hanya dalam perbedaan besar.
sumber
Jawaban:
Mari kita bayangkan mesh grid besar, seperti yang mungkin kita gunakan untuk medan. Kami akan membuat
n
segitiga itu layak, meliputi katakanlah setengah layar 1080p kami, dalam satu panggilan undian.Jika kita mengelas semua simpul kita dan tidak memiliki lapisan penghalusan / tekstur, maka setiap segitiga memiliki 3 simpul dan masing-masing simpul dibagi oleh 6 segitiga, jadi kita memiliki
n/2
simpul.Untuk membuat ini kita perlu:
Jalankan vertex shader setidaknya
n/2
kali("setidaknya" karena cache kita untuk hasil vertex hanya begitu besar. Kadang-kadang kita akan berakhir mengusir sebuah vertex yang sudah kita ubah, lalu membutuhkannya lagi untuk segitiga selanjutnya yang membagikannya dan menjalankan kembali vertex shader di atasnya. Jadi, kita tidak mendapatkan penghematan sebanyak yang terlihat di atas kertas)
Klip & cull
n
segitiga.Rasterisasi & interpolasi setidaknya 1920x1080 / 2 atau sekitar 1 juta piksel dari penyangga bingkai (karena kami mengatakan bahwa wilayah kami mencakup sekitar setengah layar).
("setidaknya" karena cara GPU bekerja pada quads piksel , beberapa fragmen di luar tepi poligon masih dirasterisasi tetapi kemudian ditutup, artinya kami memproses fragmen dua kali. Untuk mesh bergelombang kami juga akan mendapatkan overdraw di mana saja mesh) menutup sendiri, jika kita tidak cukup beruntung untuk menarik poligon paling depan ke dalam buffer kedalaman terlebih dahulu)
Jalankan shader fragmen untuk semua itu> = 1 juta fragmen.
Blend ~ 1 juta hasil ke dalam bingkai & kedalaman buffer.
Oke, sekarang mari kita lepaskan semua simpul kita jadi sekarang kita punya
3n
simpul untuk dirender, enam kali lebih banyak dari sebelumnya! Langkah kami adalah ...Jalankan vertex shader
3n
kali.(Tidak ada tanda bintang karena caching karena setiap titik hanya digunakan satu kali, meskipun ini berarti cache tidak dapat menghemat waktu kita)
Klip & cull
n
segitiga.Rasterisasi & interpolasi setidaknya 1920x1080 / 2 atau sekitar 1 juta piksel buffer bingkai.
Jalankan shader fragmen untuk semua itu> = 1 juta fragmen.
Blend ~ 1 juta hasil ke dalam bingkai & kedalaman buffer.
... tunggu, setiap langkah kecuali yang pertama adalah sama! Jadi sebagian besar pekerjaan yang dilakukan GPU pada panggilan biasa tidak berhubungan langsung dengan jumlah simpul yang digunakan. Jumlah cakupan layar, penarikan berlebih, dan jumlah total segitiga merupakan biaya yang jauh lebih besar.
Itu tidak berarti simpul sepenuhnya gratis. Jika Anda berbagi titik ketika Anda bisa mendapatkan sedikit penghematan dari caching, terutama jika titik sudut Anda rumit atau pipa titik perangkat keras Anda lemah (seperti halnya pada beberapa konsol lama). Tetapi mengingat bahwa jumlah titik verteks sebanding dengan jumlah segitiga plus atau minus faktor konstan, biasanya tidak menarik metrik biaya mesh keseluruhan.
sumber
Tidak juga.
Kecuali Anda berbicara jumlah tris (jutaan) yang sangat besar, yang Anda pedulikan adalah:
24 simpul kali 4000 kubus memberikan 96'000 simpul.
640x380 piksel memberikan fragmen 243'200, dan sebagian besar perangkat mendukung resolusi yang jauh lebih besar.
Anda dapat menjalankan kembali percobaan dengan 1'000'000 kubus, ditumpuk untuk menghindari hambatan panggilan undian (1 model tunggal untuk 1'000 kubus).
sumber
Perlu dicatat bahwa jika Anda melakukan aplikasi WebGL, jumlah vertex dengan cepat menjadi hambatan dalam hal ukuran file untuk diunduh pengguna. Jumlah segitiga yang sama tetapi sering simpul 2-3 kali lebih banyak daripada yang ditunjukkan dalam perangkat lunak DCC. Membuka bungkus yang lebih baik dapat banyak membantu dalam hal ini dengan memiliki sedikit jahitan.
sumber