Anbringen von mehreren Shadern des gleichen Typs in einem einzigen OpenGL-Programm?
Beim Lesen der OpenGL-specs, die ich bemerkt habe, im ganzen, dass es erwähnt, dass Sie können mehrere Shader, die von der gleichen Art in einem einzigen Programm (d.h. mehr als ein GL_VERTEX_SHADER befestigt mit glAttachShader). Speziell im OpenGL 4.2, §2.11.3 -, Programm-Objekte: "Mehrere shader-Objekte des gleichen Typs angebracht werden kann, um eine einzelne Programm-Objekt...".
OpenGL-pipeline-Programme und Unterprogramme könnte hier zutreffen, aber diese war definiert werden, bevor diese existierte (in der Tat geht es zurück in der 2.1 spec, §2.15.2) also ich bin auf der Suche nach einem pre-GL4 Beispiel dieser Idee. Wenn ich nicht einige einfache Tests habe ich festgestellt, dass darunter mehr als ein void main()
verursacht Verknüpfungsfehler. Ist jemand bekannt, der ein praktische Beispiel, bei dem dieses verwendet wird?
- Ich bin mir nicht sicher, ob das funktioniert, aber ich denke, man kann Shader mit den üblichen Funktionen (aber keine main-Funktion), so können Sie diese in das porgram und können auf diese Funktionen zugreifen, die von der main-shader. Auf diese Weise brauchen Sie nur zu kompilieren, die diese Funktionen einmal.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie stellen Sie gängige Funktionen in separaten shader. Dann kompilieren Sie es nur einmal, und link in mehreren Programmen.
Es ist ähnlich, wie Sie kompilieren Sie die cpp-Dateien nur einmal zu static oder shared library. Dann verknüpfen Sie diese Bibliothek in mehrere ausführbare Programme und sparen so Kompilierung.
Lassen Sie uns sagen, Sie haben komplexe Beleuchtungs-Funktion:
Dann für jeden shader, wo Sie wollen, um diese Funktionalität zu verwenden, dies zu tun:
Kompilieren Sie danach separat common shader und Ihrer Haupt-shader. Aber die Zusammenstellung der gängigen shader nur einmal.
Für jeden shader der Bühne muss es nur ein main entry-Funktion.
Können Sie deklarieren eine Funktion, die in einem shader-Quelle und nicht definieren, und verknüpfen die Zeit, können Sie eine definition aus einem anderen shader source (sehr ähnlich zu c/c++ - Verknüpfung).
Beispiel:
generate_txcoord.glsl:
vertex.glsl: