PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenGL: Schatten überlagern


aths
2003-05-27, 22:24:49
Heute habe ich eine superprimitives, aber leidlich funktionierende Schattenwerfen geschrieben. Dazu wird einfach für jedes Dreieck oder Viereck auch gleich immer das zugehörige Schatten-Dreieck- bzw. Viereck gerendert. Folgende Einschränkungen gibt es:

Der Schatten werfende Körper muss konvex sein. Der Schatten muss komplett auf der Schattenwurf-Ebene liegen. Mit diesen Schwächen kann ich leben.

Nun hätte ich gerne weichen Schatten. Idee: Die punktförmige Lichtquelle ist Mittelpunkt eines kleinen Würfels. Die Ecken dieses Würfels werden nun ebenfalls als Lichtquellen betrachtet, so dass ingesamt 9 mal Schatten geworfen wird. Die Ränder sollen also je nach Abstand Körper - Schattenwurf-Ebene abgestuft erscheinen.

Doch wie kriegt man das hin, dass sich die Schatten überlagern? Ein Schatten ist bei mir im Moment einfach ein dunkelgrünes Polygon auf einer hellgrünen Fläche.

Wie gesagt werfen alle einzelnen Polygone jeweils ihren Schatten. Da einfach immer ein dunkelgrünes Schattendreieck gerendert wird, sind die während eines Schattenwurf-Passes sich überlagernde Schatten nicht dunkler als die anderen. Das ist ja auch gut so.

Wie könnte man es nun bewerkstelligen, die weichen Ränder reinzukriegen?

Kant
2003-05-28, 05:53:21
Hi,

Du kannst die einzelnen Shadow-Faces auch, statt sie in dunkelgrün zu rendern, in schwarz rendern ;)
Allerdings zu 50% transparent, um sozusagen den Framebuffer an dieser Stelle abzudunkeln.
Das Ergbeniss wäre dann allerdings falsch. [ Man stelle sich zwei übereinanderliegende Faces vor, die beide Schatten werfen. Mit einfachem Blending würde der Schatten zu dunkel (dopppelbeschattet suzusagen) ]

Eine Möglichkeit wäre noch, die SchattenFaces für Licht1 in den Stencil-Buffer zu rendern. Nachdem alle Faces im Stencil sind, dann den Framebuffer an den Stellen mit gesetzem Stencil abdunkeln. Stencil clearen, und weiter zum nächsten Licht.
Auf diese Weise würde ein Pixel, der "voll" im Schatten liegt 9 mal abgedunkelt werden, andere entspr. weniger.
Aber .... Schnell wird das sicher nicht ;)

micki
2003-06-02, 11:54:39
beim zeichnen der schatten blendest du die schattenfarbe mit der hintergrundfarbe und setzt dabei den stencil. für jede lichtquelle setzt du die schatten nur dorthin, wo kein stencil gesetzt ist, so würdest du wohl sehr simpel dafür sorgen dass kein pixel zweimal gesetzt ist und du müßtest quasi nix am eigentlichen rendering ändern.

(natürlich zwischen den lichtquellen den stencil clearen)

MfG
micki

aths
2003-06-03, 12:44:55
Original geschrieben von micki
beim zeichnen der schatten blendest du die schattenfarbe mit der hintergrundfarbe und setzt dabei den stencil. für jede lichtquelle setzt du die schatten nur dorthin, wo kein stencil gesetzt ist, so würdest du wohl sehr simpel dafür sorgen dass kein pixel zweimal gesetzt ist und du müßtest quasi nix am eigentlichen rendering ändern.

(natürlich zwischen den lichtquellen den stencil clearen)Die besten Ideen kommen immer zum Schluss :naughty: Wahrscheinlich wird das auf einer TNT aber alles andere als befriedigend laufen (Alpha Blending, Stencil...) doch mir gehts ja erst mal um das Prinzip.

micki
2003-06-03, 14:20:11
schau im programmierer forum, da viel mir wat besseres ein... :)

MfG
micki