Funktionen für mehrere Shader freigeben

10

Einfache Frage:

Gibt es in GLSL eine Möglichkeit, Funktionen für mehrere Shader freizugeben, oder muss ich alle Funktionen in jedem Shader definieren, der sie benötigt?

TravisG
quelle

Antworten:

12

Sie können einige Funktionen in einer Header-Datei definieren und # in Ihren Shader aufnehmen. Es unterscheidet sich ein wenig von C / C ++ darin, dass Sie die Körper Ihrer Funktionen in die Header einfügen würden, nicht nur ihre Prototypen (da Shader kein Konzept für separates Kompilieren und Verknüpfen haben), sondern ansonsten wie C / C ++ Überschriften.

Nathan Reed
quelle
2
Beachten Sie zumindest, dass #include in keiner Version von GLSL bis 3.30 tatsächlich unterstützt wird, außer über eine Erweiterung, die nicht allgemein verfügbar ist. Jedes anständige Shader-Framework sollte jedoch die Sprache erweitern, um diese Funktion bereitzustellen (einschließlich CG).
Sean Middleditch
7

Wenn #include nicht verfügbar ist, würden Sie die Argumente von glShaderSource verwenden, um das gemeinsam genutzte Material anzugeben. Beispiel:

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
quelle