# Mehrere Shader in einem Program



## Runtime (14. Feb 2011)

Hi Leuts,

hab wieder einmal eine JOGL Frage: Ich habe mehrere Shader, die alle unabhängig voneinander sind und eine main besitzen. Die sollen alle an ein Shaderprogramm attacht werden, wie bringe ich die alle hinein, ohne einen Fehler zu bekommen? Obwohl ich dachte, dass das oft gebraucht wird hab ich trotzdem nicht im Google gefunden... ???:L Geht das überhaupt? Wenn nein, gibt es dazu ein passendes Workaround? (Für die ganz pingeligen: Wie sieht es aus? )

Gruss
Cyrill


----------



## Marco13 (14. Feb 2011)

Hm. Wie würdest du den konkret zu verwendenden Shader denn dann auswählen? Afaik kann man in einem Programm nur EIN mal die 2-3 verschiedenen Shader-Arten zusammenstöpseln, und muss den Wechsel dazwischen dann mit glUseProgram machen. Wenn es einfacher geht, habe ich mir bisher einen Haufen unnötiger Arbeit gemacht....


----------



## Runtime (14. Feb 2011)

Danke für die schnelle Antwort . Die Shader sind Vertex- oder Fragmetshader, die als Effekte dienen sollen. Die sollen dann nacheinander auf das gezeichnete einwirken. Dass jeder Shadertyp nur einmal vorkommen kann, hab ich nicht gewusst, das macht die Sache noch komplizierter . Kann man eigtl auch mehrere Programme aufs mal benutzten, oder geht das auch irgendwie der Reihe nach, aber immer auf dem selben gezeichneten Objekt?

Edit: Frage nicht richtig verstanden. Es soll nicht nur ein einzelner Shader ausgeführt werden, sondern alle.


----------



## Marco13 (14. Feb 2011)

Wo-ho... Sooo der shader-experte bin ich auch nicht. Ich habe immer den "pragmatisch-simplen" Ansatz genommen: Vertex+Fragment in ein Program und gut ist. 
Soll das so was wie "Deferred Shading" werden?
In wenigen Minuten müßte dieser Thread von Google-Index erfasst worden sein, dann bekommt Fancy eine autmatische Notification-Mail und sagt auch noch was dazu.


----------



## Runtime (14. Feb 2011)

Nö, eigentlich nicht, es sollen nur mehrere Effekte erzielt werden, damit es dann so aussieht.


----------



## Marco13 (14. Feb 2011)

Und... soll das ganze in mehreren Stufen z.B. auf ein PBO angewendet werden, oder direkt auf den Bildschirm (letzteres stelle ich mir wegen der fehlenden Möglichkeit, vorhandene Daten zu lesen, schwierig vor) ...? Ich habe keine so genaue Vorstellung, wie sowas komplett in Shadern ablaufen kann (oder sollte)... Mal schauen ob Fancy da etwas konkreter werden kann


----------



## Runtime (14. Feb 2011)

Am liebsten direkt, aber wenns nicht anders geht, dann auf ein PBO.
Edit: Vllt sollte ich noch erwähnen, dass alles 2D ist.


----------



## Guest2 (15. Feb 2011)

Moin,

die kurze Antwort: Zu einem Zeitpunkt geht auch immer nur genau ein Shaderprogramm (maximal mit vertex, tessellation control, tessellation evaluation, geometry, fragment). Wie Marco schon schrieb, ausgewählt wird das eine aktive Shaderprogramm mit glUseProgram, welches eben genau ein handle auf ein gültiges Shaderprogramm erwartet.

Die lange Antwort: Worum geht’s überhaupt? 
In einem der letzten Threads zum Thema schriebst Du, das Du eine GMA X3100 nutzt und damit evtl. bei OpenGL 1.5 festgenagelt bist. Bei 1.5 geht Shader aber nur per Extension. Da steht dann ARB, Cg oder GLSL zur Auswahl. Bei ARB gabs noch gar keine main (meinst Du also vermutlich auch nicht). Ob bei Cg das gleichzeitige linken von verschiedenen Shadern des gleichen Typs möglich ist, kann ich nicht sagen (glaube es aber nicht)(obrige kurze Antwort ist also nur gültig, wenn kein Cg eingesetzt wird)  . Und das GLSL von Deiner Grafikkarte unterstützt wird, würde mich wundern.

Also, auf welcher Shadersprache bezieht sich Deine Frage?
(Und bei weiteren Fragen: Bei GLSL welche Version? GLSL 1.20 ist dramatisch anders als GLSL 4.10 )  

Grundsätzlich ist das, was Du willst, auch nicht so einfach. Z.B. ein Fragmentshader zum Weichzeichnen würde die Farbinformationen der Nachbarpixel benötigen. Zu dem Zeitpunkt, an dem der Fragmentshader läuft, existiert die Farbinformation der Nachbarpixel aber möglicherweise noch gar nicht. Du brauchst also zwangsweise mehrere Renderläufe. Jeden Filter als jeweils eigenen Renderpass anzulegen, ist aber auch nur bedingt sinnvoll, weil das schnell langsam werden kann.
Dir bleibt also vermutlich nicht viel anders übrig, als Dir für jeden darzustellenden Effect ein separates Shaderprogramm auszudenken, welches die einzelnen Filter kombiniert (eben soweit möglich), bzw. auf verschiedene Renderphasen verteilt (eben soweit nötig). Eine seperate main brauchst Du aber für jeden Effect (Kombination aus Filtern). Etwas zu schreiben, bei dem man pauschal Effect X, Y und Z aktivieren kann, wird also zumindest nicht einfach. 

(Möglich ist das schon, z.B. lassen sich die Filter auch in Funktionen packen, welche dann separat als Fragmentshader geladen werden. Beim linken wird dann diese "Lib" und eine dynamisch generierte main verwendet. Das müsste man dann noch cachen, damit z.B. das Shaderprogramm für Effect (Filterkombination) XYZ nur einmal erzeugt werden muss.

Ein anderer Ansatz wäre das PBO "zwischenzuspeichern" und nur Veränderungen durch einen separaten Renderlauf auf das PBO zu realisieren. Ähnlich wie man es mit einem BufferedImage bei reinem Java machen würde. Dann müsste nicht für jedes Frame das komplette "Bild" wieder aufgebaut werden. Geht aber natürlich nur, wenn sich immer relativ wenig ändert.

Die Möglichkeiten sind also vielfältig, nur mit pauschal ist bei OpenGL, fast nie was sinnvoll zu machen )) 



Marco13 hat gesagt.:


> In wenigen Minuten müßte dieser Thread von Google-Index erfasst worden sein, dann bekommt Fancy eine autmatische Notification-Mail und sagt auch noch was dazu.



LOL 

Gruß,
Fancy


----------



## Runtime (15. Feb 2011)

Danke 
Schade wenn ichs nicht so realisieren kann, wie ich es mir vorgestellt hab. Ich bin mal davon ausgegangen, dass meine GPU GLSL unterstützt, da ich das GL2-Objekt zum zeichnen bekomme, welches die GLSL lade/compile Methoden besitzt. Da aber sowieso vieles dagegen spricht, muss ich mir etwas anderes ausdenken oder weglassen.
Edit:
Wie handhabt Flash das eigentlich? In Flash kann ich mehrere Bitmap Effects und Anti-Aliasing brauchen.


----------

