Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 16:38

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: wiedereinmal das Licht ^^
BeitragVerfasst: Di Okt 17, 2006 14:41 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
Hallo,

hab jetzt die Tutorials zum HeighMap gelesen und hab noch einer frage.

Wenn man eine Map erstellt wie is in den Tuts gemacht wurde geht das Folgendermaßen

1. Dreiecke OHNE licht zeichnen
2. Textur MIT licht und MIT schatten auf die dreecke legen


nun ist das licht ja jetzt fest in der textur und wirkd denke ich mal dadurch sehr statisch..

wäre es nicht besser folgendermaßen vorzugehen

1. kleine dreiecke zeichnen und für jenden vertex ne normale berechnen
2. Textur OHNE licht aber MIT schatten drüber legen ..

so wäre das licht dochdynamischer oder ?! .. oder sollte man es so nicht machen ?!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 19, 2006 13:45 
Offline
DGL Member

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 20, 2006 09:41 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
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 ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 20, 2006 11:28 
Offline
DGL Member

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 20, 2006 13:42 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
Gut ... also jetzt weiß ich nicht was ich nehmen soll :D

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 ^^


ok .. dummer schatten ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 29, 2006 05:47 
Offline
DGL Member

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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]