Fungsi berbagi di banyak shader

10

Pertanyaan sederhana:

Di GLSL, apakah ada cara untuk berbagi fungsi di beberapa shader, atau apakah saya harus mendefinisikan semua fungsi di setiap shader yang membutuhkannya?

TravisG
sumber

Jawaban:

12

Anda dapat mendefinisikan beberapa fungsi dalam file header dan # memasukkannya ke shader Anda. Ini sedikit berbeda dari C / C ++ karena Anda akan menempatkan tubuh fungsi Anda di header, bukan hanya prototipe mereka (karena shader tidak memiliki konsep kompilasi & penautan terpisah), tetapi selain itu hanya seperti C / C ++ header.

Nathan Reed
sumber
2
Perhatikan setidaknya #include tidak benar-benar didukung dalam versi GLSL apa pun hingga 3.30, kecuali melalui ekstensi yang tidak tersedia secara universal. Kerangka kerja shader yang layak harus memperluas bahasa untuk menyediakan fitur ini, meskipun (termasuk Cg).
Sean Middleditch
7

Jika #include tidak tersedia, Anda akan menggunakan argumen glShaderSource untuk menentukan hal-hal yang dibagikan. Contoh:

char *sharedcode = "...shared code here...";
char *fs1 = "...fragment shader 1...";
char *fs2 = "...fragment shader 2...";

char *awesomeeffect1[] = {sharedcode, fs1};
char *awesomeeffect2[] = {sharedcode, fs2};

glShaderSource (shader1, 2, awesomeeffect1, NULL);
glShaderSource (shader2, 2, awesomeeffect2, NULL);
Maximus Minimus
sumber