Saya melakukan beberapa demo 3D menggunakan OpenGL dan saya perhatikan bahwa GLSL agak "terbatas" (atau hanya saya?). Pokoknya saya punya banyak jenis bahan. Beberapa bahan memiliki warna ambient dan difus, beberapa bahan memiliki peta oklusi ambien, beberapa memiliki peta specular dan peta benjolan dll.
Apakah lebih baik mendukung semuanya dalam satu pasangan shader vertex / fragmen atau lebih baik membuat banyak shader vertex / fragmen dan memilihnya berdasarkan bahan yang dipilih saat ini? Apa strategi shader yang biasa di OpenGL atau D3D?
Jawaban:
Jawabannya adalah, itu agak tergantung.
Pada dasarnya ada dua aliran pemikiran; shader kecil, optimal untuk semuanya dan kamp uber-shader.
Shader kecil hanya itu; lakukan satu hal, dan lakukan dengan baik. Uber-shaders mengontrol fungsi mereka pada saat runtime melalui seragam, atau mengkompilasi ke dalam sekelompok shader yang berbeda melalui macro preprocessor (dan / atau sumber shader yang dihasilkan).
Solusi optimal mungkin bukan keduanya, tetapi semacam hibrida. Mungkin beberapa uber-shader atau uber-shader dikombinasikan dengan shader khusus untuk beberapa kasus.
Shader kecil
Pro:
Cons:
Uber-shader
Pro:
Cons:
sumber
Uber-shader
dalam representasi ini bukan hal yang baik :) Saya akan mengusulkan untuk menulis manajer shader yang baik berdasarkan predefine - jadi kita akan memiliki kode uber-shader dengan banyak#ifdef
s yang akan diaktifkan untuk berbagai bahan.