GLSL, semua dalam satu atau banyak program shader?

17

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?

stjepano
sumber
2
lihat stackoverflow.com/questions/4649801/…
Patryk Czachurski
Ini adalah dikotomi yang salah, bahwa Anda harus memilih satu atau beberapa pendekatan lain untuk mengelola shader. Dalam lima belas tahun di industri ini, saya tidak pernah bekerja pada sebuah proyek di mana kami berpegang teguh pada kedua ekstrem, tetapi selalu mencapai keseimbangan antara dua pendekatan untuk mengelola shader, menggunakan masing-masing di mana masuk akal untuk melakukannya.
Trevor Powell

Jawaban:

12

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:

  • Kemungkinan lebih cepat / lebih optimal
  • Lakukan apa yang Anda inginkan
  • Dapat melakukan hal-hal aneh dan custom dengan mudah

Cons:

  • Mudah lepas kendali, terutama ketika jumlah fitur bertambah
  • Mungkin lebih banyak pekerjaan, kecuali jika Anda memiliki sedikit shader

Uber-shader

Pro:

  • Semuanya ada di satu tempat
  • Lebih ramah artis (menggunakan fitur A dengan fitur X untuk pertama kalinya tidak harus memerlukan waktu coder)

Cons:

  • Waktu kompilasi shader lebih lama
  • Hasil yang kurang optimal (terutama jika seragam digunakan untuk menghidupkan / mematikan fitur)
  • Mungkin lebih sulit untuk di-debug / dioptimalkan
Jari Komppa
sumber
Uber-shaderdalam 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 #ifdefs yang akan diaktifkan untuk berbagai bahan.
brigadir
2
Saya akan menambahkan bahwa pro lain dari uber-shader adalah mengganti shader memiliki biaya dalam hal kinerja, jadi jika Anda beralih lebih jarang, Anda mungkin dapat meningkatkan kinerja.
Jherico