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

  • »Wümpftlbrümpftl« ist der Autor dieses Themas

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

1

06.01.2009, 12:27

Shader kombinieren

Hi,
wie man auf unserer Seite lesen kann bin ich gerade dabei die meisten meiner Shader zu überarbeiten.
Momentan hab ich noch Unmengen von Shaderfiles obwohl ich eigentlich kaum etwas anderes mache als direktional Beleuchten.

Wie kommt es dazu?

Shading ohne Textur -> +2 (Mit Specular und ohne) -> 2
Dann Shading mit Textur -> +2 (Spec und NonSpec) -> 4
Dann Shading mit Textur und Bumpmap -> +2 (Spec und NonSpec) -> 6
(den Nicht-Textur und Bumpmap spar ich mir, der ist zu selten)

Und dann sollte es jeden noch einmal mit ShadowMapping, gefiltertes ShadowMapping und ohne ShadowMapping geben -> wären 6*3 also 18 Shader nur für einfache Beleuchtung; das mit dem Shadowmapping wurde mir zu dämlich, daher hab ich hier ein MultiPass-ShadowMapping kreiert (das Rendern der Schatten erfolgt in einen zusätzlichen Pass statt zusammen mit der normalen Beleuchtung), das aber leider nicht immer so gut funktioniert und natürlich nicht die selben Ergebnisse liefert wie die übliche Auswertung der ShadowMap bei der Beleuchtungsrechnung.

----------

Die Frage nun - Was kann ich dagegen tun? Wie kann ich Shader beliebig zusammensetzen und kombinieren?

Ich hab von StaticBranching gelesen - scheint eine akzeptable Lösung zu sein auf dem ersten Blick. Nur variiert ja auch der VertexInput und VertexOutput/PixelInput und den kann ich mit StaticBranching in meinen Augen nicht verändern.

2

06.01.2009, 12:53

wenns nur darum geht, shader code aus mehrern files in einen shader zu integrieren, könntest du das einfach beim laden mithilfe eines Präprozessor-ähnlichen moduls tun, und dann den manipulierten Quellcode für den Shader einsetzen - ist nur die frage, obs weniger aufwand ist, sowas zu bauen, wie die Files von Hand mit Copy&Paste zusammenzusetzen ;)

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

3

06.01.2009, 13:11

Naja, HLSL hat einen Präprozessor, von daher kostet das dich nix, sowas zu bauen. Das Problem ist halt, dass du intern die verschiedenen Zusammensetzungen trotzdem weiterhin hast.

Abhilfe könnte in der Tat Static Branching schaffen, vor allem, wenn du unter Shader Model 3.0 oder höher arbeitest, andernfalls müsstest du wohl im Vertex Shader etwas kreativ werden.

Grundsätzlich solltest du abwägen, wofür du neue Shader brauchst, und was du durch Konstanten als Koeffizienten bzw. Offsets regeln kannst. Wenn zusätzliche Berechnungen wie Specularity oder gar zusätzliche Textursamples im Spiel sind, solltest du definitiv Branchen oder Präprozessorschalter nutzen.

Bezüglich Vertex-Inputs würde ich mir keine zu großen Sorgen machen, auch wenn da der ein oder andere mal nicht gebraucht wird. Pixel-Inputs könnten schon eher relevant sein, aber auch dort solltest du erst testen, bevor du vorschnell optimierst.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

06.01.2009, 14:03

Du kannst auch mal nen blick auf den FragmentLinker werfen. Das is eine andre art das Problem anzugehen. Es bleibt dennoch ein Problem für das es bis jetzt noch keine wirklich gute Lösung gibt (zumindest is mir keine bekannt...)

http://msdn.microsoft.com/en-us/library/bb173412.aspx

  • »Wümpftlbrümpftl« ist der Autor dieses Themas

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

5

06.01.2009, 19:48

Ui danke für die vielen Antworten. :)
Dass HLSL einen Präprozessor hat ist mir noch nicht wirklich aufgefallen. :oops: Erweist sich aber als praktisch
Aber letztlich dachte ich mir schon, dass ich letztlich wohl einige unnötigere Shader wegrationalisieren muss... an viel Dopplung führt wohl kein Weg vorbei.

Für alle mit ähnlichen Problemen die über diesen Thread stolpern:
Ich hab hier noch etwas interessantes gefunden zu dem Thema: http://www.talula.demon.co.uk/hlsl_fragm…_fragments.html

Werbeanzeige