ein problem bei shadow volume rendering



  • also, ich hab ja jetzt schon ziemlich gut verstanden, wie das funktioniert, doch ergibt sich für mich im moment ein kleines-großes problem:

    nehmen wir mal an, ich steh vor einem berg, aber schau ihn nicht an(ich bin zb von ihm abgewendet).
    so, nun ist hinter dem berg grade eine lichtquelle, ich nenn sie mal "sonne".
    nun müsste eigentlich der Berg einen schatten auf mich werfen, weil die sonne ja hinter ihm ist, und deshalb verdeckt..
    (hier ist ne skizze)

    |      
     O<--Mensch  |     O<---Sonne
    /|\          |
    / \          |<---Wand
    -------------|------------------<---Boden
    

    leider cull ich den berg aber vorher,er kann keinen schatten mehr werfen,aber wenn ich die Objekte nun nicht cullen würd, ging die performance nahe null.
    also, was tun,wie Krieg ich nun doch meinen Schatten?


  • Mod

    indem du die lichtquelle die objekte raussuchen lässt die schatten werfen und nicht nur die camera. die camera culled nur das viewfrustum, die lichtquelle (wenn du so willst) culled das lighfrustum bzw lightvolume.

    die generierten volumes mußt du dann wie objekte auch cullen (mit dem viewfrustum)

    rapso->greets();



  • und wie soll ich das machen?

    //pseudocode
    for_each(light){
       for_each(Objekt){
           CreateShadowVolume(light,Objekt);
       }
    }
    

    problem an der ganzen sache ist, dass das cullen für die siluette des Objekt relativ lange dauert...


  • Mod

    otze schrieb:

    und wie soll ich das machen?

    //pseudocode
    for_each(light){
       for_each(Objekt){
           CreateShadowVolume(light,Objekt);
       }
    }
    

    problem an der ganzen sache ist, dass das cullen für die siluette des Objekt relativ lange dauert...

    //pseudocode
    for_each(light){
       for_each(Objekt){
           wenn(licht->beleuchtet(objekt))
              CreateShadowVolume(light,Objekt);
       }
    }
    

    wo ist das problem?

    rapso->greets();



  • 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();


Anmelden zum Antworten