Registriert: So Sep 26, 2004 05:57 Beiträge: 190 Wohnort: Linz
Wenn sich der Einstrahlwinkel des Lichtes ändert, so ändern sich üblicherweise auch die Bereiche die im Schatten liegen, also könntest du mit dieser Methode nur die stärke des Lichtes nicht dessen Position ändern wenn du eine halbwegs realistische Landschaft haben möchtest ... soweit mal der schlechte Teil.
Bei der Sonne hast du jedoch den Vorteil, dass sie sich auf einer (mehr oder weniger) festen Bahn bewegt. Nun kannst du für jeden Punkt auf einer Landschaft die keine Überhängenden Gebilde (Höhlen und ähnliches) zulässt berechnen ab wann dieser Punkt vormittags beleuchtet wird und ab wann er nachmittags nicht mehr beleuchtet wird. Wenn du nun mit Vertex Programmen arbeitest kannst du ganz einfach den jeweiligen Wert (Vormittags ab wann beleuchtet bzw. Nachmittags ab wann nicht mehr beleuchtet) und zusätzlich noch eine Uhrzeit (0.0 = Sonnenaufgang 1.0 = Sonnenuntergang oder ähnlich weil in der Nacht liegt alles im Schatten) an das Vertex Prog übergeben und du kannst ganz einfach abfragen ob sich der aktuelle Vertex im Schatten befindet oder nicht. Wenn nicht im Schatten dann diffuses Licht rein rechnen wenn schon dann diffuses Licht weg lassen.
Wenn du nicht mit Vertex Programmen arbeitest kannst du den Schatten auch über eine 1D-Textur realisieren wo du die Uhrzeit ab wann ein Punkt nicht mehr im Schatten liegst als Texturkoordinate angibst und die aktuelle Uhrzeit entspricht der Prozent der Texel die Weiß sind die anderen sind schwarz. Meinetwegen sind um 6:00 alle Texel schwarz, um 9:00 die eine Hälfte weiß und die andere Hälfte schwarz und um 12:00 die gesamte Textur weiß. Der Nachteil bei dieser Methode ist jedoch, dass du den Diffusen Lichtanteil nicht so einfach rausrechnen kannst, da müsstest du dir noch was einfallen lassen. Also einfacher ists mit Vertex Prog.
Ich habe hier übrigens immer von Uhrzeit geredet weils intuitiv verständlicher ist. In der Praxis wirst du den Sonnenstand vielleicht in Grad angeben.
gut, d.h. wenn ich eine realistische landschaft haben will, muss ich Schatten, als auch licht nicht auf die Textur zeichnen. versteh ich das richtig ?
mit der Uhrzeit, die von 0(nacht) - 0.5 (Middach) - 1(wiedernacht) geht. Mit der Uhrzeit verändert sich dann die Position und der Winkel des Sonnenlichts. Dieses Sogenannte Vertexprogramm müsste ich mir dann selbst schreiben ?! .. Da hätte ich ja dann auch den Vorteil, dass ich Alle vertexe, die in der Map sind (nicht nur terrain, sondern auch häuser) mit schatten belegen kann. Nur wie will ich testen, ob auch diesen Vertex Licht fällt oder schatten ist.
Soll ich vom vertex zur sonne hin eine Linie "mit vorstellen" und an dieser linie einen Colisionstest durchführen. Wenn keine Kollision dann diffuse licht an, wenn collision, dann diffuses licht aus. ?!
Würde aber bestimmt lange dauern wenn ich sowas für jedes Vertex immer machen würde oder ?! .. (gut das müsste man ja immer nur machen wenn sich die Uhrzeit ändern - und das wird sie sich nicht alle paar sekunden in meinem spiel). Oder is das ne schlechte Idee ?
Registriert: So Sep 26, 2004 05:57 Beiträge: 190 Wohnort: Linz
Bei dem ganzen Thread (sowohl bei der Methode mit der Schattentextur als auch bei der von mir beschriebenen Methode) geht es erst mal ausschließlich um Schatten welche die Landschaft auf sich selbst (bzw. auf andere Teile der Landschaft) wirft, die Objekte die da drauf kommen sind wieder ein ganz anderes Thema.
Die 2 Werte ab wann ein Punkt der Landschaft im Schatten liegt und ab wann nicht mehr kannst du dir vorberechnen, ähnlich (nur ein klein wenig komlizierter) wie du die Schattentextur vorberechnen würdest.
Die Objekte die du nun auf deine Landschaft stellst lassen sich höchst wahrscheinlich nicht so einfach dynamisch von der Sonne beleuchten, bzw. die Schattenberechnungen sind um einiges aufwändiger, vor allem wenn diese Objekte auch noch teilweise dynamisch sind. Hier solltest du ggf. mit Techniken wie Stencil Volumen oder ähnlichem arbeiten. Gleiches gilt auch wenn du irgendwelche anderen Lichtquellen als die Sonne besitzt, bei denen sich nicht nur der Einfallswinkel um eine Achse ändert, also beispielsweise wenn du mit einer Taschenlampe herum spazierst.
Schatten von dynamischen Lichtern performant und halbwegs allgemein hin zu bekommen ist nun mal keine triviale Sache, ausser in Ausnahmefällen wie eben eine Landschaft die ausschließlich von der Sonne beschienen wird und die auch ausschließlich Schatten auf sich selbst werfen soll. Alles was darüber hinaus geht ... naja da hast schon ein bisschen mehr zu tun :-).
Aber die Grundidee des Algorithmus kannst du auch für alle statischen Objekte verwenden. Bei der Sonne hast du eine 1D-Zeitachse und du kannst vorberechnen ab welchen Zeitpunkten ein Punkt sichtbar ist (in Bezug auf die Sonne) und ab welchen nicht mehr. Wenn du beliebig komplexe Objekte hast kann es natürlich auch passieren, dass ein Punkt die ganze Zeit sichtbar ist nur um Mittag herum wirft ein anderes Objekt (oder ein Teil des selben Objektes) mal für eine Stunde oder so einen Schatten auf den Punkt. Somit benötigst du eine Liste von Werten nicht nur 2 Werte. Das größte Problem was du dabei bei allgemeineren Objekten haben wirst ist, dass diese Berechnungen auf Punkten basieren. Wenn du nun eine große Hauswand hast, dann hast du da häufig nur die 4 Eckpunkte gegeben (ggf. noch mit Fenstern drinnen) und diese Hauswand wird dann entweder als ganzes beleuchtet oder liegt als ganzes im Schatten, dazwischen gibts da wenig. Wenn du deine Hauswand in 1cm² Blöcke unterteilen würdest, dann würde der Schatten zwar auf den Zentimeter genau passen, aber dafür würde die Anzahl der Vertices explodieren.
Gut ... also jetzt weiß ich nicht was ich nehmen soll
nehmen wir an, es gäbe keine taschenlampen (dynamisches Licht) , und auch keine beweglichen Objekte (dynamischer Schatten). und erstmal nur eine Lichtquelle, die Sonne.
Ich könnte jetzt eine Landschaftstextur machen und für jeden Punkt vorberechnen von wann bis wann Schatten ist. Je nachdem Welche Uhrzeit ist, wird wärhenddem spiel das Pixel in der Textur schattig oder eben nicht schattig gemacht.
Oder mach ich eben für den Boden viele Dreiecke und für jedes Vertex ist schon vorberechnet von wann bis wann das diffuse licht an oder aus ist ?! .. Welche methode ist besser oder überhaupt realisierbar.
-----------------
so weiter im Text. jetzt kommen zwei häuser dazu, die logischerweiße immer an der gleichen stelle stehen. Hat auch wieder den vorteil, dass man alles vorberechnen kann^^. Also die Hauswand in kleine 1cm² stücke zu teilen sagtest du wäre quatsch. Wie soll ich dann vorgehen. Soll ich jedes Pixel der Textur , die auf der Hauswand liegt dann dunkler machen oder heller ?! .. oder sollte ich auch häußer mit dem Stencil Volumen machen ?! .. ich schau mir jetzt mal an was ds is ^^
Registriert: So Sep 26, 2004 05:57 Beiträge: 190 Wohnort: Linz
Sorry das es so lange gedauert hat, die letzte Woche war etwas stressig bei mir.
Generell ist nahezu alles realisierbar und alles hat seine Vor- und Nachteile. Wenn du Schatten je Vertex machst, dann hast du logischerweise auch eine verhältnismäßig geringe Auflösung der Schatten, das ist dann halt abhängig von der größe der Dreiecke. Da heutzutage die meisten Spiele Füllratenlimitiert sind, wäre eine begrenzte Unterteilung von großen Flächen (Hauswand) noch ganz gut vertretbar, also sagen wir mal Hausnummer 1m² Stücke, ist aber von vielen Faktoren abhängig, zB ob du Level of Detail der Geometrie drinnen hast.
Wenn du es mit Texturen machst, dann hast du entweder einen enorm hohen Speicherbedarf (du könntest ja für jede Minute eine Shadowmap generieren und dann immer zwischen 2 Interpolieren ... für einen Tag wären das dann halt ähm ... 60*12 (12 weil in der Nacht brauchst du keine) mal so viele Shadowmaps. Oder die zeitliche Auflösung ist eher gering wenn du nur eine Shadowmap für jede Stunde oder so hast.
Bei einer Landschaft könntest du natürlich mit Fragment Shadern die selbe Methode die ich mit den per Vertex Berechnungen vorgeschlagen habe auch auf Texel-Ebene durchführen. Aber wenn du komplexere Objekte auch haben willst (wo nicht nur zählt wann geht die Sonne an diesem Punkt auf und wann geht sie unter), so stößt du mit Texturen wohl eher schnell an die Grenzen des (perormance mäßig) machbaren, da es nun mal eher schwer ist in einer Textur für jeden Texel eine Liste von Werten anzulegen, wiederum ganz zu schweigen vom Speicherbedarf der bei entsprechend komplexen Objekten anfällt.
Es wird dir also wohl eher wenig anderes übrig bleiben als eine wirklich dynamische Methode (zB Stencil Volumen) zu verwenden. Du kannst aber natürlich auch mehrere Methoden kombinieren, dies wird aber natürlich dann um _einiges_ komplizierter und ist wohl auch häufig ein Unterscheidungsmerkmal zwischen einer wirklich guten und einer "normalen" Engine.
Oder aber du machst es wie sehr viele andere Hobby Entwickler und begnügst dich mit einem nicht ganz so anspruchsvollem äusseren deines Projektes.
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.