Atlas tekstur vs array-tekstur: seberapa berbeda mereka ditangani oleh CPU dan GPU dan bagaimana itu mempengaruhi kinerja?


10

Unity 5.4 (saat ini dalam versi beta), akan menghadirkan fitur yang banyak ditunggu-tunggu (sejak 2013) yaitu array-textures - sama sia -sianya dengan OpenGL's ArrayTexture . Namun, setelah melakukan beberapa bacaan tentang array-tekstur dan atlas tekstur, saya masih belum bisa memahami perbedaan teknis pada penggunaannya oleh CPU dan GPU.

Jadi, untuk lebih spesifik, saya ingin meminta penjelasan tentang perbedaan utama antara bagaimana atlas tekstur dan array tekstur ditangani oleh CPU dan GPU dan, yang paling penting, bagaimana perbedaan tersebut dapat berdampak pada kinerja dan penanganan memori (misalnya bagaimana susunan tekstur bisa lebih banyak kinerja daripada tekstur atlas, dll).

Jika rincian teknis tentang implementasi Unity kurang karena ketidakamanan sumber daya yang tertutup, saya akan cukup senang dengan jawaban mengenai OpenGL.s ArrayTexture.


Saya tidak terkejut Anda tidak menemukan perbandingan teknis, karena keduanya tergantung pada implementasi (lebih untuk array).
keajaiban

Anda akan mengalami kesulitan mendapatkan informasi tentang bagaimana internal dari fungsi mesin Unity, karena merupakan sumber tertutup, kotak hitam. Satu-satunya hal yang dapat Anda lakukan, adalah profil setiap kasus dan dapatkan sendiri perbandingan penggunaan cpu dan gpu. Untuk memahami cara kerjanya, diperlukan insinyur Unity untuk masuk, atau kode sumbernya dibuka atau bocor.
jgallant

@ Jon Cukup Adil, tapi sebenarnya saya lebih tertarik pada jawaban mesin-agnostik. Jika bervariasi, saya dapat memperbarui pertanyaan untuk dibicarakan, misalnya, OpenGL's ArrayTexture: opengl.org/wiki/Array_Texture
ASteer

Jawaban:


11

Seperti disebutkan dalam komentar di atas, kinerja akan tergantung pada implementasi, perangkat keras khusus Anda, dan apa yang Anda coba lakukan dengan tekstur, sehingga satu-satunya jawaban yang dapat diandalkan adalah untuk membuat profil setiap alternatif.

Ada beberapa perbedaan dalam hal bagaimana Anda menggunakan setiap opsi, yang akan berlaku secara konsisten:

Satu perbedaan besar adalah bahwa, untuk tekstur array, masing-masing tekstur diperlakukan secara terpisah untuk keperluan seperti membungkus koordinat tekstur atau memetakan.

Ini menghindari masalah umum dengan atlas tekstur di mana kita perlu menambahkan padding antara carikan tekstur yang berdekatan untuk menjaga sampel di tepi mereka dari pendarahan bersama, terutama di tingkat mip yang lebih dalam.

Ini juga berarti jika Anda ingin memoles tekstur, Anda dapat menggunakan perangkat keras pengambilan sampel tekstur untuk melakukannya seperti halnya dengan tekstur vanila. Dengan atlas, kita biasanya harus melakukan matematika ubin di shader fragmen kami, karena sampler hanya membungkus / cermin / klem / batas tekstur koordinat seluruh atlas, bukan ubin individu di dalamnya.

Batasan utama dengan tekstur array adalah bahwa mereka memerlukan semua tekstur penyusunnya untuk memiliki resolusi dan jumlah level mip yang sama. Jika Anda mencoba menggabungkan tekstur dengan kebutuhan resolusi yang sangat berbeda (misalnya, menyimpan petak medan yang LoDnya jatuh dengan jarak dalam tekstur virtual ), Anda mungkin menginginkan fleksibilitas atlas.


Terima kasih, itulah tepatnya yang saya cari. Maksud saya, bukan jawaban tentang tepatnya mana yang lebih cepat kurang intensif memori - karena tentu saja ini tergantung pada implementasi. Namun, saya yakin bahwa beberapa petunjuk tentang fungsi setiap kasus dapat berguna untuk memahami skenario terbaik dan terburuk mereka. Jawaban Anda memang membantu saya dalam hal itu.
ASteer

Kerugian lain dari tekstur array: dibatasi oleh GL_MAX_ARRAY_TEXTURE_LAYERS. Pada GPU semi-modern saya, ini adalah 2048, jadi jika Anda ingin banyak tekstur kecil, batas ini mungkin terlalu rendah.
jwd
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.