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?
Ä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.
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?
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.
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
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.
Zuletzt geändert von mrtrain am Mi Aug 31, 2011 20:55, insgesamt 1-mal geändert.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
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.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
@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 >_<" .
Mitglieder in diesem Forum: 0 Mitglieder und 23 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.