Apakah praktik yang baik untuk menggunakan semua unit tekstur yang tersedia?

9

Ketika menerapkan beberapa tekstur ke mesh, seperti untuk pemetaan-benjolan, saya biasanya mengikat tekstur ke beberapa unit tekstur tetap pertama, misalnya: difuse = unit 0, bump = unit 1, specular = unit 2, kemudian tetap menggunakan kembali masing-masing untuk masing-masing jala yang berbeda dengan tekstur yang berbeda. Tapi saya selalu bertanya-tanya mengapa glActiveTexturemendukung begitu banyak unit tekstur (dalam tautan sebelumnya, katanya setidaknya 80).

Jadi terpikir oleh saya bahwa satu cara yang mungkin untuk mengelola tekstur adalah dengan mengikat tekstur yang berbeda untuk setiap unit yang tersedia dan membiarkannya diaktifkan, hanya memperbarui indeks sampel seragam. Itu akan meningkatkan rendering perf dengan mengurangi jumlah switch tekstur. Jika Anda memiliki tekstur lebih sedikit daripada unit tekstur maks, Anda tidak perlu melepaskan ikatan tekstur.

Apakah ini praktik standar pada aplikasi OpenGL real-time (saya percaya ini juga berlaku untuk D3D)? Dan apakah ada implikasi kinerja yang tidak jelas dari mengambil pendekatan ini? Memori overhead mungkin?

Glampert
sumber

Jawaban:

11

Perangkat keras modern tidak benar-benar memiliki konsep titik pengikat tekstur yang diekspos oleh OpenGL. Sebagai gantinya, unit shader menggunakan deskriptor (yang hanya semacam penunjuk gemuk) yang berpotensi dapat mengatasi tekstur apa pun asalkan tetap ada di memori video. Inilah yang membuat hal-hal seperti tekstur tanpa ikatan menjadi mungkin. Jadi sejumlah besar "unit tekstur" yang tersedia dalam implementasi saat ini hanya mencoba untuk menggerakkan tangan bagian API yang sekarang tidak relevan ini.

Oleh karena itu, cara yang disarankan untuk menerapkan apa yang Anda coba lakukan (menghindari pengikatan kembali tekstur) adalah dengan menggunakan array tekstur , yang memungkinkan Anda untuk secara dinamis mengindeks ke dalam serangkaian tekstur dalam shader, selama mereka semua memiliki format dan ukuran yang sama. Presentasi ini berisi rincian lebih lanjut tentang ini dan teknik lain untuk mengurangi overhead driver ketika rendering dengan OpenGL modern: Mendekati Zero Driver Overhead

yurik
sumber
Saya sudah menonton presentasi itu sebelumnya, sangat bagus. Saya tidak tahu tentang apa yang Anda sebutkan di paragraf pertama, jadi terima kasih atas info itu!
glampert