Di Direct3D, multipass shaders mudah digunakan karena Anda benar-benar dapat mendefinisikan lintasan dalam suatu program. Di OpenGL, tampaknya sedikit lebih rumit karena dimungkinkan untuk memberikan program shader sebanyak mungkin vertex, geometri, dan fragmen shader yang Anda inginkan.
Contoh populer dari multipass shader adalah toon shader. Satu pass melakukan efek cel-shading yang sebenarnya dan yang lainnya menciptakan garis besar. Jika saya memiliki dua vertex shaders, "cel.vert" dan "outline.vert", dan dua fragmen shaders, "cel.frag" dan "outline.frag" (mirip dengan cara Anda melakukannya di HLSL), bagaimana saya bisa menggabungkan mereka untuk membuat shader toon penuh?
Saya tidak ingin Anda mengatakan bahwa geometri shader dapat digunakan untuk ini karena saya hanya ingin tahu teori di balik multipass shaders GLSL;)
Jawaban:
Tidak ada "teori" di balik multipass. Tidak ada "multipass shaders". Multipass sangat sederhana: Anda menggambar objek dengan satu program. Kemudian Anda menggambar objek dengan program yang berbeda .
Anda dapat menggunakan hal-hal D3DX seperti file FX untuk menyembunyikan pass tambahan ini. Tapi mereka tetap bekerja seperti itu. OpenGL tidak memiliki tempat persembunyian untuk itu.
sumber
Render objek dengan shader sel, dan kemudian render objek dengan shader garis besar.
sumber
Di OpenGL 4.0 ada subrutin seragam . Ini memungkinkan Anda untuk mendefinisikan fungsi yang dapat ditukar saat runtime dengan overhead yang sangat sedikit. Jadi, Anda dapat membuat 1 fungsi untuk setiap pass. Juga 1 fungsi untuk setiap jenis shader.
Ada tutorial di sini .
Untuk versi OpenGL yang lebih tua, taruhan terbaik Anda adalah memiliki banyak shader yang berbeda dan bertukar di antaranya. Kalau tidak, Anda bisa menambahkan nilai-nilai bersama yang Anda kalikan dengan seragam yaitu 0,0 atau 1,0 untuk menyalakan atau mematikannya. Kalau tidak kondisional jika pernyataan dapat digunakan tetapi OpenGL akan mengeksekusi semua hasil yang mungkin setiap eksekusi / lulus jadi pastikan mereka tidak terlalu berat.
sumber
Ada beberapa orang yang tahu banyak tentang GLSL, jadi saya harap mereka datang meluruskan, tetapi berdasarkan apa yang saya lihat, Anda harus dapat, dalam shader fragmen Anda, melakukan sesuatu seperti ini (pseudocode, saya Akan menyerahkan GLSL yang sebenarnya kepada orang-orang yang mengenalnya lebih baik):
Dengan menggunakan
if
s dengan cara ini, Anda mendapatkan sesuatu seperti beberapa lintasan. Apakah itu masuk akal?Sunting: Juga, semoga pertanyaan tentang SO ini membantu menghilangkan beberapa kesalahpahaman.
sumber