DGL
https://delphigl.com/forum/

Mehrere Shader
https://delphigl.com/forum/viewtopic.php?f=20&t=11240
Seite 1 von 1

Autor:  mathias [ Do Sep 25, 2014 17:02 ]
Betreff des Beitrags:  Mehrere Shader

Ich habe bei meinem Beispiel 2 Shader geladen.

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.

Dateianhänge:
Zwischenablage-1.jpg
Zwischenablage-1.jpg [ 17.38 KiB | 16449-mal betrachtet ]

Autor:  end [ Do Sep 25, 2014 17:04 ]
Betreff des Beitrags:  Re: Mehrere Shader

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.

Autor:  mathias [ Do Sep 25, 2014 17:23 ]
Betreff des Beitrags:  Re: Mehrere Shader

Zitat:
Auch beim Invertieren bei dir wären die beiden Shader zu trennen,

Genau dies habe ich ja gemacht.

Zitat:
da der ansonsten notwendige If-Check bei X-tausend Pixelshaderaufrufen durchaus X-tausend mal Performance kostet.

Dann hat es also Sinn, wen man Texturen verwendet eine extra-Shader zu schreiben.

Bis jetzt verwende ich einen Universal-Shader, mit vielen IFs.

Hier ein Auschnitt:

Code:
  1. void main()
  2. {
  3.   if ( ifTexturen )
  4.   {
  5.     OutColor = texture2D( myTextureSampler0, UV );
  6.   }
  7.   else if ( ifMultiTexturen )
  8.   {
  9.     OutColor = (texture2D( myTextureSampler0, UV ) + texture2D( myTextureSampler1, UV )) * 0.5;
  10.   }
  11.   else if ( ifColorVertex )
  12.   {
  13.     OutColor = Color;
  14.   }
  15.   else
  16.   {
  17.     OutColor = VecColor;
  18.   }
  19.   float cdummy = OutColor.a;
  20.  
  21.  
  22.   if ( ifLight )
  23.   {
  24.     OutColor = OutColor * (diffuse(LightPosition) + specular(LightPosition));
  25.   }
  26.   OutColor.a = cdummy;
  27. }  

Autor:  OpenglerF [ Do Sep 25, 2014 18:03 ]
Betreff des Beitrags:  Re: Mehrere Shader

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.

Autor:  Vinz [ Do Sep 25, 2014 18:05 ]
Betreff des Beitrags:  Re: Mehrere Shader

Solche ifs kosten tierisch Performance!
Empfehle für komplexere Shader den Präprozessor.
z.B.
#if(textures == 1)
code
#endif

Der code wird hier nur in den Shader compiliert, wenn textures als 1 definiert ist.

Autor:  mathias [ Do Sep 25, 2014 21:24 ]
Betreff des Beitrags:  Re: Mehrere Shader

Zitat:
Solche ifs kosten tierisch Performance!

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.

Autor:  Vinz [ Do Sep 25, 2014 23:42 ]
Betreff des Beitrags:  Re: Mehrere Shader

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.

Autor:  Flash [ Do Sep 25, 2014 23:45 ]
Betreff des Beitrags:  Re: Mehrere Shader

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.

Autor:  OpenglerF [ Fr Sep 26, 2014 13:56 ]
Betreff des Beitrags:  Re: Mehrere Shader

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.

Autor:  mathias [ So Sep 28, 2014 19:13 ]
Betreff des Beitrags:  Re: Mehrere Shader

Zitat:
Hab es letztens ausführlich getestet, und ein if(...) war in vielen Fällen genau so teuer wie ein sin(...) oder ein exp(...).

Das war früher auf einem 8088 anderst, Rechenoperationen kosteten sehr viel Leistung.

Autor:  Bergmann89 [ Mo Sep 29, 2014 16:23 ]
Betreff des Beitrags:  Re: Mehrere Shader

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

MfG Bergmann.

Autor:  mathias [ Fr Nov 07, 2014 20:31 ]
Betreff des Beitrags:  Re: Mehrere Shader

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.

Autor:  mathias [ Mi Nov 12, 2014 17:21 ]
Betreff des Beitrags:  Re: Mehrere Shader

Wieviel Shader kann man auf einmal in die Grafikkarte schreiben ?

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/