Sonnentextur an der richtigen Position rendern
-
Hallo,
ich rendere eine Geometrie, so dass jeder Pixel des Bildschirm in meinem Fragmentshader bearbeitet wird. Mein Ziel ist es anhand der reinen Richtung des Sonnenlichts die Sonne an der richtigen Position zu zeichnen. Dafür möchte ich einfach an der passenden Stelle eine Textur zeichnen, welche ich frei skalieren kann.
Ich habe schon einige Sachen ausprobiert und auch schon im Mathematik und Physik Forum um Hilfestellung bei einer meiner Ideen gefragt, jedoch bekomme ich es nicht hin das Problem zu lösen.
Da mir das X-Y-Problem wohl bekannt ist möchte ich jetzt nicht um Hilfe bei einem meiner Lösungansätze bitten sondern generell Fragen: Wie stelle ich das an?Vielen Dank schonmal
-
Naja, du müsstest ja die Richtung des Sichtstrahls für das aktuelle Fragment und den Lichtvektor (Richtung in die das Licht der Sonne geht) haben, right?
Dann könntest du prüfen ob der Winkel zwischen den beiden kleiner als ein bestimmter Grenzwert ist. Wenn ja, dann malst du Sonne. Wenn nein, dann malst du Himmel. (Bzw. einen der beiden Vektoren musst du natürlich umdrehen, sonst zeichnest du die Sonne genau gegenüberliegend von wo sie sein soll.)
Für die Sonne wäre dieser Winkel ca. 16' (Bogenminuten), also ca. 0,266 Grad.
(Der "angular diameter" der Sonne ist ca. 32', da du aber den "Abstand" von der Mitte brauchst und nicht den "Durchmesser" musst du das halbieren -> 16')Für den "Winkel kleiner X" Vergleich kannst du entweder das Dot-Product oder das Cross-Product verwenden.
Wobei sich bei sehr kleinen Winkeln vermutlich das Cross-Product besser eignet.Also mal ganz primitiv, ohne Optimierung
length(cross(norm(sichtstrahl), norm(-lichtvektor))) < threshold
bzw.
dot(norm(sichtstrahl), norm(-lichtvektor)) > threshold
Den
threshold
Wert musst du natürlich passend berechnen, die entsprechenden Formeln sollten ja leicht zu finden sein.
-
Genau diese Überlegungen habe ich auch schon angestellt. Der Haken liegt aber bei folgendem Satz:
Wenn ja, dann malst du Sonne
Ich weiß für jedes Pixel wie weit weg es vom Sonnenmittelpunkt ist, aber das sind nicht genug Informationen um die Texturkoordinaten für die Sonnentextur zu bestimmen. Wie komme ich an diese? Ich stehe da momentan richtig auf dem Schlauch.
-
Achje, Textur, hattest du ja geschrieben -- das hab' ich geistig komplett ausgeblendet.
Ich hatte einfach angenommen dass du die Sonne bloss als helle Scheibe zeichnen willst - was ja auch realistisch wäre. Zumindest wenn man davon ausgeht was man mit unbewaffnetem Auge sehen kann - da ist keinerlei Textur erkennbar.
Eine Möglichkeit wäre natürlich eine Spherical Mapping Technik zu verwenden.
Also die Richtung des Sichtstrahls in Koordinaten auf einer Weltkarte umzurechnen, und diese dann als Texturkoordinaten zu verwenden.
Bzw. auch Cube-Mapping - im Prinzip bietet sich jede Mapping Technik an die auch für Environment-Mapping verwendet werden kann.Das sollte ein gutes Ergebnis liefern wenn du ein spherisches Objekt möglichst genau mit viel Detail darstellen willst - und das korrekt, unabhängig vom Betrachtungswinkel.
Wenn du aber einfach nur ein kleines Sonnenbildchen malen willst, gibt es einfachere Möglichkeiten (die auch viel performanter laufen werden). Z.B. Billboards. Das wird nur schwierig wenn die Sonne z.B. genau im Zenit steht, da du dann keinen Anhaltspunkt hast an dem du dein Billboard ausrichten kannst.
Vielleicht solltest du also noch dazuschreiben an was für eine Art Textur du gedacht hast, bzw. was für eine Art Szene du rendern willst. Und welche Effekte du noch berücksichtigen willst, z.B. atmosphärische Phänomene wie sie sichtbar werden wenn die Sonne auf oder untergeht (Abdunklung, Verformung, Verfärbung).
-
Ich hatte mir überlegt eine Textur dieser Art zu benutzen, damit die Sonne überzeugend hell aussieht. Billboards möchte ich nicht verwenden, denn diese müssen auch irgendwo im Raum platziert werden, und mein Renderer soll auch im Postprocessing funktionieren. Spherical Mapping klingt viel zu aufwändig für eine kleine Sonne.
hustbaer schrieb:
Vielleicht solltest du also noch dazuschreiben an was für eine Art Textur du gedacht hast, bzw. was für eine Art Szene du rendern willst. Und welche Effekte du noch berücksichtigen willst, z.B. atmosphärische Phänomene wie sie sichtbar werden wenn die Sonne auf oder untergeht (Abdunklung, Verformung, Verfärbung).
Die Atmosphärischen Effekte habe ich schon alle implementiert, jedoch sorgt das Scattering am Himmel nur für einen Sonnenhalo, die Sonne darin fehlt mir noch
Ich habe micht jetzt aber entschlossen, die Sonne wirklich nur als Kreis zu zeichnen, der an den Rändern etwas weichgezeichnet ist (dafür reicht ja schon eine 1D-Textur oder eine direkte Berechnung im Shader) und die Helligkeit der Sonne später durch HDR und/oder Lensflare-Effekte darzustellen.
Vielen Dank für die Hilfe hustbaer
-
Das sinnvollste ist IMHO in dem Fall eine Cubemap zu erstellen, in der nicht nur die Sonne, sondern auch der restliche Helligkeitsverlauf des Himmels drin ist. Falls du es dynamischer brauchst, kannst du natuerlich auch mehrere Cubemaps zusammenblenden. Ich habe schon sowas schon öfter mit HDR Texturen gemacht, was relativ realistisch aussieht. Eine andere Variante wuerde ich daher nur benutzen, wenn ich vom Texturspeicher eingeschraenkt waere.