Stencil Shadow Volumes & Kernschatten
-
Hi,
weiß jemand wie man am besten mit dem Stencil Buffer und Shadow Volumes Kernschatten mit mehreren Lichtquellen darstellt.
Ich habe es bisher nur geschafft, dass jeder Schatten gleich hell aussieht, auch bei Überlagerung von Schatten zweier Lichtquellen.
Ich müsste irgendwie die Schatten in den Stencil Buffer einzeln reinschreiben und dannn übereinanderlegen, aber ich kann den Stencil Buffer nicht speichern...
Aber da gibt's doch bestimmt noch eine bessere Möglichkeit Halb/Kernschatten darzustellen.
Ich hoffe mir kann jemand weiterhelfen.
MfG
Peter
-
Du solltest die Szene in mehreren Durchgängen (Passes) rendern:
1. Ambient-Pass: alle Objekte bekommen eine gewisse Grundhelligkeit; der Z-Buffer wird gefüllt.
2. Für jede Lichtquelle:
- Stencil-Buffer leeren
- Schattenvolumen rendern => Stencil-Buffer enthält Schattenmaske
- Mit Alpha-Blending (beide Faktoren ONE) nur den Diffuse-/Specular-Anteil hinzuaddieren; den Stencil-Test so einstellen, dass nur die Pixel gerendert werden, die nicht im Schatten dieser Lichtquelle liegen. Z-Write kannst du ausschalten, weil der Z-Buffer schon im ersten Durchgang gefüllt wurde, das spart Bandbreite.
-
Vielen Dank für die Antwort.
Ich benutze eine andere Variante die Schatten darzustellen.
1. gesamte Szene "normal" rendern
2. Für jede Lichtquelle:
- Stencil Buffer leeren
- Schattenobjekte rendern mit Stenciltest
- Schatten mit glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) auf den Bildschirm zeichnen, wo StencilWert ungleich 0Ist es mit dieser Variante auch möglich Kernschatten darzustellen oder geht es nur mit deiner geschilderten Variante?
-
gesamte Szene "normal" rendern
Schatten auf den Bildschirm zeichnen, wo StencilWert ungleich 0das eigentliche konzept von "schatten" ist ja, dass das licht erst gar nicht beim pixel ankommt.
die lichtinformation nachtraeglich durch verdunklung wieder rauszurechnen erscheint mir ziemlich unsinnig - erst recht bei mehreren lichtquellen unterschiedlicher farbe.
fuer stilisierte schatten zb im rahmen von cartoon-rendering koennte es ganz gut funktionieren.
-
hellihjb schrieb:
gesamte Szene "normal" rendern
Schatten auf den Bildschirm zeichnen, wo StencilWert ungleich 0das eigentliche konzept von "schatten" ist ja, dass das licht erst gar nicht beim pixel ankommt.
die lichtinformation nachtraeglich durch verdunklung wieder rauszurechnen erscheint mir ziemlich unsinnig - erst recht bei mehreren lichtquellen unterschiedlicher farbe.
fuer stilisierte schatten zb im rahmen von cartoon-rendering koennte es ganz gut funktionieren.Viele Tutorials und Beispiele nutzen aber diese Variante (z.B. NeHe) und sie hat den Vorteil, dass die Szene nur einmal gerendert werden muss. Das dies weniger realistisch aussieht ist nachvollziehbar, aber für mich weniger wichtig.
-
dass jeder Schatten gleich hell aussieht, auch bei Überlagerung von Schatten zweier Lichtquellen.
wenn du die pixel jedes schattenbereichs "ein bischen alphablendest", sind bereiche mit zwei schatten auch nur halb so hell.
sie hat den Vorteil, dass die Szene nur einmal gerendert werden muss
das heisst aber auch, dass fuer alle pixel die beleuchtung aller lichtquellen berechnet wird (hier gibt's zusaetzlich ein potentielles saturierungsproblem)
je nach anzahl der lichtquellen und komplexitaet des beleuchtungsmodells werden ebenfalls mehrere passes noetig.
der vermeindliche "vorteil" sollte situationsbedingt abgeschaetzt werden...
-
Können die aktuellen Grafikkarten eigentlich Pixelshadercode "überspringen" für Pixel die den Z-Test schon nicht bestehen? In dem Fall wäre das "Multi Pass" verfahren u.U. garnicht so schlimm, da man sich wenigstens spart Lichtberechnungen für Teile der Geometrie anzustellen die sowieso verdeckt sind...
-
Können Grafikkarten Pixelshadercode "überspringen" für Pixel die den Z-Test nicht bestehen?
ja, der zbuffer-test kommt als erstes in der pixel-pipeline - deswegen propagiert man ja front-back-sortierung der objekte.
durch hierarchischen zbuffer werden auch ganze polygone verworfen.
unangenehm bei multi-pass ist allerdings das alpha-blending.
-
hustbaer schrieb:
Können die aktuellen Grafikkarten eigentlich Pixelshadercode "überspringen" für Pixel die den Z-Test schon nicht bestehen?
Wie hellihjb schon geschrieben hat, ist das in der Regel der Fall.
Aber wenn du in das oDepth-Register schreibst und dadurch im Pixel-Shader den Z-Wert eines Pixels veränderst, muss der Shader erst komplett ausgeführt werden, bevor entschieden werden kann, ob der Pixel sichtbar ist oder nicht.
Ich wollte das nur der Vollständigkeit halber anmerken
In der Praxis wird man oDepth wohl eher selten setzen. Vielleicht bei solchen Techniken wie Parallax Mapping.