2010-02-26 11 views

Antwort

19

Sie können dies tun, z.B. indem Funktionsaufrufe vom Haupteinstiegspunkt zu Funktionen ausgeführt werden, die in den verschiedenen Shader-Objekten implementiert sind.

main() { 
    callToShaderObject1() 
    callToShaderObject2() 
} 

jede dieser callToShaderObject Funktionen können in verschiedenen Shader-Objekte leben, aber alle Objekte im selben Programm gebunden und verknüpft werden, bevor sie verwendet werden kann.

+0

Warum sollten Sie das aus Gründen der Kuriosität tun, anstatt einfach alle Funktionen im Fragment-Shader in Frage zu stellen? Ist das so, dass Code mit anderen Shader-Programmen geteilt werden kann, ohne dass Duplikationen nötig sind? –

+0

@Nick: Ich habe es selbst nicht benutzt gesehen. Ich war überrascht, als ich zum ersten Mal die Spezifikation über die Idee las, Shader-Programme aus Shader-Objekten zu erstellen - daher weiß ich, dass Sie es können. Es wurde aus dem Standard-Kompiliermodell ... – Bahbar

+2

Update: Ich habe gesehen, dass dies jetzt im Einsatz ist, während ich moded Minecraft Shader studiere. In diesem Fall war es sehr nützlich, da jeder Shader viele Optionen hat, die ein- und ausgeschaltet werden können, wobei verschiedene Effekte in Verbindung mit verschiedenen anderen funktionieren. In einem solchen Szenario und wenn mehrere Autoren beteiligt sind, wird es viel nützlicher, Funktionen in separate Dateien zu unterteilen. –

4

Sie können nicht gleichzeitig ausgeführt werden, aber Sie können unterschiedliche Shader für verschiedene Geometrien verwenden oder in mehreren Durchgängen mit unterschiedlichen Shadern rendern.

+1

Würde das also ein anderes Programm erfordern? Also ein anderes Programm für jeden Pass? Wie in, ich könnte einen Vertex-und Fragment-Shader auf einem Programm (was ist ein Durchgang?) Und dann einen Vertex-und Fragment-Shader auf einem anderen Programm (der zweite Durchgang?)? Kann ich glUseProgram() einfach ändern, wenn mir danach ist? Also rende ich im Wesentlichen eine Szene zweimal ...? – Harry

+1

Genau richtig. Genau wie bei einem Multi-Pass-Render in einer festen Pipeline, aber anstatt die openGL-Einstellungen zwischen den Pässen zu ändern, laden Sie verschiedene Programme. –

Verwandte Themen