ein problem bei shadow volume rendering



  • wenn(licht->beleuchtet(objekt))
    

    da liegt das problem.
    ich mach den test atm auf vertex basis, ka wie ich nen schönen test für ein ganzes objekt machen kann,ob es vom licht beleuchtet wird oder ob es im schatten eines andren Objekts liegt...


  • Mod

    du mußt nicht testen ob es im schatten liegt, sondern nur ob es beleuchtete werden würde wenn es keine schatten gibt.
    z.b. mittesl maximaler leuchtweiter eines pointlights oder dem viewfrustum eines spotlights oder oder oder...

    und natürlich für die bounding volume des objektes und nicht pro vertex, das wäre dann keines wegs mehr performant.

    rapso->greets();



  • pro vertex muss ich eh berechnen wenn ich nens chönen schatten haben will^^


  • Mod

    otze schrieb:

    pro vertex muss ich eh berechnen wenn ich nens chönen schatten haben will^^

    shadowvolumes haben als resultat meißt einen pro pixel schatten, nicht pro vertex.

    und ob ein objekt shadowvolumes generiert bekommt hängt eigentlich nur von der lichtquelle ab. deswegen der test mit ihr.

    rapso->greets();



  • aber für eine schöne schattensiluette muss ich einen pro vertex test machen(vertices die weder sichtbar noch zur siluette gehören fallen weg,was bleibt ist eine siluette die schließlich nurnoch in die 3. dimension gestreckt wird, wobei dieses langziehen genau in dem winkel vonstatten, in dem das licht auf das Objekt scheint,besonders gute effekte erreicht man auch hier wieder durch einen pro vertex test)

    ich denke, ich werds so machen:
    erstmal teste ich mittels einer verbindungslinie, ob das licht das objekt überhaupt anstrahlen würde.
    wenn ja, wird getestet, ob irgendein andres objekt auf dem weg liegt.
    ist dies nicht der fall kann direkt das shadow volume berechnet werden.
    ansonsten wird der octree angeworfen,der für jeden teilabschnitt, auf den licht fällt, ein Shadow volume erstellt.

    sind natürlich immernoch ein paar tests,aber das ergebnis wird sich denk ich sehen lassen



  • rapso schrieb:

    indem du die lichtquelle die objekte raussuchen lässt die schatten werfen und nicht nur die camera.

    Das nur sollte gestrichen werden. 😎

    Bye, TGGC \-/


  • Mod

    1. was meinst du damit, dass du rausfinden möchtest ob ein vertex sichtbar ist? worauf genau spielst du da an?

    2. "für eine schöne schattensiluette muss" mußt du pro edge und nicht pro vertex prüfen ob sie extrudet werden muss.

    3. du mußt das volume in dem winkel extruden indem das licht auf den vertex "scheint" und nicht nur auf das objekt (schliesslich könnte eine lichtquelle auch mitten in einem objekt sein.

    rstmal teste ich mittels einer verbindungslinie, ob das licht das objekt überhaupt anstrahlen würde.

    du kannst über eine linie nicht rausfinden ob das objekt nicht irgendwo doch beleuchtet wird. (falls du einen raytrace test meinst, "über eine linie prüfen" ist sehr allgemeingehalten)

    wenn ja, wird getestet, ob irgendein andres objekt auf dem weg liegt.

    dass das nicht trivial ist, sollte dir klar sein, denn genau um das rauszufinden macht man ja shadowvolumes.

    ansonsten wird der octree angeworfen,der für jeden teilabschnitt, auf den licht fällt, ein Shadow volume erstellt.

    entweder ich kann mir unter diesem satz nicht das richtige vorstellen, oder doch und bei diesem overkill bekomm ich dann angst 😃

    vielleicht solltest du noch ein paar mehr tutorials durchforsten. Denn bei einem shadowvolume muss man nicht unbedingt versuchen eine ganze sillouette als gescholossenes objekt zu generieren, man kann es sich auch atomarer gestalten. pro edge prüft man ob die daran liegenden 2 polys beide zum licht gerichtet sind oder davon weg. wenn sie in diese beziehung nicht gleich sind, dann extrudet man von der kante aus ein quad (zwei dreiecke), und das wäre alles was man zum volume generieren machen muss.

    rapso->greets();



  • zu 1, und 2 oops meine wirklich edge
    3. das hab ich auch gesagt
    4. isn ganz einfacher test:Es wird einfach eine linie zwischen Objekt und licht benutzt(was bedeuted, dass die linie im fall des directional lights unendlich lang ist). Dann wird einfach an der Länge der linie getestet ob die linie länger als die maximale aufhellungsweite des Lichts ist.
    Im falle des spotlights wird danach noch getestet, ob der lichtkegel in richtung des Objekts zeigt.
    Das war alles.
    5. achne, soweit bin ich auch schon, dass ich sone kollision hinbekomme:
    octree anschalten testen ob linie den octree trifft,dann rekursiv weiter durchtesten,bis man dann testen kann, ob die linie ein Dreieck trifft.

    6. dasselbe wie 5,nur deutlich mehr tests,wenns zu langsam ist, kommts unter den menüpunkt"realistische Schatten" 😃

    zu 7.im endeffekt ergibt das trotzdem eine geschlossene Siluette,denn wenn du immer eine edge extrudest, kommst du im endeffekt immer an eine siluette.

    btw: shadow volumes sind nicht dafür da herauszufinden, ob ein Objekt einen schatten auf ein andres Objekt wirft,Shadow volumes sind nur dafür da,um Schatten zu zeichnen.


  • Mod

    otze schrieb:

    4. isn ganz einfacher test:Es wird einfach eine linie zwischen Objekt und licht benutzt(was bedeuted, dass die linie im fall des directional lights unendlich lang ist). Dann wird einfach an der Länge der linie getestet ob die linie länger als die maximale aufhellungsweite des Lichts ist.
    Im falle des spotlights wird danach noch getestet, ob der lichtkegel in richtung des Objekts zeigt.
    Das war alles.

    spricht: entfernungstest

    otze schrieb:

    5. achne, soweit bin ich auch schon, dass ich sone kollision hinbekomme:
    octree anschalten testen ob linie den octree trifft,dann rekursiv weiter durchtesten,bis man dann testen kann, ob die linie ein Dreieck trifft.

    6. dasselbe wie 5,nur deutlich mehr tests,wenns zu langsam ist, kommts unter den menüpunkt"realistische Schatten" 😃

    und weil das zu langsam ist, nimmt man eben shadowvolumes.

    zu 7.im endeffekt ergibt das trotzdem eine geschlossene Siluette,denn wenn du immer eine edge extrudest, kommst du im endeffekt immer an eine siluette.

    ja genau, der algorithmus ist nur trivialer, sehr effektiv und kann sogar pure im vertexshader implementiert werden.

    btw: shadow volumes sind nicht dafür da herauszufinden, ob ein Objekt einen schatten auf ein andres Objekt wirft,Shadow volumes sind nur dafür da,um Schatten zu zeichnen.

    doch, schadowvolumes sind dafür da, um herauszufinden welches objekte bzw welche pixel jedes objektes innerhalb oder außerhalb eines schattens sind. dann beleuchtet man einfach alles außerhalb der schattenvolumes und so ganz nebenbei siehst du die schatten.

    rapso->greets();



  • *schulterzuck* ich wollte eigentlich die shadow volumes zum schluss in den stencil buffer rendern(dh also sie hinterlassen nirgendwo sonst ihre spur) und diese spur dann in den zbuffer über einen weiteren rendervorgang übertragen.

    wie würde das denn mit shadern gemacht werden? gibts deutsche links dazu? oder auch generell deutsche links als einführung in die shader?Ich hab bei google nichts gutes gefunden, und als einstieg in ein neues thema trau ich mich nicht ans englische ran,aus verständnisgründen etc.


  • Mod

    du kannst ein flag setzen für den stencilbuffer, z.b. dass durt wo der gesetzt ist (also im schatten), dass dort kein pixel gesetzt wird. so kannst du die beleuchteten dinge leicht in den colorbuffer zeichnen. (so ist das auch eigentlich gedacht mit dem stencilbuffer, übertragungen in den zbuffer gibt es da eigentlich nicht)

    rapso->greets();



  • damit sind doch aber nur komplett schwarze schatten möglich oder?
    gibts auch einfach die möglichkeit an der stelle nur den stencil buffer zu erhöhen? dann wären sogar schattierungen beim überlappen von Schatten möglich


  • Mod

    ja, wären so schwarz wie da: http://www.doom3.com/images/screenshots/04.jpg
    das ist ja auch erstmal realistisch. du mußt pro lichtquelle eh das ganze durchgehen und so verschiedene beleuchtungen von lichtquellen aufeinander addieren.
    falls du nicht möchtest dass etwas komplett schwarz ist, dann mußt du als allererstes alles ohne lichtquelle (nur mit ambient) zeichnen.

    beim stencilbufferzeichnen wird meißtens +1 oder -1 gerechnet. aber in einem durchgang bekommt man nicht mehrere lichtquellen hin.

    rapso->greets();



  • hm hab mich den ganzen gestrigen abend mit vertice shadern beschäftigt(juhu meiner kann jetzt das was das standard T&L kann...naja fast^^)
    auf jedenfall frag ich mich nun, wie das mit shadern überhaupt gehen soll, immerhin hat man mit dem vertice shader immer nur zugriff auf einen vertice, eine edge brauch aber...lass mich ma kurz rechnen...2 und um zu errechnen, ob eine edge sichtbar ist, brauch man noch 2 weitere vertices...hmmmm


  • Mod

    wenn du hier im forum ein paar seiten zurück gehst, wirst du ne lange diskusion über schatten finden, da hatten wir das besprochen.

    ansonsten sind auf der nvidia seite gute paper dazu. (die es dir fehlerfreier sagen könnten als ich)

    rapso->greets();



  • meins du die hier
    da macht derjenige am ende es genauso wie ichs machen wollte^^


  • Mod

    da steht auch etwas weiter hinten von stefan zerbst beschrieben wie man die volumes mit den vertexshadern extrudet.

    rapso->greets();



  • sicher, aber er sagte selber, dass er es doch lieber über software macht, da es mit der animation doch en bissl hakt~~

    ansonsten besteht doch die theorie darin, dass man mithilfe von degenerierten quads, die man nach hinten verschiebt, wenn sie vom licht wegzeigen, das modell an sich verzieht wie ein shadow volume, aber da gibts ein kleines problem: wie kann man denn teste, ob der vertex den man grad testet, ein teil eines degenerierten quads ist oder nicht?
    und nochwas:so wies aussieht wird jedes quad nach hinten verschoben wenn es wegzeigt, egal ob es teil der siluette ist oder nicht,ist das so im sinne des erfinders? 😕



  • otze schrieb:

    sicher, aber er sagte selber, dass er es doch lieber über software macht

    Ein VS ist doch auch nur eine Software.

    Bye, TGGC \-/



  • nagut, er macht es nich über die gpu sondern über die cpu 😉


Anmelden zum Antworten