DGL
https://delphigl.com/forum/

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

Autor:  Thmfrnk [ Mi Okt 20, 2010 11:05 ]
Betreff des Beitrags:  Mehrere Shader gleichzeitig

Moin,

also ich wollte grad zusätzlich zu meinem projections-shader einen weiteren Shader einbinden welcher sich nur um eine Globale Lichtquelle kümmern soll. Also einfach nur einen Pointlight Shader (aus dem wiki). Diese funktioniert auch. Doch irgendwie haut es nicht hin das ich beide gleichzeitig zum laufen bringe. Funktioniert immer nur der den ich zuletzt mit glUseProgram aufrufe..

Was mach ich da verkehrt? Müsse doch eigentlich funktionieren oder?

Grüße
thomas

Autor:  sharkman [ Mi Okt 20, 2010 11:17 ]
Betreff des Beitrags:  Re: Mehrere Shader gleichzeitig

Ähm, wie genau stellst du dir vor, dass zwei Shader gleichzeitig arbeiten(*)? Der eine setzt eine Pixelfarbe, und dann kommt der andere, und überschreibt sie wieder? Und was dann rauskommt hängt davon ab, in welcher Reihenfolge das intern ausgeführt wird? ;) Du könntest beides in einem Shader machen (ggf mit MRT), oder mit zwei Renderpasses, aber beides einzeln und trotzdem gleichzeitig wird schwer.

(*): Vielleicht isses möglich, aber dann weiß ich nix davon. glUseProgram setzt jedenfalls den aktuelen shader, und der vorherige ist dann nicht mehr gebunden. sonst würd glUseProgram(0) nicht den Shader wieder ausschalten.

oder meinst du Dual GPU?

Autor:  Thmfrnk [ Mi Okt 20, 2010 11:28 ]
Betreff des Beitrags:  Re: Mehrere Shader gleichzeitig

nun dann hab ich da was falsch verstanden. Ich dachte das ich da mehere Shader-Units habe wo ich mehrere Shader reinladen kann. Aber wenn ich deine Antwort so lese hast du recht.. so kanns nicht gehen. Nun die ganze Szene deshalb nochmal rendern wäre quatsch. Ich kann ja auch alles in einem Shader packen, doch der is jetzt schon ganz schön groß. Oder wird das intern automatisch auf die einzelnen Shader-Units aufgeteilt?

Autor:  Coolcat [ Mi Okt 20, 2010 11:55 ]
Betreff des Beitrags:  Re: Mehrere Shader gleichzeitig

Zitat:
Oder wird das intern automatisch auf die einzelnen Shader-Units aufgeteilt?

Eine aktuelle Grafikkarte hat so um die 128 bis 256 Shader-Units, ggf. auch mehr. D.h. das z.B. 128-256 Pixel (Fragmente) parallel (also gleichzeitig) berechnet werden. Vom Prinzip ist das wie bei CPU-Kernen....die Grafikkarte weißt ihnen automatisch Aufgaben zu.

Zitat:
Ich kann ja auch alles in einem Shader packen, doch der is jetzt schon ganz schön groß.

Wenn du dir glShaderSource genauer anschaust wirst du merken das du da eigentlich ein Array von Strings übergibst. Du kannst also einen Shader leicht in mehrere Dateien aufteilen und so diese Teile in einem anderen Shader ebenfalls benutzen. Wichtig ist halt das du jeweils nur eine main()-Funktion hast.

Autor:  mrtrain [ Mi Okt 20, 2010 12:14 ]
Betreff des Beitrags:  Re: Mehrere Shader gleichzeitig

Du kannst zur selben Zeit immer nur einen Fragmentshader und einen Vertexshader haben. (Geometryshader wahrscheinlich auch nur einen, aber da kenne ich mich nicht aus.) Trotzdem hast du auf deiner Grafikkarte (höchstwahrscheinlich) mehrere Shaderunits, also Rechenwerke, die den Shadercode ausführen. Das können durchaus mehrere hundert sein, weil sich die Rechenaufgaben sehr gut parallelisieren lassen. Der Fragmentshader wird ja schließlich einmal pro Pixel aufgerufen, also > 1 Mio. mal pro Frame (!, nicht Sekunde). Die Grafikkarte verteilt die Arbeit des Fragmentshaders gleichmäßig auf die Shaderunits. Irgendwo im Wiki haben wir auch eine schöne Grafik, die das veranschaulicht. Leider finde ich sie gerade nicht.

Du musst die beiden Shader also zu einem machen. :)

Autor:  Sellmann [ Mi Okt 20, 2010 14:52 ]
Betreff des Beitrags:  Re: Mehrere Shader gleichzeitig

wie sharkman schon angesprochen hat, kannst du auch mit mehreren Rendertargets arbeiten, dann kannst du erstmal das Licht für deine Pointlights mit dem einen Shader berechnen und speicherst die fertige Szene (nur das Licht, ohne Texturen oder sonst was) in eine Textur, danach machst du das gleiche mit deinen Projektoren und dem anderen Shader. Zum schluß brauchst du dann einen dritten shader, der beide Texturen bekommt, deine Szene zeichnet und die Lichtdaten aus den ersten beiden Texturen dazu rechnet.
Das kommt "deferred Rendering" schon sehr nahe. Nachteil bei dem Verfahren wäre, dass du die Geometrie zwei- bis dreimal zeichnen müsstest. Das wird aber beim richtigen deferred Rendering auch eingespart. Vielleicht würde dir das weiterhelfen um verschiedene Lichttypen mit einander zu kombinieren. Nebenbei bekäme man so auch noch andere Effekte schnell realisiert, andere allerdings (wie z.b. Alphatransparente Flächen) nur sehr schwer.

Autor:  Coolcat [ Mi Okt 20, 2010 17:56 ]
Betreff des Beitrags:  Re: Mehrere Shader gleichzeitig

Zitat:
andere allerdings (wie z.b. Alphatransparente Flächen) nur sehr schwer.

=> Inferred Lighting

Autor:  Sellmann [ Do Okt 21, 2010 08:16 ]
Betreff des Beitrags:  Re: Mehrere Shader gleichzeitig

@Coolcat:
Das Paper zu inferred Lighting hab ich schonmal durchgelesen, als du das vor einiger Zeit hier vorgestellt hast. Das fand ich schonmal sehr interessant. Aber ich denke ich werd in Zukunft erstmal lieber ohne transparente Flächen auskommen. Der Aufwand dafür ist in der Implementierung doch etwas viel, obwohl es doch schon verdammt reizt. Außerdem hab ich meine Bedenken, wie das mit Shadowmapping zusammen arbeiten soll.
Aber bevor ich solche Ansprüche stelle, versuch ich lieber mal endlich normales deffered Rendering auf die Beine zu stellen. Das schieb ich nun auch schon seit langer Zeit vor mir her, weil ich mir immer soviele Gedanken um Optimierungsarbeiten mache >_<" .

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