Mit glUseProgram(Program_IDx) wechsle ich beim rendern zwischen den beiden Shadern. Momentan der einzige Unterschied in den Shadern ist, der einte inventiert die Farbe im Fragment-Shader.
Wird dies in der Praxis auch so gemacht ?
Z.B. bei einem Ego-Shooter, ein Shader für die Gebäude, etc. und einer für die Hud-Darstellung.
Registriert: So Aug 08, 2010 08:37 Beiträge: 460
Programmiersprache: C / C++ / Lua
Shader sollen möglichst gut zugeschnitten auf eine Aufgabe sein, daher ja. Auch beim Invertieren bei dir wären die beiden Shader zu trennen, da der ansonsten notwendige If-Check bei X-tausend Pixelshaderaufrufen durchaus X-tausend mal Performance kostet.
_________________ offizieller DGL Compliance Beauftragter Never run a changing system! (oder so)
Verzweigungen können bedingt durch die Art, wie die GPU arbeitet, relativ teuer werden. Besonders auf älteren Karten und besonders und auch besonders, wenn die Verzweigung nicht lokale Beziehungen hat sondern im extrem Fall komplett zufällig ist. Im Extremfall bedeutet das, dass der Shader mindest so lange langsam ist wie alle Zweige zusammen.
Es gibt das Konzept von sogenannten Übershadern, die mehrere Dinge auf einmal erledigen. Der Hintergedanke davon ist, dass Shaderwechsel ebenfalls eine sehr teure Angelegenheit sind. In GLSL 4.0 gibt es auch noch Subroutines, die im Prinzip globale Verzweigungen sind und etwas effizienter sein sollen. Wie effizient bzw. wie viel effizienter das in der Praxis genau ist, weiß ich aber auch nicht.
Zum Beispiel das Invertieren würde ich wahrscheinlich mit einem Shader machen. Die Verzweigung lässt sich vollständig in ein "Conditional Move" Konstrukt umwandeln, bzw. die unterschiedlichen Zweige sind sehr kurz.
Nvidia gibt hier auf Seite 48 an, dass maximal ~300K/s Shaderwechsel möglich sein sollen. Für dein Mandelbrot würde es natürlich reichen.
Das hätte ich nicht gedacht, ein einfaches IF sollte für einen Computer keine Probleme darstellen. Aber wen ich so lese, sieht die bei eine GPU anders aus.
Hat mich auch überrascht. Hab es letztens ausführlich getestet, und ein if(...) war in vielen Fällen genau so teuer wie ein sin(...) oder ein exp(...). Wobei die Argumente von sin und exp auch stark von der Vertexkoordinate und somit von der GPU-Einheit abhingen und im if nur ein Vergleich von zwei floats stand. Auf der CPU ist das ja ganz anders.
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Zuletzt geändert von Vinz am Do Sep 25, 2014 23:48, insgesamt 1-mal geändert.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7804 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Liegt vermutlich daran, dass die Branch Prediction und Vorberechnung bei Ifs schlechter wird. D.h. die Kerne können nicht parallel Sachen berechnen und nur noch die Ergebnisse mergen - erst muss das if ausgewertet werden. Wenn man mittels PreCompiler Flags den Code zusammenbaut sieht das anders aus. Die Ifs sind weg, und die C/G PU Bauer haben ne Menge optimierungen in den Kernen versteckt die dann alle zum tragen kommen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Auf der CPU ist eine Verzweigung übrigens auch nicht umsonst. Es ist sehr schwer, ein allgemeines Urteil zu fällen. Tatsächlich, wenn man bedenkt, das meistens eine gute Approximation der Funktionen reichen würde und das eine moderne CPU ähnlich der GPU in Form von SIMD mehrere Werte auf einmal berechnen "könnte", wird auf der CPU eine Verzweigung möglicherweise auch teuer kommen.
Aber das hängt ja auch immer davon ab, wie viel zum Beispiel der Branch Predictor zu tun hat und so weiter. Bei meiner bisherigen persönlichen Erfahrung der Performanceoptimierung auf der CPU ans Maximum, war das auch eine der kritischsten Punkte. Der Trend geht auf jeden Fall auf der CPU in die Richtung, dass Verzweigungen nicht besser werden.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
ich werf da mal unseren glslPreCompiler in den Raum, den haben wir genau für solche sachen gebaut. Natürlich gehen auch einfache #ifdef's aber das wird bei komplexen Shadern (meiner Meinung nach) schnell unübersichtlich...
Momentan bin ich am modifizieren meiner Bibliothek für meine OpenGL-Objecte.
Jetzt hat jedes Object einen eigenen Shader, mit anderen Worten mein Programm hat ca. 20 verschiedene Objecte, somit sind 20 Shader geladen. Momentan sind alle Shader noch gleich. Einen Geschwindigkeits-Unterschied konnte ich bei meiner Animation nicht festellen. Das Ziel: Für Objecte welche die gleiche Darstellung haben sollten den gleichen Shader bekommen.
Somit wird es am Anfang 4 verschiedene Shader haben.
- Einfarbig mit Licht. - Mehrfarbig mit eine ColorVertex mit Licht. - Texturen und Licht. - Texturen ohne Licht ( Für ein Hintergrund-Bild ).
Somit könnte ich auf IFs verzichten. Später werden vielleicht noch Geometrie Shader einbezogen.
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.