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

))
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