Funkcje udostępniania w wielu modułach cieniujących

10

Proste pytanie:

Czy w GLSL istnieje sposób na dzielenie funkcji między wieloma modułami cieniującymi, czy też muszę zdefiniować wszystkie funkcje w każdym module cieniującym, który ich potrzebuje?

TravisG
źródło

Odpowiedzi:

12

Możesz zdefiniować niektóre funkcje w pliku nagłówkowym i #włącz je do modułu cieniującego. Różni się nieco od C / C ++ pod tym względem, że umieszczasz ciała swoich funkcji w nagłówkach, nie tylko ich prototypy (ponieważ shadery nie mają koncepcji oddzielnej kompilacji i łączenia), ale poza tym jest to tak jak C / C ++ nagłówki.

Nathan Reed
źródło
2
Zwróć uwagę, że #include nie jest faktycznie obsługiwany w żadnej wersji GLSL do wersji 3.30, z wyjątkiem rozszerzenia, które nie jest powszechnie dostępne. Jednak każda przyzwoita struktura modułu cieniującego powinna rozszerzyć język, aby zapewnić tę funkcję (w tym Cg).
Sean Middleditch,
7

Jeśli #include nie jest dostępny, użyłbyś argumentów glShaderSource do określenia współużytkowanych rzeczy. Przykład:

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
źródło