Apakah saya perlu mengubah seragam atau atribut saat mengganti program shader?

11

Rendering adegan biasanya melibatkan lebih dari satu program shader yang, dalam kasus saya, semua menggunakan atribut yang sama dan berbagi setidaknya beberapa seragam. Agar mereka berfungsi dengan baik, saat ini saya bermain aman, artinya saya mengubah atribut dan mendapatkan lokasi seragam yang sesuai setiap kali saya beralih di antara program shader. Jadi pada dasarnya beberapa kali dalam setiap frame, yang mungkin bukan pendekatan terbaik.

Jadi, apakah perlu (secara umum) untuk mengubah atribut dan seragam setelah beralih program shader? Dan mengapa?

Jika demikian, apakah ada cara untuk melakukan ini sekali pada awal program dan tidak perlu menyentuhnya lagi (kecuali untuk menetapkan nilai seragam)?

Nero
sumber

Jawaban:

12

Anda tidak perlu mengubah atribut, asalkan Anda memastikan bahwa lokasinya tetap sama di kedua shader. (Biasanya menggunakan layout(location = X)sintaks di GLSL, tetapi juga bisa dilakukan dengan glBindAttribLocationjika mantan tidak tersedia.)

Seragam, bagaimanapun, adalah bagian dari keadaan Obyek Shader, dan karenanya perlu diatur setidaknya satu kali untuk setiap shader. Salah satu cara untuk meminimalkan biaya ini adalah dengan menggunakan Uniform Buffer Object , yang akan berisi semua nilai seragam Anda dan kemudian dapat diikat ke shader dengan satu panggilan.

yurik
sumber
Pada tautan UBO Anda: "Terakhir, mereka dapat digunakan untuk berbagi informasi antar program yang berbeda. Jadi, memodifikasi buffer tunggal dapat secara efektif memungkinkan seragam di berbagai program diperbarui."
Zouch