Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

31.05.2014, 02:14

D3D11/HLSL: Mehrere Pixelshader hintereinander

Hallo Leute,

ich arbeite in letzter Zeit sehr viel mit Direct3D11 und bin jetzt an einem Punkt angekommen wo mein Pixelshader immer länger und länger wird und man viele Teile doppelt schreiben muss (z.B. für Objekte mit und ohne Normalmapping) und hab jetzt überlegt ob es möglich ist in einem Pixelshader z.B. nur den Texturwert zu bestimmen und diesen Pixel dann als Eingabe in einem weiteren Pixelshader zu verwenden?

Leider hat google keine passende Antwort dazu geben (weder in Deutsch noch in Englisch), wäre über eine Antwort dankbar ;)
"Wer Angst hat, dass ihm seine Ideen geklaut werden, der scheint nicht viele zu haben. "

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

31.05.2014, 07:41

Geht nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

31.05.2014, 09:17

Alles klar, danke
"Wer Angst hat, dass ihm seine Ideen geklaut werden, der scheint nicht viele zu haben. "

4

31.05.2014, 14:08

Natürlich geht das.

Der erste PS zeichnet in ein RT, der zweite bekommt diesen als Textur und rendert dann entweder die Szene neu und adressiert durch die Image-Space coordinates des aktuellen Pixels die RT-Texture, oder du nutzt gleich nen ganzen G-Buffer (z.B. Albedo + Depth) und somit eine Art Deferred Rendering.

Wenn du mehrere passes vermeiden möchtest, bietet HLSL auch includes an.

Mit ein paar Umwegen ist auch ein Uber-shader nützlich.

Es ist aber schon sehr selten, dass ein Shadercode so lang wird, dass man ihn kaum mehr lesen kann - schließlich gibt es funktionen auf in HLSL ;)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

5

31.05.2014, 16:05

Deferred Rendering hatte ich auch schonmal im Blick, war aber nicht 100%ig was ich suche.

Funktionen hatte ich iwie gar nicht auf dem Schirm, peinlich peinlich :dash:
"Wer Angst hat, dass ihm seine Ideen geklaut werden, der scheint nicht viele zu haben. "

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

01.06.2014, 07:51

Natürlich geht das.
Aber eben nicht so, wie er sich das gewünscht hätte. Das geht leider eben noch immer nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

02.06.2014, 09:18

Ist Dynamic Shader Linkage nicht für genau sowas da? Eine Schnittstelle für Beleuchtung in den Shader schreiben und zur Laufzeit die Version mit oder ohne Normal Mapping binden, je nachdem ob es fürs Modell nötig ist?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

02.06.2014, 10:07

Ist Dynamic Shader Linkage nicht für genau sowas da?

Richtig, die Frage ist, wie effizient es ist... ;)

9

03.06.2014, 08:33

Für Effizienz ist Trennung sowieso der Killer … Dice haben für Battlefield 3 alle Einzelschritte des Deferred Renderers in einen *wirklich* gigantischen Über-Shader gepackt und in einem Draw Call ausgeführt weil allein das Shader-Setup für 3 oder 4 Einzelschritte viel teurer gewesen wäre. Die Shader haben die Ergebnisse der Einzelschritte im Group-Shared Memory gehalten und sind dann einfach gekreist bis keine Arbeit mehr übrig war.

Werbeanzeige