[OpenGL] mehrere GLSL-Shader in einer Datei

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
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

Beitrag von Schrompf »

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.
Benutzeravatar
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

Beitrag von xq »

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.
Benutzeravatar
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

Beitrag von Schrompf »

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!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
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

Beitrag von xq »

Gerne, kein Problem!
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Jammer-Thread

Beitrag von dot »

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.
Benutzeravatar
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

Beitrag von Schrompf »

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 :-(
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [OpenGL] mehrere GLSL-Shader in einer Datei

Beitrag von dot »

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 :-(
Naja, mit #define geht das schon... ;)
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [OpenGL] mehrere GLSL-Shader in einer Datei

Beitrag von dot »

Schau dir zu dem Input/Output Problem vielleicht auch mal Interface Blocks an.
Benutzeravatar
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

Beitrag von Schrompf »

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.
Antworten