Haruskah saya mendistribusikan shader dalam bentuk yang dikompilasi atau dalam teks biasa?

13

Memiliki aplikasi yang menggunakan shader yang telah ditulis dalam GLSL, apa strategi terbaik untuk distribusi di dunia nyata dan untuk desktop dan seluler?

Saya bertujuan untuk mendistribusikan ini dalam bentuk biner atau sebagai teks serial, saya ingin saran yang bagus tentang ini.

pengguna827992
sumber

Jawaban:

15

Alasan utama untuk menggunakan binary shaders adalah jika kompilasi text shaders terlalu besar dari beban kerja untuk perangkat target Anda. Biner GLSL biner tidak memiliki format standar, jadi Anda akan membutuhkan yang berbeda untuk setiap GPU / driver yang Anda rencanakan untuk didukung. Saya akan merekomendasikan Anda mendistribusikan shader dalam bentuk sumber dan kemudian pada jalankan cache pertama kali ke dalam bentuk biner dan kemudian memuat dari sana. Kemudian lagi saya akan menguji terlebih dahulu jika Anda benar-benar memiliki hambatan kinerja di sana untuk membenarkan menggunakan binari sama sekali.

Satu hal yang perlu dipertimbangkan adalah juga pengoptimal shader teks offline yang dapat memiliki efek hebat dengan kompiler shader seluler jelek.

Tapio
sumber
Saya benar-benar akan terkejut jika Anda dapat menemukan perangkat mana pun di mana kompilasi shader menjadi hambatan. Jumlah kode, bahkan dalam shader besar, adalah jumlah kode yang sepele dalam hal kompilasi.
edA-qa mort-ora-y
1
Mesin-mesin besar di luar sana biasanya mengkompilasi shader secara offline, dan / atau menyimpannya saat pertama kali dijalankan, seperti yang disarankan Tapio. Mungkin ada jumlah kode per shader yang sepele, tetapi Anda dapat memiliki banyak kode .
Laurent Couvidou
jadi saya harus membeli kartu video ATI acak dan satu lagi secara acak dari Nvidia, mengkompilasi shaders saya dan hanya mendistribusikan versi yang dikompilasi? Bagaimana saya bisa memeriksa pada saat runtime apa merek kartu video yang ditargetkan? Ada sesuatu yang bisa diandalkan untuk itu?
user827992
1
@ user827992 Format biner mungkin berbeda untuk generasi GPU / driver yang berbeda walaupun vendornya sama. Dan jangan lupa ada banyak GPU Intel di luar sana, apalagi yang mobile, seperti Qualcomm dan PowerVR. Jadi sekali lagi: Saya sarankan Anda tidak mendistribusikan shader yang dikompilasi, melainkan menyimpannya saat dijalankan pertama kali pada perangkat pengguna. Mengenai deteksi GPU, Anda dapat mencoba mem-parsing string GL_VENDOR, GL_VERSION, dan GL_RENDERER dari glGetString (), tetapi formatnya bervariasi dari vendor ke vendor.
Tapio