Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 17:47

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Mehrere Shader
BeitragVerfasst: Do Sep 25, 2014 17:02 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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 | 16117-mal betrachtet ]

_________________
OpenGL
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mehrere Shader
BeitragVerfasst: Do Sep 25, 2014 17:04 
Offline
Compliance Officer
Benutzeravatar

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mehrere Shader
BeitragVerfasst: Do Sep 25, 2014 17:23 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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. }  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mehrere Shader
BeitragVerfasst: Do Sep 25, 2014 18:03 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mehrere Shader
BeitragVerfasst: Do Sep 25, 2014 18:05 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
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.

_________________
"Pixel, ich bin dein Vater."
-Darf Shader


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mehrere Shader
BeitragVerfasst: Do Sep 25, 2014 21:24 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mehrere Shader
BeitragVerfasst: Do Sep 25, 2014 23:42 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
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.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mehrere Shader
BeitragVerfasst: Do Sep 25, 2014 23:45 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mehrere Shader
BeitragVerfasst: Fr Sep 26, 2014 13:56 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mehrere Shader
BeitragVerfasst: So Sep 28, 2014 19:13 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mehrere Shader
BeitragVerfasst: Mo Sep 29, 2014 16:23 
Offline
DGL Member
Benutzeravatar

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

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mehrere Shader
BeitragVerfasst: Fr Nov 07, 2014 20:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mehrere Shader
BeitragVerfasst: Mi Nov 12, 2014 17:21 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wieviel Shader kann man auf einmal in die Grafikkarte schreiben ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.068s | 19 Queries | GZIP : On ]