Shadow Volumes mit beliebiger Geometrie
-
Und warum kann ich nun die ZFUNC nicht umdrehen?
-
Man man, teilweise komm ich da nicht mehr mit.
Die Methode, die Stefan erwähnt hat hab ich mir auch überlegt ( Quad an jeder Dreieckskante einfügen). Aber das kostet ja unglaublich viel Füllrate. Aber da es nicht anderst zu gehen scheint werd ich das wohl machen müssen...das mit dem zusätzlichen Vektor als RGB-Wert hab ich net verstanden.
Ich werde dann einen zwieten Vertexbuffer erstellen. Alle Polygone werden da reingemacht, aber keine Vertices werden von mehreren benutz um das Problem mit den interpolierten Normalen zu umgehen. Und jedes Polygon bekommt noch 7 weitere hintendran, 6 an den Seiten und eine Rückseite. Richtig?
Zum Schatten zeichnen: Ich rendere die Farbe auch nur da, wo der Stencilbuffer gesetzt ist. Ich halte das für vorteilhaft da dann keine Glanzpunkte im Schatten entstehen könnte. Der Nachteil ist halt dass es ziemlich schwarz im Schatten wird wenn nur ein Licht da ist
Aber jetzt muss ich noch eine blöde Frage stellen, ich hab nämlich schon Schwierigkeiten mit dem Stencil-Buffer Zeugs (nach Carmack's Reverse):
Also erstmal setze ich den Stencilbuffer auf 1.
Dann rendere ich die Volumes backface, bei Z-Fail wird der Stencil Dekrementiert. Dann Frontface und entsprechend inkrementiert.
Das Ergebnis ist...äh falsch. Die Objekte sind auch auf der Lichtseite beschattet und man hat das Gefühl, man sieht das ganze Shadow-Volume in die Wand reingehen.
Ich glaube, ich habe die Shadowvolumes falsch erstellt. Habe versucht, die Vertices, die nicht vom Licht weggeschoben werden ein wenig rückwärts entlang ihrer Normalen zu verschieben dass das Volume ins Modell reingeht. Hat aber auch nicht so toll was gebracht.Ist an meiner Methode schon was falsch oder ist das so OK?
-
TGGC schrieb:
Und warum kann ich nun die ZFUNC nicht umdrehen?
kannst du schon machen, aber wenn ein volume die nearclippingplane schneidet, wird auf jedenfall ein teil davon falsch aussehen. (ich glaube du meinst die stencilfunc oder?)
stell dir vor die nearclippingplane wird von den frontfaces geschnitten, dann wird ein teil der frontfaces gezeichnet und ein teil weggeclipped, der teil der weggeclipped ist kann aber das volume quasi nicht mehr schliessen, deswegen ist es offen und dort wird dann alles beschattet... natürlich passiert das nur wenn die volumes die nearclippingplane schneiden, ansonsten könntest du prüfen ob man komplett innerhalb des volumes ist oder außerhalb und davon abhängig dann die stencilfunc setzen.rapso->greets();
-
@1: Also degenerierte Faces brauchen ja nun mal überhaupt keine Fillrate, und selbst diese "degenerierten" Quads brauchen sicher nicht viel.
@rapso: Nee, ich mein schon genau was ich schreib. Dann kann das SV nie den Schatten auf die near clipping plane werfen, höchstens die far.
-
Hi,
@0x0..1
hier ist das Sample aus dem SDK mit Carmacks Reverse Algorithmus erweitert. Ist zwar ohne Shader, aber der Teil zum Rendenr ist ja identisch.http://www.zfx.info/Images/OtherStuff/ShadowVolume.cpp
Dass vorne Schatten ist kann daran liegen, dass es Z-Fighting gibt. Der Volume ist dort schon an derselben Stelle wie der Occluder, und daher muss man mit Z-Bias rendern. Wenn Du allerdings kein Flimmern siehst, also nicht mal hell und mal Schatten wenn Du Dich bewegst, dann ist es ein anderer Fehler.
Ciao,
StefanEDIT:
Wie TGGC schon sagt verbrauchen die Quads nahezu keine Fillrate da nur einige wenige ausgezogen sind. Sie verbrauchen aber sehr wohl Zeit um den Shader zu durchlaufen.
-
Stefan Zerbst schrieb:
Wie TGGC schon sagt verbrauchen die Quads nahezu keine Fillrate da nur einige wenige ausgezogen sind. Sie verbrauchen aber sehr wohl Zeit um den Shader zu durchlaufen.
Aber wen interessiert das, wenn man ehh durch die Fillrate limitiert ist.
-
Danke für die Tipps und Quellcodes! Ich komm heute leider nicht mehr dazu, werd aber morgen versuchen es zum Laufen zu bekommen.
Diese z-Fights der Schatten hatte ich am Anfang auch, bis ich dann den z-bias eingeschaltet hab. Anscheinend war ich mal auf dem richtigen weg
Melde mich mit großer Wahrscheinlichkeit morgen Abend wieder.
-
Ich werd wahnsinnig, seit WOCHEN mach ich jetzt an diesen Schatten rum. Und ich dachte nach den dot3-Bumpmaps kann's nicht mehr härter kommen
Ich weiß ehrlichgesagt nicht genau was ich falsch mache, aber auf jeden Fall sieht es sehr falsch aus. Entweder bleibt mein Testraum schwarz oder man sieht die Seitenflächen der Shadow-Volumes als Schatten.
Ich hab mir das ganze schon hundert mal angeschaut, finde den Fehler aber nicht.Es ist jetzt so, dass jedes Dreieck sein eigenes Shadow-Volume hat. Es kann also keine Lücken oder sonstwas geben, das ist absolut sicher.
Ich bin mir auch relativ sicher, dass die Volumes richtig aufgebaut sind. Ich habe sie schön bunt anzeigen lassen und mal nur Frontface-Rendern lassen. Das sieht eigentich ganz gut aus, alle Seiten scheinen richtigrum zu liegen. Ich habe aber bis jetzt noch nicht verstanden, wie die Graka erkennt ob ein Dreieck im Uhrzeigersinn oder dagegen angeordnet ist. Hat das was mit dem Richtungsvektor der Kamera zu tun oder wie wird das berechnet?Ich weiß es nervt langsam, aber ich schreibe jetzt nochmal wie ich die Schatten rendere, da kann der Fehler ja auch sein:
- zum Test ist nur ein Licht aktiv
- Die Szene wird in den z-Buffer gerendert.
- Stencilbuffer wird auf 0x80 gecleart
- Z-Bias wird auf 0.00001f gesetzt, damit die Volumes hinter ihren Elternpolys bleiben und sie nicht einschatten.
- Die Shadow-Volumes werden gerendert, erst CW dann CCW. Einmal mit ZFail->increment, einmal ZFail->decrement. Die Reihenfolge müsste eigentlich wurscht sein, soweit ich das verstanden habe.
- Z-Bias zurück auf 0.0
- Die Farbe wird gerendert, überall da, wo der Stencil noch =0x80 ist d.h wo kein Schatten ist.
Dieses 0x80 hab ich mal genommen um Vorzeichenprobleme auszuschließen. Bringt aber nicht wirklich was.
Carmacks-Reverse bedeutet ja, dass der Stencil-Buffer so viel größer als 0x80 ist wie Schatten auf den Pixel fallen. Also müsste da, wo der Stincil gleich 0x80 ist, kein Schatten sein. Ist doch soweit richtig, oder?
Ich hab schon zig Sachen probiert, aber immer bleibt alles Schwarz, oder es gibt garkeinen Schatten, oder die Volume-Seitenflächen sind als Schatten zu sehen.
Hab versucht, die einzelnen Polygone der Volumes umzudrehen, alle möglichen Kombinationen von CULL_CW, CULL_CCW, STENCIL_INCR und STENCL_DECR. Bias = 0, Bias > 0, Bias < 0, an allen Stellen -> Niemals geht es!Bitte schreibt Eure Ideen, auch wenn Sie blöd sind
Ich weiß nicht weiter
-
Versuch doch mal einen "Screenshot" vom Stencilbuffer nach den einzelnen Schritten zu machen. Evtl. geht das auch per d3d9spy (oder wie es genau heisst).
-
carmacks reverse bedeutet, dass das objekt auf die nearclippingplane projeziert wird, damit, für den fall man befindet sich im volume, die volume noch mit frontfaces gecapt wird, weil sonst ja alles invers ist.
wenn du dich im volume selbst befindest, gibt z.B. bei einer kugel garkeine frontfaces für das volume, es würde also nie geschlossen werden, du würdest somit nie eine beleuchtung irgendwo sehen, deswegen muss man das objekt auf die frontclippingplane zeichnen und somit einen abschluss des volumes erreichen.und nein, es reicht nicht einfach nur von > 80 auf <80 zu stellen, weil alles invertiert ist, denn es kann sein dass das volume genau die nearclippingplane schneidet und dann ist die hälfte richtig, und die hälfte falsch(inverse) vom stencilbuffer.
rapso->greets();
-
Danke für die Antworten.
der D3dSpy kann leider nur Renderstats, Shaderconstanten usw. anzeigen.
Auf der Suche nach einem Stencil-"Screenshot" ist mir aber aufgefallen, dass ich Idiot 'D3DSTENCILCAPS_INCR' anstatt 'D3DSTENCILOP_INCR' geschrieben hab....wahrscheinlich weil die Doku der Renderstates auf die Seite mit diesen Caps linkt. Da hab ich halt mal kurz nicht richtig gekuckt und schon hat man wochenlangen stress....es soll mir eine Lehre sein.
Thema SV-Frustum Kollision:
Ich hab keine Ahnung, wie ich das machen soll. Ich könnte im Vertexshader durch die Kameraposition irgendwie prüfen ob da was Kollidiert. Aber man hat ja immer nur zugriff auf ein einzelnes Vertice....mal schauen, vielleicht brauch ich das garnicht machen weil die Grafikfehler eh recht selten sichtbar wären. (hoffe ich mal )
@rapso: ich glaub ich habe dich nicht richtig verstanden. Ich kann in ein Volume reingehen und der Schatten ist immernoch korrekt (Carmacks-Umkehr halt).
Ich muss da nix mit der Frontclippingplane machen.Die Schatten funktionieren jetzt erstmal. Leider gibt es immer noch einen Fehler auf den Schattenwerfern selbst, aber damit will ich jetzt nichtmehr nerven. Das bekomm ich schon noch hin.
Danke an alle für die Hilfe.