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

06.07.2010, 15:39

Shader Design

Hallo,

ich habe mehrere Shader für eine Anwendung programmiert, die nach Bedarf eingesetzt werden können. Das Problem ist jetzt, dass die meisten verschiedene Daten benötigen. Wie mache ich das jetzt designtechnisch am klügsten, dass da nicht das totale Chaos entsteht? Übergebe ich einfach alle Daten immer an die Shader, mache die ganzen Berechnungen da und ignoriere nicht benötigte Parameter oder mache ich in meiner Anwendung so ein flag-Konstrukt, wo man dann je nach Shader manuell auswählt, welche Berechnungen durchgeführt werden oder was ganz anderes?

Als konkretes Beispiel:

Ich approximiere in meinen Shadern eine neue Shadow-Map aus 3 vorher echt berechneten Shadow-Maps. Man gibt dazu die maps und 4 2D-Winkel als Parameter mit, berechnet mit Relief-Mapping neue Ansichten und kombiniert die Ergebnisse mit verschiedenen Funktionen (deshalb ein Shader pro Funktion). Bei einer simplen Min/Max-Funktion brauche ich z.B. keine zusätzlichen Daten, aber wenn ich baryzentrische Koordinaten benutzen will, muss ich die irgendwo berechnen.

2

06.07.2010, 16:56

Stichwort Effect Pools, falls du DX verwendest.
fka tm

3

06.07.2010, 23:57

Nein, bin leider mit OGL unterwegs...

4

08.07.2010, 04:23

Vor dem gleichen Problem habe ich vor kurzem auch gestanden und gegrübelt. Ein ganz einfacher Tipp den ich für dich hätte: Geh nochmal durch was du eigentlich machen willst, und dann schau wie viele Shader du tatsächlich nur brauchst! Ich habe bei mir ganz einfach eine Pipeline Klasse, welche, wie der Name schon sagt, die Pipeline durch eine neue erstezt. Diese kann 1 oder mehrere Programme beinhalten. Ich habe nun eine Pipeline fürs Wasser, eine für Animierte Modelle, eine für Statische Modelle, und eine für das Terrain. Die Wasser-Pipeline kann man über das Device setzen und auch verschiedene Techniken auswählen, beispielsweise Refractionmap erzeugen, Reflactionmap ...

Wenn da mal ein Modell gezeichnet wird, das grad keine Specularmap benutzt, ist das auch nicht so tragisch.

Im prinziep ist es ähnlich dem Effect-Framework von DX, nur etwas einfacher und für OpenGL ;)

Bei mir funktioniert das ganze recht gut und im chaos hat das auch noch nicht geendet.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

5

08.07.2010, 14:30

Sorry, nochmal für langsam denkende Menschen, denen den ganzen Tach lang die Sonne aufs Hirn scheint.

Eigentlich ist es bei mir relativ einfach, weil ich eigentlich immer nur einen Shader und damit auch ein Programm brauche. Nur repräsentiert jeder Shader eine andere Art von Funktion, mit der Ergebnisse verknüpft werden.
Wenn ich das richtig sehe, lädst du also mit so einer Pipeline erstmal alles, was gebraucht werden könnte (z.B. alles was mit Wasser zu tun hat) und suchst dir dann aus, was du wirklich brauchst?!

Falls ja, kann ich mir das aber im Prinzip sparen bzw. sowieso alles in eine Pipeline packen, weil ja alles zu dem Konzept "neue Ansicht einer Shadow-Map approximieren" gehört. Es ist wohl einfach so, dass da ein winziger Rechenüberhang entsteht ;)

Werbeanzeige

Ähnliche Themen