Dass if Abfragen durch CMP realisiert werden können ist mir schon klar - der Vorteil eines bedingten Sprunges ist ja gerade eben, dass wirklich nur ein Teil des Codes ausgeführt werden muss - und nicht etwa sämtliche Schleifenteile berechnet werden und das Endergebnis dann schlussendlich daraus "zusammengewurschtelt" wird.
Zur Zeit ist es ja auch nicht so dringend, weil hochkomplexe Shader ohnehin noch kein Thema sind. Ob ich jetzt übrigens verschiedene Sourceteile vor dem Senden zusammenkopiere, oder OpenGL Programmteile "zusammenlinken" lasse, kommt ziemlich sicher auch performancemäßig auf's selbe hinaus, GLSL nimmt es einem in dieser Hinsicht halt ab einen eigenen Zwischenkompiler wie CG oder fxPascal zu verwenden (wohingegen der ARB-Assembler wahrscheinlich schneller kompiliert werden kann, was einen "Linker" ohnehin überflüssig macht, zumal man die Programmsources ja nicht gerade während der Renderschleife senden wird).
Per Definition unterstützt GLSL aber meines Wissens auch echte Schleifen (die sich den Endwert einer Schleifen z.B. aus einer Textur holen könnten) - und das ist meines Erachtens mit heutigen Karten einfach technisch nicht machbar. Dass empfohlen wird, kurze Shader zu verwenden und unterschiedliche Bedingungen zu vermeiden, liegt ja eben an dieser technischen "Unzulänglichkeit".
Das soll jetzt keine Kritik an GLSL sein, im Gegenteil, es ist für OpenGL ja auch wichtig, zukunftsweisende Anforderungen zu stellen, und nicht nur mit der Unterstützung diverser Features nachzuziehen.
Als praktische Anwendung fiele mir z.B. auch die Möglichkeit ein, echt dreidimensionale Objekte über ein einziges Polygon mittels 3D-Texturen zeichnen zu lassen - Falls ein Punkt außerhalb der Bounding Box (in diesem Fall Rect) liegt, verlässt man den Shader sofort, ansonsten geht man den Richtungsvektor Bildschirmpixel->Quader entlang, bis man das das erste Texel findet, das dargestellt werden soll (von mir aus über den Alphawert definiert) und stellt dessen Farbe dann im Pixel dar - sogar den Z-Wert könnte man korrekt zurückschreiben. Wenn man kein entsprechendes Texel findet, wird das Pixel halt ebenfalls nicht gezeichnet.
Auf diese weise könnte man mit einem einzigen Polygon und einem gar nicht so umständlichen Shader hochkomplexe Objekte realisieren - zwar mit einem (wahrscheinlich) ziemlich langsamen Shader, aber immer noch um's mehrfache schneller als heutige Techniken "echte" Voxel darzustellen (also nicht nur gefakte 2D-Oberflächen, wie sie schon in Comanche realisiert wurden).
|