14 Stimmen

GLSL Problem: Mehrere Shader in einem Programm

Ich muss irgendetwas mit Shadern missverstanden haben:

Ich dachte, da man mehrere Shader an ein Programm anhängen kann, könnte man auch einfach mehr als einen Fragment-Shader anhängen, als Beispiel: Eine Kisten-Textur, gerendert mit einer Farbmodulation y Brechung.

Aber offensichtlich ist dies nicht der Fall, da Sie nur eine Hauptfunktion pro Programm haben können.

  • Wie kann ich die Begrenzung der Hauptfunktion umgehen und eine beliebige dynamische Kombination mehrerer Fragment-Shader ermöglichen, die sich im selben Programm befinden und nacheinander aufgerufen werden?

25voto

kvark Punkte 5171

Sie können eine Reihe von Einstiegspunkten vordefiniert haben. Nehmen wir an, Sie haben eine begrenzte Anzahl von Effekten (diffus, spiegelnd, Umgebung, usw.). Keiner von ihnen wird höchstens einmal angewendet, so dass Sie nur einen Verwaltungs-Shader wie diesen erstellen müssen:

void apply_diffuse();
void apply_specular();
void apply_environment();

void main(){ ...
     apply_diffuse();
     apply_specular();
     apply_environment();
...}

Wenn es dann an der Zeit ist, das Shader-Programm zu verlinken, fügen Sie die entsprechenden Implementierungen als separate GLSL-Objekte hinzu. Einige Implementierungen können Dummies sein, wenn Sie den Effekt nicht wollen. Dieser Ansatz erfordert kein Parsen des Quelltextes und hat so gut wie keine Leistungseinbußen.

11voto

Puppy Punkte 141483

Das können Sie nicht. Dies ist bekannt als die kombinatorische Explosion von Shadern. Entweder Sie verwenden massive Shader - der so genannte Übershader-Ansatz - oder Sie können es erreichen, indem Sie mit dem Präprozessor herumspielen und die benötigten Shader im laufenden Betrieb generieren.

Neuere Versionen von GLSL sollten virtuelle Funktionen unterstützen, die einen modularen Aufbau wie im CPU-Code ermöglichen - HLSL5 tut dies.

2voto

Luca Punkte 11190

Das Problem sind die Begriffe, die Sie verwenden.

Lassen Sie mich ein Gleichnis anführen:

  • Eine ausführbar besteht aus verknüpften Objekte , Objekte werden aus dem Quellcode kompiliert.
  • A Shader-Programm besteht aus verknüpften Shader-Objekte Shader-Objekte werden aus dem Quellcode kompiliert.

Wie Sie sehen können, ist ein Shader-Programm die ausführbare Datei. Es verknüpft mehrere Shader-Objekte. Jedes Shader-Objekt wird aus einer Quelle kompiliert. Wie bei gewöhnlichen ausführbaren Programmen gibt es nur einen Haupteinstiegspunkt, der durch ein einziges Shader-Objekt definiert ist. Genau wie beim Kompilieren mit einer beliebigen Kompilier-Toolkette.

Die Lösung liegt in einem ausgewogenen Verhältnis zwischen der Kombination von Shader-Objekten und der Anzahl der Shader-Programme. Natürlich wäre es schön, nur ein Shader-Programm für das Rendering zu haben, aber das ist zu viel verlangt: Versuchen Sie, die Shader-Funktionen zu faktorisieren, dann kompilieren Sie diese Funktionen separat und verknüpfen Sie sie nach Bedarf.

Und Sie müssen einen Blick werfen auf OpenGL-Registrierung Ich denke, Sie werden in der Liste der Erweiterungen etwas Interessantes finden.

-2voto

ssube Punkte 44593

Sie können mehrere Programme in einem Shader haben, aber nicht andersherum.

Um mehrere Kombinationen zu erstellen, ist es am einfachsten, jeden größeren Teil als Fragment mit einem benannten Einstiegspunkt zu speichern und sie dann von einem anderen Programm aus einzubinden oder zur Laufzeit in einem einzigen Programm zu kombinieren, wobei sie in der gewünschten Reihenfolge aufgerufen werden. Das kann allerdings unübersichtlich werden, wenn es um Ein- und Ausgaben geht.

Sie können mehrere Durchgänge mit unterschiedlichen Effekten und Programmen in jedem Durchgang verwenden. Das ist mit zusätzlichem Aufwand verbunden, kann aber einfacher einzurichten sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X