[OpenGL] mehrere GLSL-Shader in einer Datei
- Schrompf
- Moderator
- Beiträge: 4855
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
[OpenGL] mehrere GLSL-Shader in einer Datei
Mich nervt gerade, dass man bei GLSL-Shadern keine Eintrittsfunktion definieren kann. Damit muss ich mein gesamtes PostProcessing-Konzept umschreiben und die Shader dafür in x kleine Dateien mit endlosen Code-Verdopplungen aufteilen.
Zuletzt geändert von Schrompf am 03.12.2014, 11:06, insgesamt 1-mal geändert.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- xq
- Establishment
- Beiträge: 1581
- Registriert: 07.10.2012, 14:56
- Alter Benutzername: MasterQ32
- Echter Name: Felix Queißner
- Wohnort: Stuttgart & Region
- Kontaktdaten:
Re: Jammer-Thread
Warum das? Du kannst doch einfach das hier machen (imho not even a hack):
Code: Alles auswählen
// Solves your problem.
#define sobel main
void blur()
{
}
void sobel()
{
}
void kekse()
{
}
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…
Programmiert viel in Zig und nervt Leute damit.
Programmiert viel in Zig und nervt Leute damit.
- Schrompf
- Moderator
- Beiträge: 4855
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
Re: Jammer-Thread
Hmm... verdammt, das ist ne clevere Idee. Da ich eh alles durch nen Präprozessor jage, ist das nichtmal ein Aufwand. Es darf nur niemand eine Variable "main" nennen :-) Aber Ausschlusslisten dieser Art gibt's eh schon, wenn man OpenGL und DirectX gleichzeitig abdecken will.
[Edit] Ach nee, geht nicht. Ich muss ja immernoch die Ein- und Ausgabe-Parameter parsen und Code dafür generieren, weil OpenGL seine Inputs weder in Strukturen verpackt noch als Parameter der main() akzeptiert. Aber Danke für die schnelle Antwort!
[Edit] Ach nee, geht nicht. Ich muss ja immernoch die Ein- und Ausgabe-Parameter parsen und Code dafür generieren, weil OpenGL seine Inputs weder in Strukturen verpackt noch als Parameter der main() akzeptiert. Aber Danke für die schnelle Antwort!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- xq
- Establishment
- Beiträge: 1581
- Registriert: 07.10.2012, 14:56
- Alter Benutzername: MasterQ32
- Echter Name: Felix Queißner
- Wohnort: Stuttgart & Region
- Kontaktdaten:
Re: Jammer-Thread
Gerne, kein Problem!
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…
Programmiert viel in Zig und nervt Leute damit.
Programmiert viel in Zig und nervt Leute damit.
- dot
- Establishment
- Beiträge: 1734
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: Jammer-Thread
Nur als Hinweis: GLSL Shader werden zu Programmen zusammengelinked, d.h. du kannst GLSL Fetzen als separate Module compilen und so z.B. mehrere Vertex Shader Fragmente mit den Definitionen verschiedenster Funktionen erzeugen und die am Ende alle zu einem Program attachen und das linken. Es darf pro Stage lediglich nur eine main() geben. So kannst du Shader dynamisch zusammenbauen, z.B. machst du dir einen Hauptshader, dessen main() die generelle Stuktur vorgibt und die dann eine Reihe von benutzerdefinierten Funktionen aufruft, deren Definition je nach Shadervariante aus separaten, benutzerdefinierten Modulen kommt. In der Praxis sollte dies im Vergleich zum händischen Zusammenbauen des Code in ein einzelnes Modul afaik keinen Overhead erzeugen. Evtl. genügt es zur Lösung des Input/Output Problems, einfach alle potentiell benötigten Attribute zu definieren und das wegoptimieren der von einer bestimmten Variante nicht benötigten dem Shader Compiler zu überlassen. Mit Direct3D 11.2 wurde diese Funktionalität (nachdem der Shader Fragment Linker aus D3D9 damals plötzlich verschwunden war), wieder eingebaut.
- Schrompf
- Moderator
- Beiträge: 4855
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
Re: [OpenGL] mehrere GLSL-Shader in einer Datei
Wenn ich Dich richtig verstanden habe, wäre das dann eine weitere Methode, Quelltextfragmente aus verschiedenen Quellen zusammen zu schrauben. Ich bräuchte hier ja eigentlich das Gegenteil: selektiv Teile des Codes lahmzulegen, wenn sie nicht referenziert werden.
Wenn alle Input Layouts ein Subset eines großen gemeinsamen Inputs sind, könnte man es vielleicht wirklich dem GLSL-Optimizer überlassen. Damit könnte man dann aber nur z.B. mehrere VertexShader im selben Quelltext haben, nicht aber einen Vertex- und einen Fragment-Shader. Letzteres mit der Wiederverwendung von Konstanten und der Vertex-Ausgabe als Pixel-Eingabe war mein Liebling :-(
Wenn alle Input Layouts ein Subset eines großen gemeinsamen Inputs sind, könnte man es vielleicht wirklich dem GLSL-Optimizer überlassen. Damit könnte man dann aber nur z.B. mehrere VertexShader im selben Quelltext haben, nicht aber einen Vertex- und einen Fragment-Shader. Letzteres mit der Wiederverwendung von Konstanten und der Vertex-Ausgabe als Pixel-Eingabe war mein Liebling :-(
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- dot
- Establishment
- Beiträge: 1734
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: [OpenGL] mehrere GLSL-Shader in einer Datei
Naja, mit #define geht das schon... ;)Schrompf hat geschrieben:Damit könnte man dann aber nur z.B. mehrere VertexShader im selben Quelltext haben, nicht aber einen Vertex- und einen Fragment-Shader. Letzteres mit der Wiederverwendung von Konstanten und der Vertex-Ausgabe als Pixel-Eingabe war mein Liebling :-(
- dot
- Establishment
- Beiträge: 1734
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: [OpenGL] mehrere GLSL-Shader in einer Datei
Schau dir zu dem Input/Output Problem vielleicht auch mal Interface Blocks an.
- Schrompf
- Moderator
- Beiträge: 4855
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
Re: [OpenGL] mehrere GLSL-Shader in einer Datei
Danke, hatte ich mir schon angeschaut. Sieht eigentlich gut aus, ist aber leider nicht so einfach mit DirectX vereinbar. Bei DirectX übergibt man dann eine Instanz dieses Blockes als Parameter an die main() oder return'd einen aus der main(). Die Mitglieder werden mit instanz.Name angesprochen. Bei OpenGL sind es global definierte Blöcke, deren Namen man beim Adressieren nicht mit angeben darf. Beides zusammen bekomme ich mit meinem Präprozessor und schlichten Parser nicht mehr abgedeckt. Da müsste eine semantische Analyse drüber laufen und die einzelnen Referenzen finden.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.