Kurzartikel: Hochwertiges Rendern von Sternen

Hier können Artikel eingestellt, Bücher rezensiert sowie Links, Texturen, Sprites, Sounds, Musik und Modelle zur Verfügung gestellt werden.

Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon Krishty » 26.02.2009, 11:38

Hochwertiges Rendern von Sternen
von Chris Maiwald (Krishty)

Bild
So soll es eigentlich nicht aussehen, ich brauchte aber einen hübschen Aufmacher für diesen Artikel ;-)

Hier möchte ich Ansätze zum Rendern des Sternenhimmels diskutieren und die Erfahrungen weitergeben, die ich beim Entwickeln meines eigenen Renderers gemacht habe. Sterne darzustellen hört sich einfach an – bis zu einem natürlichen, realistischen und optisch ansprechenden Ergebnis ist es jedoch ein langer Weg. Wenn man sich dann nicht nur normales Rendering sondern High-Quality-Rendering – rendern mit hohem Multisampling und der maximalen Bildqualität im Vordergrund – vornimmt, ist der Weg nicht nur lang sondern auch steinig.

Es handelt sich bei diesem Artikel nicht um ein Schritt-für-Schritt-Tutorial sondern um einen theoretischen Überriss. Ein Grund dafür ist, dass der Artikel mit allen Details, Erläuterungen und Quellcodes viel zu lang geworden wäre. Ein anderer Grund ist, dass solche Artikel umso schneller veralten und unbrauchbar werden, je konkreter sie sich auf bestimmte APIs und Codeteile beziehen.



Eine Demo gibt es hier.



Inhaltsverzeichnis

Der erste Teil befasst sich mit dem einfachen Rendern und mit der Suche nach geeignetem Ausgangsmaterial. Am Ende werde ich erklären, warum die bisherigen Ansätze in meinem Projekt nicht zum gewollten Ziel führten.
  • 1.1 Was machen wir hier überhaupt?
  • 1.2 Texturen oder Pixel?
  • 1.3 Sterne sammeln
  • 1.4 Sterne sind nicht genug
  • 1.5 Alles umsonst?

Der zweite Teil stellt einen verbesserten, zeitgemäßen Ansatz vor und perfektioniert ihn.
  • 2.1 Das Abtasttheorem
  • 2.2 Pointsprites zu Hilfe
  • 2.3 Dithering gegen Banding

Der dritte Teil präsentiert einige Screenshots meines Renderers und Tipps zur Implementation.
  • 3.0 Ergebnisse
  • 3.1 Tipps


1.1 Was machen wir hier überhaupt?

Wenn ich davon spreche, den Sternenhimmel zu rendern, beziehe ich mich ausschließlich auf die Sterne ohne Effekte wie Morgengrauen, Mondbahnen oder Sternschnuppen. Dieser Artikel erklärt das rendern des Sternenhimmels in seiner puren Form – wie er von einem hohen Berg oder im Weltraum sichtbar ist. Das macht sie für Weltraum-Shooter genauso nützlich wie für Flugsimulatoren oder First-Person-Spiele.

Sterne sind nicht nur für Weltraumspiele oder Spiele, die bei Nacht spielen, wichtig. In großen Höhen können sie am helllichten Tag sichtbar sein und die ersten Sterne schimmern schon während der Dämmerung. Gerade dann können sie eine Bereicherung sein – wenn die Sonne gerade untergeht und ein paar einzelne Sterne schwach am Abendhimmel leuchten wirkt die Szene sofort glaubwürdiger und stimmungsvoller.

Schlecht gerenderte Sterne können genau das Gegenteil bewirken. Fehlen die Sterne, sieht der Himmel zu leer und unnatürlich aus. Sind die Sterne zu groß und zu klobig oder zuviele, wirkt der Himmel erdrückend und einengend. Sind sie noch dazu so hell wie Laternen oder zu gelblich, wirkt das Ganze geradezu lächerlich dilettantisch.

Darum versuche ich hier möglichst nah an der Realität zu bleiben. Sterne können leicht farbig sein, aber auf keinen Fall zu stark (was, wie wir noch sehen werden, eine Frage des Tonemappings ist). Sie dürfen nicht größer als ein paar Pixel sein. Es muss viele schwach leuchtende und wenige stark strahlende Sterne geben und das ganze darf auf keinen Fall künstlich aussehen.

Alle vorgestellten Techniken haben gemein, dass sie auf normalisiertem Raum arbeiten. Das bedeutet, sie funktionieren nur richtig, wenn sich der Betrachter am Nullpunkt befindet und sich nicht bewegt, genau wie eine Skybox. Indem man aus der Transformationsmatrix die Einträge löscht, die für die Verschiebung zuständig sind, kann man erreichen dass die Boxen dem Betrachter überall hin folgen. Für ihn sieht es dann aus, als seien sie unendlich weit entfernt.

Bild
Abbildung 1: Ausschnitt des Nachthimmels in Valves Hit-Shooter Half-Life aus dem Jahr 1998. Man kann erkennen, dass man in die Ecke einer Cubemap blickt, auf welche die Sterne zu zu laufen scheinen. Außerdem wirken die Sterne für diese Auflösung zu groß und wenn man genau hinschaut, kann man die Handbewegung des Künstlers nachvollziehen.


1.2 Texturen oder Pixel?

Fast jedes Spiel hat seine eigene Art, Sterne darzustellen. Vor einem Jahrzehnt waren Cubemaps sehr populär (siehe Abb. 1) – das rührte daher, dass zu dieser Zeit meist die ganze Umgebung eines Levels, inklusive Bergen, Wolken, der Sonne und dem Mond, durch Cubemaps gerendert wurde und sich Sterne schnell als einzelne Pixel darauf auftragen ließen. Diese Methode hat einige Nachteile:

Zum einen reichen einzelne Pixel nicht aus um die Sterne zu rendern, weil die Pixel der Map in Richtung ihrer Ecken verzerrt werden. Um das auszugleichen, muss die Cubemap viel höher aufgelöst sein als die Anzeige, was einen recht hohen Speicherverbrauch bedeutet, der mit HDR-Daten noch steigt.

Weiterhin wirken die Sterne umso klobiger, je weiter man die Auflösung steigert – denn während alle anderen Kanten immer schärfer werden, bleiben die Sterne so unscharf wie sie die Cubemap hergibt. In auf der Quake-Engine basierenden Spielen, die vor einem Jahrzehnt für weitaus niedrigere Auflösungen ausgelegt wurden, kann man das recht deutlich erkennen.

Zuletzt können die Sterne vom Artist nur schwer frei Hand gesetzt werden weil man berücksichtigen muss, in den Ecken weniger aber dafür größere Sterne zu platzieren, damit dort keine Ballungen entstehen. Außerdem muss die Map unbedingt gefiltert werden, damit nichts verpixelt oder verwischt.

Bild
Abbildung 2: Ausschnitt des Nachthimmels in Bohemia Interactives Taktik-Shooter Operation Flashpoint aus dem Jahr 2001, einem der ersten Spiele mit einem realistischem Nachthimmel an dem man sich sogar orientieren konnte. Der Screenshot wurde Gamma-korrigiert, weil auch das Spiel gammakorrigiert arbeitet.


Das waren Gründe, mit fortschreitender Auflösung von der Cubemap abzurücken. Sterne als Punkte wurden populär – man speicherte die Position und Helligkeit der Sterne in einem Vertexbuffer und renderte jedes Vertex als einen Pixelhaufen fester, von der Perspektive unabhängiger Größe am Himmel (siehe Abb. 2). Diese Methode hat sich im Großen und Ganzen bis heute gehalten, weil sie sehr schnell und speicherschonend ist, die Sterne unabhängig von der Auflösung immer recht scharf sind und sie zudem kaum künstlerische Anforderungen stellt, sondern eine Sternliste schnell selbst generiert oder heruntergeladen werden kann. Der Grund, warum diese Entwicklung an die Auflösung gebunden war: Da die Sterne immer einen, vier oder neun Pixel groß waren, strahlten die Sterne bei niedrigen Auflösungen weitaus stärker als bei hohen. Wenn bei 640x480 Pixeln 1000 Sterne zu sehen waren, wurde es eng am Himmel und der Vorteil gegenüber Cubemaps verflüchtigte sich.

Auch in meinen Renderer hatte ich mich für Punktlisten entschieden. Eine Liste mit zufälligen Sternen war schnell generiert – und grauenhaft. Obwohl Sterne jeder Helligkeit vorhanden waren, in der Verteilung keine Muster auftauchten und die Anzahl der Sterne realistisch war, wirkte der Himmel extrem unnatürlich.


1.3 Sterne sammeln

Der Fehler war eben gerade dass die Sterne zu gleich verteilt waren, sowohl in Helligkeit als auch in Position. Vom Anblick der Sterne sind wir schwache Haufen, helle Einzelgänger und eine Konzentration entlang der Milchstraße gewohnt. Ich hatte sowieso vor, einen realistischen Sternenhimmel einzubauen, also begab ich mich direkt auf die Suche nach Sternlisten.

Meine erste Anlaufstelle war der Yale Catalog of Bright Stars. Es handelt sich um eine Datensammlung der 9110 Sterne des gesamten Himmels, die man mit bloßem Auge erkennen kann. Jedem Stern liegen Beschreibungen zur Position und zur Erscheinung bei und den Katalog gibt es als kostenlosen Download – für meine Zwecke ideal.

Schwierig ist es dann aber doch, die Daten aus dem Katalog zu verwerten. Zum einen müssen alle unwichtigen Daten heraus gefiltert werden – Name, Parallaxe, und so weiter. Das ist nicht so schwer, weil das Format dokumentiert ist (die Dokumentation findet sich auf der Download-Seite). Allerdings liegen diese Daten dann im falschen Endian vor und müssen erst geflippt werden. Außerdem sind es physikalische Daten – wer fertige Vektoren und Farben erwartet, irrt. Diese müssen nämlich aus vier Angaben rekonstruiert werden, nämlich der Deklination, der Rektaszension, der scheinbaren Helligkeit und der Spektralklasse.

Die Position eines Sterns als normalisierter dreidimensionaler Vektor ergibt sich aus seiner Deklination und seiner Rektaszension:
Code: Alles auswählen
X = cos(Declination) * sin(RightAscension)
Y = sin(Declination)
Z = cos(Declination) * -cos(RightAscension)
Danach sollte der Nordstern genau auf der positiven Y-Achse liegen. Schwieriger wird es mit der Farbe. Man kann den Farbton aus der Spektralklasse schließen, beispielsweise über Lookups. Die Helligkeit hingegen muss man an den verwendeten Tonemapping-Operator anpassen, welche Formel ich für meinen Renderer verwendet habe steht unten bei den Ergebnissen.

Hier möchte ich noch eine Optimierungsmöglichkeit ansprechen: Anstatt Position und Farbe in 32-Bit-Floats zu speichern, kann man auch 16-Bit-Halfs verwenden – am schnellsten durch D3DXFLOAT16 und D3DXFloat32to16Array(). Bei 9110 Sternen im Katalog halbiert man die Größe des Vertex-Buffers so immerhin von 214 auf 107 KiB. Es schont Speicherplatz und kostet nichts – um Präzisionsverluste muss man sich keine Sorgen machen, Halfs können Sterne noch bis zu Auflösungen von rund 4000 Pixeln (bei 90° Blickfeld) pixelgenau auseinander halten.



Bild
Abbildung 3: Die aus einem Panorama erzeugte Cubemap mit der Milchstraße. Man beachte, wie kontrastreich sie ist – die Map wird erst im Shader abgedunkelt, um volle Bildqualität zu garantieren. Mehr dazu in der Diskussion zum Dithering.


1.4 Sterne sind nicht genug

Mit den echten Sternen sah der Himmel gleich um ein Vielfaches glaubwürdiger aus. Dennoch wirkte er seltsam steril, vor allem die Milchstraße fehlte. Des Rätsels Lösung: Wir sehen am Himmel nicht nur die sichtbaren Sterne sondern vor allem noch Sternhaufen (wie eben die Milchstraße), welche aus so vielen so schwachen Sternen bestehen, dass sie sich nur als Flecken abzeichnen und es nicht in den Bright Star Catalog schaffen. Das Universum ist zwischen den Sternen halt nicht schwarz, sondern milchig grau mit schwach erkennbaren Mustern.

Also musste ein Hintergrundbild her. Ich musste lange suchen, letztendlich habe ich aber eine Panoramaaufnahme der Milchstraße bei der NASA gefunden. Ich konvertierte sie mit einem passenden Tool – HDRShop hat eine Funktion dafür – von einer Atlastextur in eine Cubemap und habe die Farben in einem Fotoprogramm nachträglich aufgebessert. Ich weiß, dass ich mich anfangs gegen eine Cubemap entschieden hatte - die Tatsache, dass diese Map aber nur die groben Schattierungen der Milchstraße wiedergeben sollte erlaubte aber eine niedrig aufgelöste Map (128x128 Pixel Seitenlänge reichen für diesen Zweck! Siehe Abb. 3).

Diese Cubemap musste irgendwo aufgetragen werden, ich suchte mir dazu eine Kugel aus. Wer möchte, kann auch einen Würfel oder ein Tetraeder benutzen. Ich entschied mich für die Kugel weil ich mal gelesen habe, dass GPUs viele mittelgroße Dreiecke schneller verarbeiten können als ein riesiges, das sich über den ganzen Bildschirm spannt. Ich habe dahingehend keine Performance-Tests durchgeführt, darum ist diese Information ohne Gewähr. Jedenfalls ist der Shader denkbar einfach – er transformiert die Kugel und gibt die Eingangskoordinaten der Vertices an den Pixel-Shader weiter (weil der Betrachter in der Mitte ist, entspricht die Vertex-Koordinate gleichzeitig der Texturkoordinate in der Cubemap). Die Cubemap wird gesampled und mit einem Richtwert multipliziert, damit man die Helligkeit des Hintergrundbildes mit dem der Sterne abstimmen kann. Weil die Map niedrig aufgelöst ist, kann sie ohne anisotropen Filter gesampled werden.

Mit einem Fotoprogramm mussten die einzelnen Sterne aus der Cubemap entfernt werden, damit sie nicht doppelt - als Punkt aus dem Vertexbuffer und als Pixel der Cubemap - auftauchten. Ein unbearbeitetes, hochauflösendes Bild ist übrigens perfekt um sicher zu gehen, dass der Vertexbuffer deckungsgleich mit der Cubemap ist und dass man keine Seiten verwechselt hat!



Bild
Abbildung 4: Die Sterne und die Milchstraße von außerhalb der Kugel. Eigentlich ist der Himmel – wie auch hier – sehr farbenfroh, dass wir ihn nur in schwarz-weiß sehen liegt daran, dass unser Auge bei solchen geringen Helligkeit kaum Farben wahrnehmen kann.


1.5 Alles umsonst?

Nun, da Sterne und Milchstraße vollständig implementiert und ihre Farben und Leuchtstärken halbwegs realistisch umgesetzt waren, wollte ich den finalen Schritt umsetzen: Sternbewegungen mit Motion Blur. Mit der Sternbewegung kam dann allerdings die große Ernüchterung: Das Bild begann furchtbar unruhig zu werden. Obwohl die Sternbewegungen minimal sind, sind sie doch groß genug, um alle paar Zehntelsekunden einen Stern von einem Pixel auf den anderen "überschwappen" zu lassen. Weil das alle Sterne zu abwechselnd in ähnliche Richtungen tun, wabert das Bild.

Mein erster Gedanke: Antialiasing! Schnell hinzugeschaltet half es aber nicht, es verlagerte das Problem nur. Die Sterne rutschten nicht mehr von Pixel zu Pixel sondern von Subsample zu Subsample, weshalb ihre Helligkeit nun von Frame zu Frame flackerte. Bei langsamen Mausbewegungen grieselte und rauschte das Bild vor sich hin, und das trotz 8x Antialiasing… nichts half.

Testweise fügte ich Motion Blur hinzu – Sterne wurden nicht mehr als Punkte, sondern als Linien zwischen ihrer Position in diesem und dem vorherigen Frame gezeichnet – aber auch das funktionierte nicht wie gewollt. Sterne verschwanden wenn sie sich nicht bewegten. Wenn sie sich bewegten, tauchten kleine Lücken zwischen den Linien der einzelnen Frames auf. Schuld war eine kleine, aber folgenschwere Änderung der D3D-API von Version 9 auf 10, nämlich das Entfernen des Renderstates D3DRS_LASTPIXEL, der dafür sorgte, dass der letzte Pixel einer Linie immer gezeichnet wurde, auch wenn die Linie Nulllänge besaß. Ohne diesen Renderstate waren Linien von Nulllänge unsichtbar und in der Reihe des Motion Blurs fehlte der letzte Pixel.





Bild
Abbildung 5: Ausschnitt des Nachthimmels in Cryteks Ego-Shooter Crysis aus dem Jahr 2007. Man kann erkennen, dass alle Sterne mindestens zwei Pixel groß sind und hell leuchtende Sterne eine größere Halo besitzen als schwach leuchtende, die Sterne werden also definitiv als Sprites gerendert.


2.1 Das Abtasttheorem

Ursache des Flackerns und Waberns war das Nyquist-Shannon-Abtasttheorem, welches besagt, dass ein Eingangssignal mit mindestens der doppelten Frequenz abgetastet werden muss, um es exakt rekonstruieren zu können. In unserem Fall war das Eingangssignal der Stern, der vom Bildschirm abgetastet wurde um ihn in ein Bildsignal umzuwandeln. Die Frequenz, mit welcher der Bildschirm den Stern abtastete, war ein Pixel (eigentlich höher, wegen des Antialiasings, das unregelmäßige Raster machte das aber durch sein Flackern zunichte). Die Folge dieses Theorems ist: Wollen wir den Stern auf dem Bildschirm rekonstruieren, darf er nicht höherfrequent als zwei Bildschirmpixel sein. Weil Punkte nicht nur horizontal oder vertikal, sondern auch diagonal wandern können, müssen wir das sogar auf zwei Mal (Wurzel aus zwei) Pixel erweitern. Punkte müssen mindestens 2,8 Pixel im Durchmesser groß sein um nicht zu flackern! Interessanterweise ist das beim Rendern von Linien mit Antialiasing ein bekanntes Problem und der Grund dafür, dass es dafür eine separate Einstellung neben dem gewöhnlichen Multisampling gibt. Linien werden dann nämlich nach einer Methode gerendert, die das Abtasttheorem zu unterdrücken versucht.

Wie auch immer, bei dem Punkte-Problem halfen mir die Linien nicht weiter. D3D9 hatte noch eine Einstellungsmöglichkeit für die Größe von Pointsprites, die mir in dem Fall geholfen hätte, in D3D10 ist sie aber wegen der ähnlichen Funktion des Geoshaders weggefallen. Ich entschied mich also dazu, Pointsprites mit drei Pixeln Durchmesser zu rendern. Interessanterweise findet man dieselbe Methode in Crysis (siehe Abb. 5), man wird sich also auch dort mit der Thematik auseinander gesetzt haben – auch wenn die Tatsache, dass der Nordstern dort immer senkrecht am Himmel steht und die Sterne sich nicht bewegen im ersten Moment auf anderes schließen lässt ;-)



Bild
Abbildung 6: Die vergrößerte Stern-Sprite, mit Tesselierung in rot. Obwohl sie nicht größer als 3x3 Pixel auftauchen soll, ist sie 8x8 Pixel groß, damit der anisotrope Filter ein noch weicheres und regelmäßigeres Ergebnis erreicht.


2.2 Pointsprites zur Hilfe

Das Erzeugen von Pointsprites im Geoshader ist denkbar einfach. Man nimmt die Position des Vertex, verschiebt sie je einen Pixel nach links oben, rechts oben, links unten, rechts unten und erzeugt daraus je eine neue Vertex. Diese vier Vertices bilden einen Strip aus zwei Dreiecken, also einem Viereck entsprechend der Größe der Stern-Sprite (siehe Abb. 6). Der Geoshader fügt außerdem die Texturkoordinaten der Sprite und die Farbe des Sterns hinzu. Der Pixel-Shader muss nur noch die Textur an den übergebenen Koordinaten laden, in den Alphakanal der übergebenen Farbe schreiben und fertig ist die Sprite.

Wenn kein Geoshader zur Verfügung steht, kann man dessen Funktionalität im Vertex-Shader simulieren. Dazu muss man alle vier Vertices mit fertigen Texturkoordinaten und dem Sprite-Offset im Vertexbuffer speichern. Der Vertex-Shader berechnet dann die Position des Sterns und addiert das Sprite-Offset hinzu, so dass die vier Vertices an vier unterschiedliche Positionen gerendert werden. Nicht vergessen, von Punktlisten auf Triangle-Strips umzuschalten ;-)

An die Sprite-Textur habe ich besondere Anforderungen gestellt: Zum einen musste sie größer sein als der fertige Stern auf dem Bildschirm. Damit wird erreicht, dass der anisotrope Filter (16x) ein noch weicheres und regelmäßigeres Ergebnis erreicht. Wichtig: Der Filter kann nur mit Mip-Maps effektiv arbeiten, darum besitzt die Textur drei Mip-Levels. Weiterhin musste die Textur exakt punktsymmetrisch sein, dazu aber später mehr.

Es gibt zwei besondere Situationen die verdeutlichen, warum ich Alphablending benutzt habe: Einerseits kann ein Stern vor einem hellen Abschnitt der Milchstraße liegen – ohne Alphablending würde dann der schwarze Rand sichtbar werden und die Milchstraße verdecken. Andererseits könnten sich nahe beieinander liegende Sterne gegenseitig verdecken. In jedem Fall würden Artefakte auftreten, in letzterem auch Z-Flimmern weil sich alle Sterne in exakt der selben Entfernung vom Betrachter befinden, Teile der Milchstraße je nach genutztem Mesh vielleicht auch. Das Alphablending muss additiv eingestellt werden, damit Sterne ihre Umgebung ausschließlich aufhellen, nicht aber abdunkeln können. Der Vollständigkeit halber: Es gibt bei additivem Blending auch die Möglichkeit, Premultiplied Alpha einzusetzen. Für was man sich entscheidet ist für das Ergebnis egal.

Zu guter Letzt habe ich noch eingebaut, dass Sterne der scheinbaren Helligkeit -2 mag doppelt so groß werden wie Sterne von 6 mag und dass dazwischen linear interpoliert wird. Im Stillstand und bei leichter Bewegung war das Ergebnis tatsächlich sehr gut und völlig weich und flimmerfrei, aber noch unfertig, denn ich wollte ja noch Motion Blur einbauen.


Bild

Bild
Abbildung 7: Die gestreckte Stern-Sprite. Blau markiert die Bewegung des Sterns, rot seine Tesselierung. Ganz unten acht überblendete Frames von einem Stern, der sich nach rechts bewegt – die Strecke wird deutlich unterbrochen.


Motion Blur sollte Sterne, die sich schnell bewegen, strecken. Hier stieß ich aber schnell auf ein Problem: Die gestreckten Sprites mehrerer Frames passten nicht mehr aneinander und bildeten Lücken (siehe Abb. 7). Die Sprite musste also für den Motion Blur in ihrer Mitte unterbrochen und dann monoton gestreckt werden. Nach einer Modifikation spuckt der Geoshader nun sechs statt zwei Dreiecken aus und die Sprites fügen sich lückenlos aneinander (siehe Abb. 8 ). Bei all dem darf nicht vergessen werden, die Leuchtkraft des Sterns abzuschwächen, sonst wird der Himmel in Bewegung heller! Die beste Methode ist zugleich die physikalisch korrekte: Die Oberfläche der Sprite auszurechnen, durch die Normalgröße eines Sterns zu teilen – also die relative Fläche der Sprite zu berechnen – und die Helligkeit durch diese zu teilen. Man kann auch mit der Wegstrecke zwischen der aktuellen und letzten Position des Sterns rechnen, dann muss man jedoch den Sonderfall berücksichtigen, dass er sich um weniger als einen Pixel bewegen kann.


Bild

Bild
Abbildung 8: Die verbesserte, gestreckte Stern-Sprite. Blau markiert die Bewegung des Sterns, rot seine Tesselierung. Ganz unten erneut acht überblendete Frames von einem Stern, der sich nach rechts bewegt – diesmal ist die Strecke ununterbrochen.


Zuletzt muss ich noch erklären, warum ich unbedingt eine punktsymmetrische Sprite haben wollte. Auslöser ist der Motion Blur: Wie gesagt bewegen sich die Sterne extrem langsam über den Schirm. Es kann deshalb passieren, dass von Frame zu Frame eine Bewegung erkannt wird oder nicht. Der große Unterschied zwischen keiner Bewegung und einer minimalen Bewegung sind die Achsen der Sprite: Ohne Bewegung sind sie an den Bildschirmachsen ausgerichtet, mit Bewegung sind sie an der Bewegungsrichtung ausgerichtet. Je nach Bewegung flackert die Sprite also zwischen rotiert und nicht rotiert hin und her. Damit dieses Flackern nicht auffällt, muss die Sprite punktsymmetrisch sein.


Bild
Abbildung 9: Zwei Screenshots der Plejaden, links ohne und rechts mit Dithering. Unten jeweils eine 4 × größere und 6,4 × kontraststärkere Version. Dithering kann das Banding vollständig aufheben, obwohl es Pixel nur um höchstens einen Prozent (durchschnittlich halb soviel) verändert und unter Einsatzbedingungen quasi unsichtbar ist.



2.3 Dithering gegen Banding

Der Bildschirm hat nur eine begrenzte Farbtiefe. Beim Sternenhimmel grenzen wir diese Farbtiefe noch weiter ein: 95% der Pixel (nämlich alle, die zu keinem Stern gehören) werden unter einer Helligkeit von 5% liegen. Das bedeutet, dass für die Darstellung der Milchstraße gerade einmal 12 Helligkeitswerte pro Kanal zur Verfügung stehen! Man kann deshalb, ganz besonders wenn sich das Bild langsam bewegt, deutlich die Grenzen zwischen den einzelnen Farben erkennen (siehe Abb. 2, 9). Diesen Effekt nennt man Banding. In meinen Beispielen liegt es nicht an der Textur – ich habe für die Milchstraße schließlich extra eine kontraststärkere Version gewählt, die im Shader abgedunkelt und in ein Float-16-Rendertarget geschrieben wird – sondern einzig und allein an der Farbtiefe des Ausgabegeräts. Da wir die Farbtiefe nicht frei wählen können (mehr als 8 Bits pro Kanal können lediglich ATIs Profi-GPUs wie die FirePro-Serie ausgeben, dann auch nur über spezielle Anschlüsse) müssen wir das Banding von Hand bezwingen. Die beste Methode dafür ist Dithering.

Dithering fügt kleine Fehler in das Bild ein, die sich über mehrere Pixel betrachtet wieder gegenseitig aufheben. Zwar sind viele Dithering-Algorithmen für die Implementierung in Hardware geeignet, für superparallele Architekturen wie heutige GPUs bleiben allerdings nur wenige zur Auswahl. Ich habe mich für gleichverteilten, zufälligen Noise entschieden. Das ist zwar eine der am wenigsten effektiven Methoden, sie lässt sich aber recht einfach implementieren. Es ist wirklich wichtig, dass der Noise gleichverteilt ist, damit möglichst viel Bildinformation erhalten bleibt. Meinen Algorithmus könnt ihr in diesem Thread nachlesen.

In meinem Renderer habe ich Dithering mit einer Stärke von ±1/255 angewendet – das bedeutet gerade mal einen Prozent Abweichung vom ungefilterten Bild (im schlimmsten Fall, durchschnittlich nur die Hälfte), die sich außerdem über mehrere Frames ausgleichen und ab 30 fps quasi unsichtbar sind. Dafür sind absolut keine Farbabstufungen mehr sichtbar (siehe Abb. 9) – insbesondere in Bewegung wirken die Farben weniger abgehackt und das Bild bleibt dennoch gestochen scharf. Meiner Meinung nach wird das Bild durch Dithering sogar noch natürlicher und wärmer, das ist aber Geschmackssache. Weil nicht nur die Milchstraße, sondern auch alles andere was man rendert davon profitieren kann, sollte man das Dithering als Post-Process-Effect auf den Frame anwenden, als allerletztes bevor er zum Bildschirm geschickt wird.





3.0 Ergebnisse

Für diese Screenshots habe ich einen Tonemapping-Operator improvisiert, der halb-halb zwischen Farbe und Grau interpoliert (um zu simulieren, dass das Auge bei so geringer Helligkeit kaum Farben wahrnehmen kann) und anschließend die Farbkanäle RGB auf 80%, 95% und 100% skaliert (um das leichte Blau der Nacht zu simulieren).

Die Helligkeit der Sterne habe ich über 180 * 5 ^ ((-0.4 Magnitüde) – 1.4) berechnet. Im Postprocessing habe ich die Helligkeit skaliert um euch vielseitige Screenshots zeigen zu können.

Die Screenshots wurden auf einer ATI Radeon HD 4850 in 1024x768 mit 16-fachem anisotropen Filter und ohne Antialiasing aufgenommen. Der Renderer funktioniert also auch dann noch perfekt, wenn man aufgrund von Speicherbedarf oder schwacher Hardware keine hohen Multisampling-Levels zur Verfügung stehen hat.

Meine Methode ist ausschließlich GPU-basiert und stellt, abgesehen vom Geoshader, keine hohen Ansprüche: Es gibt weder komplexe Geometrie noch hoch aufgelöste Texturen. Die Framerate lag durchgängig bei 800 bis 1200 fps, ich habe mittlerweile – mit einem neuen Renderer und gemäß diesem Paper optimierten Shadern – durchgängig 1500 bis 2000 fps erreicht. Das Optimierungspotenzial ist wegen der simplen Shader zwar nicht sehr hoch, aber allein das Culling nicht sichtbarer Sterne im Geo-Shader hat 6% Performance-Schub gebracht.

Ich habe ebenfalls keinen Motion-Blur für die Milchstraße implementiert. Weil sie schwächer strahlt als die Sterne und eh sehr niederfrequent ist, habe ich das nicht als nötig erachtet. Auch hier gilt: falls du das implementierst, schick ein paar Screenshots :-)


Bild
Screenshot 1: Blick auf die Milchstraße bei ca. 110° Blickfeld. So hoch sollte die Helligkeit in praktischen Anwendungen nicht eingestellt sein, hier demonstriert sie aber das Detailreichtum und die hohe Vielfalt an Sternen.


Bild
Screenshot 2: Blick auf den Nordstern bei ca. 90° Blickfeld. Links oben ist der Große Wagen zu sehen, rechts unten die Plejaden. Von links unten nach rechts oben schlängelt sich die Milchstraße.


Bild
Screenshot 3: Weitwinkel-Aufnahme der Milchstraße bei rund 140° Blickfeld. Die Kamera wurde von rechts oben nach links unten geschwenkt und dabei auf maximale Helligkeit eingestellt.


Bild
Screenshot 4: Weitwinkel-Aufnahme der Sterne im Zeitraffer. Im Zentrum ist der Nordstern – der Himmelsnordpol – um den sich alle Sterne im Verlauf des Tages zu drehen scheinen. Ein Viertel der Bildbreite nach links unten ist wieder der große Wagen zu sehen. Man beachte, dass sich schnell bewegende Sterne auch weniger dicht leuchten, die Leuchtstärke über den gesamten zurückgelegten Weg aber wieder stimmt.


3.1 Tipps

Wenn du einen solchen Renderer selbst implementierst, denke immer an eins: Die besten Effekte sind die, die einem nicht auffallen. Wenn man in einer klaren Nacht in den Himmel schaut kann man die Milchstraße gerade eben erkennen, in den meisten Nächten und im städtischen Gebiet sieht man aber nicht mehr als die hellsten 20 bis 200 Sterne. Es ist bei dieser Sache sehr leicht, ins Kitschige ab zu rutschen – eine strahlende, bunte Milchstraße quer über den Himmel kann super aussehen – aber auch hoffnungslos übertrieben und aufgedrängt. Gerade wenn man soviel Arbeit in sie und die Sterne gesteckt hat, neigt man dazu, sie über das gesunde Maß hinaus präsentieren zu wollen. Screenshots wie Nummer 1, 3 und 4 würde ich niemals in einem Spiel einbauen – Nummer 2 wäre das Maximum und auch nur, wenn die Szene eine sehr klare Nacht fordert.

Und vergiss nicht, dass alles im Vollbildmodus in einem dunklen Raum komplett anders wirkt, als wenn man es als Screenshot auf einer hellen Website mit weißen Streifen drumherum betrachtet!

Noch ein Wort zu den anderen Gestirnen. Wir mussten die Sterne wegen dem Abtasttheorem rund drei Pixel groß machen. Das ist gigantisch, auch wenn man es nicht merkt weil wir Menschen die Größe der Gestirne immer falsch einschätzen. Zum Vergleich: Die Sonne hat einen scheinbaren Durchmesser von 0,54°, bei einer Auflösung von 1280x1024 Pixeln wäre sie also nur 8x8 Pixel groß. Wenn man bedenkt, dass ich helle Sterne auch größer habe aussehen lassen – bis zu 6x6 Pixel – dann sieht bspw. Sirius fast so groß aus wie die Sonne! Mach die Sterne also nur größer, wenn du nicht anders kannst. Wenn du mit niedrigen Auflösungen arbeitest, schwäche die Sterne ab oder mache Notfalls die Sonne und den Mond (die beiden haben den selben scheinbaren Durchmesser) ein wenig größer (in den meisten Spielen sind sie eh übertrieben groß ). Mit steigenden Auflösungen zukünftiger Bildschirme wird dieses Problem aber verschwinden.

Außerdem soll man nach diesem ATI-Paper das Rendern der Skybox so weit wie möglich nach hinten schieben, weil es performanter ist. Wenn das für einfache Skyboxes gilt, gilt das für einen komplexeren Hintergrund wie ich ihn hier vorgestellt habe wohl erst recht.

Ich hoffe ich konnte denen, die Sterne in ihren Renderer einbauen möchten, mit diesem Artikel einen guten Einstieg in die Thematik und einen detaillierten Überblick über die vielen Fallstricke geben.
Falls es noch irgendwelche Fragen, Verbesserungsvorschläge, Lob oder Kritik gibt, scheut euch nicht es hier zu posten :)



Zusätzliche Stichwörter: Milky Way, Galaxy, Star Rendering, Starfield Rendering, High-Quality Rendering, Sterne rendern
Zuletzt geändert von Krishty am 19.04.2010, 18:33, insgesamt 3-mal geändert.
„All in all, I had a good life. What do you say the three of us grab a six-pack and watch the universe end?“
– „That's basically what I do every day!“


Kurzartikel – Hochwertiges Rendern von Sternen (mit Demo)
Benutzeravatar
Krishty
 
Beiträge: 1072
Registriert: 26.02.2009, 11:18

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon Aramis » 16.06.2009, 16:37

Hoi,

endlich bin ich dazu gekommen es mal zu implementieren. Hat wunderbar geklappt, und ging richtig flott und ohne Probleme. Das ganze Finetuning (Helligkeit, Farbsättigung, etc.) hab ich erstmal ausgespart weil es mit HDR dann sowieso alles völlig anders aussieht :-)

Danke nochmals für den Artikel. Allen anderen hier sei das Verfahren auch an's Herz gelegt, man schafft es wirklich kaum einfacher einen realistisch wirkenden Sternenhimmel hinzukriegen :-)
Open Asset Import Library (Assimp) - Multiformat 3D Model-Importer
YIANG - Ein Jump'n'Run in ASCII-Grafik
Benutzeravatar
Aramis
Alexander Gessler
Moderator
 
Beiträge: 744
Registriert: 25.02.2009, 19:50
Wohnort: 2011
Benutzertext: Auch als Athos bekannt …

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon Seraph » 16.06.2009, 17:10

Wuerdest Du bitte ein paar Resultate posten? Ich bin auch gerade auf der Suche nach einer Technik fuer das Rendern von Sternen, allerdings nicht aus der Sicht der Erde, sondern von verschiedenen Punkten des Weltraums aus.
Seraph
Steffen Engel
Site Admin
 
Beiträge: 658
Registriert: 25.02.2009, 12:51

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon Aramis » 16.06.2009, 17:39

Hier. Sternfarben größtenteils entsättigt, Helligkeitsspektrum eher gering.

Wie gesagt, ich erhoffe mir von HDR ziemlich realistische Sterne, die dann wenn kein großer Himmelskörper im Bild ist entsprechend hell und farbig wirken, bei Kameraeinstellungen mit Planet/Sonne/etc. drauf in den Hintergrund treten (quasi wie bei den Apollo-11-Bildern).

sshot4.PNG
moon.PNG


Mit der Sterngröße experimentiere ich grade noch etwas rum ... ziemlich schwer zu beurteilen was am besten aussieht. Ebenfalls Mühe hab ich mit dem Hintergrundbild .. Krishty's Cubemap gefällt mir optisch nicht, meine aktuelle Variante ist fast etwas zu neblig .... Zur Performance kann ich noch nichts sagen, in der Testapplikation hat es *fast* gar nichts gekostet weil das Bottleneck sowieso an anderer Stelle liegt.
Open Asset Import Library (Assimp) - Multiformat 3D Model-Importer
YIANG - Ein Jump'n'Run in ASCII-Grafik
Benutzeravatar
Aramis
Alexander Gessler
Moderator
 
Beiträge: 744
Registriert: 25.02.2009, 19:50
Wohnort: 2011
Benutzertext: Auch als Athos bekannt …

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon Krishty » 18.06.2009, 17:53

Huch, hier hat sich ja was getan … schön, dass der Artikel nicht in Vergessenheit geraten ist :)

@Aramis: Das ist mal ein fast surreales Déjà-vu … zum ersten Mal sehe ich die Sterne und die Milchstraße, die ich so auch täglich in meiner Engine sehe, in einem komplett anderen Umfeld …
Aramis hat geschrieben:Ebenfalls Mühe hab ich mit dem Hintergrundbild .. Krishty's Cubemap gefällt mir optisch nicht, meine aktuelle Variante ist fast etwas zu neblig ....
Ich bin vor ein paar Monaten auf eine weniger gesättigte Version umgestiegen, mit der ich ganz zufrieden bin … falls es also die Farbsättigung war, die dich gestört hat, kann ich dir gern eine neue schicken (aber die wird leider auch nicht höher aufgelöst sein). Ich rate dir auf jeden Fall, nicht zuviel Arbeit zu investieren, bevor HDR-Rendering implementiert ist – die Farbwirkung ist einfach zu unterschiedlich … aber das hast du ja selbst schon angemerkt.

Aramis hat geschrieben:Wie gesagt, ich erhoffe mir von HDR ziemlich realistische Sterne, die dann wenn kein großer Himmelskörper im Bild ist entsprechend hell und farbig wirken, bei Kameraeinstellungen mit Planet/Sonne/etc. drauf in den Hintergrund treten (quasi wie bei den Apollo-11-Bildern).
Mir ist das soweit ganz gut gelungen (nur ein einziger Stern ist zu hell, das könnte aber auch ein Bug im Sternkatalog sein) … die Formel kann ich dir dann gern zur Verfügung stellen.

Noch was zu den Mond-Screenshots: Ich habe hier eine hübsche, hochaufgelöste Normal- und Albedo-Map für den Mond …:
[2008-12-06-01-00]MoonComparison.png

Der Haken ist nur, dass es sich um eine Cubemap handelt (ich hasse Artefakte an den Polen) … falls du damit aber dennoch was anfangen kannst, melde dich.
„All in all, I had a good life. What do you say the three of us grab a six-pack and watch the universe end?“
– „That's basically what I do every day!“


Kurzartikel – Hochwertiges Rendern von Sternen (mit Demo)
Benutzeravatar
Krishty
 
Beiträge: 1072
Registriert: 26.02.2009, 11:18

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon Aramis » 18.06.2009, 18:07

die Formel kann ich dir dann gern zur Verfügung stellen.


Da werde ich gerne drauf zurückkommen, wird aber vorraussichtlich noch ein Weilchen dauern. Hauptsächlich weil ich momentan noch keine sinnvolle, datengetriebene Möglichkeit habe Postprocessing auszuführen. Und weil vorher noch so gefühlte 200 andere Punkte auf der Todo-Liste stehen. Ich melde mich dann, es lohnt sich nicht drauf zu warten :D

Zum Mond&Sonnensystem -> das ist schlicht und einfach eine ganz gute Testszene, mit 120MB Texturen von Google schnellstmöglich zusammengefummelt. Ich kann mir nur wenig vorstellen, was sich zum Testen und Optimieren eines Szenengraphen besser eignet :-)
Open Asset Import Library (Assimp) - Multiformat 3D Model-Importer
YIANG - Ein Jump'n'Run in ASCII-Grafik
Benutzeravatar
Aramis
Alexander Gessler
Moderator
 
Beiträge: 744
Registriert: 25.02.2009, 19:50
Wohnort: 2011
Benutzertext: Auch als Athos bekannt …

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon Matthias Gubisch » 18.06.2009, 20:52

Der Link zu dem Tread mit dem Noise Algo funktioniert nicht (mehr)

Ansonsten, toller Artikel, glaub ich muss des auch mal implementieren wenn ich wieder etwas Luft hab :)
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Matthias Gubisch
 
Beiträge: 76
Registriert: 01.03.2009, 19:09
Alter Benutzername: rave3d

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon Krishty » 18.06.2009, 21:42

Matthias Gubisch hat geschrieben:Der Link zu dem Tread mit dem Noise Algo funktioniert nicht (mehr)
Umzugsbedingt … gefixt :)
„All in all, I had a good life. What do you say the three of us grab a six-pack and watch the universe end?“
– „That's basically what I do every day!“


Kurzartikel – Hochwertiges Rendern von Sternen (mit Demo)
Benutzeravatar
Krishty
 
Beiträge: 1072
Registriert: 26.02.2009, 11:18

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon Krishty » 21.02.2010, 16:28

Nun noch ein paar Worte zum Tone-Mapping: Sterne und Milchstraße sind äußerst farbenfroh – wir können das nur nicht sehen.

In heller Umgebung sehen wir photopisch, können also Farben unterscheiden. Dies entspricht den gängigen Tonemapping-Formeln.
Dämmert es, sehen wir mesopisch – die Farbunterscheidung fällt schwerer und die Sicht wird unschärfer. Das entspricht von der Leuchtdichte her einer Vollmondnacht, in der man gerade noch lesen kann. Die Lichtempfindlichkeit verschiebt sich ins Blaue.
Wird es noch dunkler, sehen wir nurnoch skotopisch, schwarz-weiß. Dabei wird fast nurnoch blaues Licht registriert – was tagsüber rot war, sieht nun schwarz aus. Was tagsüber blau aussah, sieht nun weiß aus. (Darum sind Instrumente und Rücklichter rot – sie blenden den Teil unseres Sehapparates, der für Nachtsehen zuständig ist, im Gegensatz zu weißem oder blauen Licht kaum.)

Rendern wir Sterne, müssen wir alle drei Bereiche berücksichtigen: Der Mond, Signallichter und die Lichtverschmutzung durch Städte werden gerade noch photopisch wahrgenommen. Sterne u.Ä. werden mesopisch wahrgenommen – wir können ihre Farben, zumindest bei den hellsten Exemplaren, noch ein wenig unterscheiden (z.B. den Mars als schwach rot identifizieren). Die Milchstraße und die schwachen Sterne liegen im skotopischen Bereich (deshalb sind sie trotz ihrer Farbenvielfalt milchig und erscheinen weiß leuchtend).

Für uns bedeutet das: Jeder Pixel muss gemäß seiner Leuchtdichte danach kategorisiert werden, in welchem Wahrnehmungsbereich er liegt. Die Leuchtdichten, ab wann was was ist, stehen im Wikipedia-Artikel. Dann wird logarithmiert. Danach wird gemäß der Kategorie entsättigt (innerhalb skotopischen und mesopischen Sehens kann linear interpoliert werden, damit es nicht zu kompliziert wird). Abschließend muss die Farbe nachkorrigiert werden – obwohl wir physisch nur Grau sehen können, rechnen wir der Nacht psychisch einen blauen Farbton zu („Amerikanische Nacht“).

Da kommt noch ein Haufen anderer Effekte drauf: Verlust der Sehschärfe, Eigengrau etc. Das alles würde aber den Rahmen des Artikels sprengen …

Exzellente Artikel zum Thema sind (vor allem, falls man bodenbasiert rendert) Night Rendering und A Physically-Based Night Sky Model.

Hier ein Screenshot von meinem Test-Terrain mit Atmosphäre und einem Tone-Mapper, der linear zwischen den drei Wahrnehmungstypen interpoliert:
Tonemapped.png

Mit normalem Tonemapping (und ohne Dithering, auch leider ein wenig heller) sieht es schon ein wenig anders aus:
Luminance.png
Das lässt viel Platz für künstlerische Gestaltung, je nachdem, wie man es mag.
Die Kategorisierung eines zufälligen Sternbilds samt Halbmond:
Cat.png


Und hier liefere ich meine weniger gesättigte Cubemap nach. Die Flächen sind in der Reihenfolge +X, -X, +Y, -Y, +Z, -Z:
Background.png
„All in all, I had a good life. What do you say the three of us grab a six-pack and watch the universe end?“
– „That's basically what I do every day!“


Kurzartikel – Hochwertiges Rendern von Sternen (mit Demo)
Benutzeravatar
Krishty
 
Beiträge: 1072
Registriert: 26.02.2009, 11:18

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon eXile » 22.02.2010, 10:54

Mir viele noch eine kleine Anmerkung an Krishty, die mir beim Durchschauen des Threads aufgefallen ist:

Welches Beleuchtungsmodell für den Mond benutzt du? Da doch eine, zwar geringe, aber doch erkennbare Diskrepanz in der Vergleichsabbildung oben zu sehen ist, würde ich das Oren-Nayar-Reflektionsmodell vorschlagen, falls du es nicht schon benutzt. Das Oren-Nayar-Modell wurde gerade für sehr raue Oberflächen, wie eben die Mondoberfläche, entwickelt, und würde sich damit sehr gut anbieten. Vielleicht ist es ja den Versuch wert.
eXile
 
Beiträge: 157
Registriert: 28.02.2009, 13:27
Wohnort: Bonn

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon Krishty » 22.02.2010, 11:29

Super Tipp, danke! Ich hatte mich kurz damit beschäftigt, aber angesichts der Masse an Formeln und Papers, die es zu den Reflexionseigenschaften der Mondoberfläche gibt, kapituliert. Atm komme ich an den Mond-Shader nicht mehr heran … sobald es wieder geht, probiere ich es aber aus.
„All in all, I had a good life. What do you say the three of us grab a six-pack and watch the universe end?“
– „That's basically what I do every day!“


Kurzartikel – Hochwertiges Rendern von Sternen (mit Demo)
Benutzeravatar
Krishty
 
Beiträge: 1072
Registriert: 26.02.2009, 11:18

Neues von der Cubemap

Beitragvon Krishty » 27.02.2010, 01:10

Ein kleines Update zum Hintergrundbild:

Ich arbeite gerade daran, echte Milchstraßen-Fotos zu integrieren statt (auf der Basis von Sternkatalogen) künstlich erzeugte. Ein großes Problem ist, dass Milchstraßenfotos oft keine vollen Panoramaaufnahmen sind und dass sie im falschen Koordinatensystem (dem galaktischen, gegenüber den Äquatorialen der Sternkataloge) vorliegen.

Bei ersterem Problem verweise ich auf diese Fotomontage, die unter einer Creative-Commons-3-Lizenz zur Verfügung steht und von überragender Qualität ist. Die Transformation in das Koordinatensystem der Sternkataloge funktioniert dann (z.B. mit Hilfe HDRShops) so:
– 60 ° nach links rotieren (Shift/Wrap in HDRShop, keine Rotation um eine Bildschirmachse)
– Horizontal spiegeln
– Sphärische Rotation um X: 62,871664 ° (90 ° - galaktische Deklination)
– Sphärische Rotation um Y: 192,859508 ° (galaktische Rektaszension)

Da fehlt noch irgendwo eine Rotation um ein Grad, das gibt dann einen netten Schliereneffekt:
MilkyWay.png
Damit lässt sich aber zumindest die korrekte Ausrichtung der Cubemap-Seiten verifizieren ;) Sobald ich die fehlende Rotation gefunden und die Sterne rausgefiltert habe, gibt es hier die beste Cubemap, die man dafür nur benutzen kann.

Edit: Erledigt. 50,76 ° auf der Y-Achse rotieren, dann 1,5 ° auf der Z-Achse, und wieder -50,76 auf der Y-Achse, dann ist alles in Flucht:
MilkyWayCorrect.png


Edit 2: Es ist vollbracht … diesmal habe ich die Sterne nicht herausgefiltert (nur die Planeten, die im Weg waren) … habe irgendwie Gefallen an dem Noise gefunden. Ist diesmal auch in höherer Auflösung, damit die schönen Details nicht verloren gehen. Die Flächen liegen wieder in der Reihenfolge +X, +Y, +Z, -X, -Y, -Z vor, die Quelle ist http://www.eso.org/public/images/eso0932a/ und ich hoffe, dass ihr mit der Cubemap etwas anfangen könnt:
Bild
Falls ihr eine High-Res-Version, Quelldaten oder sonstwas braucht, meldet euch bei mir.

Noch ein Screenshot zum Abschluss, ohne Tonemapping, damit die volle Farbkraft durchkommt … leider ist die Helligkeit der Sternsprites nicht an die des Hintergrunds angepasst, ich bitte, das zu entschuldigen.
MilkyWayWithScattering.png
Das reale Vorbild:
Bild
„All in all, I had a good life. What do you say the three of us grab a six-pack and watch the universe end?“
– „That's basically what I do every day!“


Kurzartikel – Hochwertiges Rendern von Sternen (mit Demo)
Benutzeravatar
Krishty
 
Beiträge: 1072
Registriert: 26.02.2009, 11:18

Sternendemo

Beitragvon Krishty » 16.04.2010, 10:18

Verdunkelt die Räume, ich habe eine Sternendemo gebastelt ;) Nichts Großartiges – keine Atmosphäre, keine Tag-Nacht-Zyklen, einfach der Algorithmus gemäß des Artikels.

Voraussetzungen:
  • Direct3D-10-kompatible Grafikkarte (getestet auf Radeon HD 4000, GeForce 8000 und einem Intel-Chipset)
  • DirectX SDK February 2010 oder, falls nicht installiert, DirectX Redistributable (February 2010)
  • DXGI 1.1, d.h. Vista SP2 oder höher.
Download:
BiederOzonblau20100416x86.7z
(1.2 MiB) 85-mal heruntergeladen

Ich sehe nichts!
Mausrad hoch / runter ändert die Helligkeitsempfindlichkeit.

Ich sehe nur blauen Griesel!
Das ist die untere Helligkeitsgrenze der menschlichen Wahrnehmung, mittlere Maustaste bzw. Mausrad drücken und halten, um auf „Digitalkamera“-Tonemapping umzuschalten.

Bild
Bild

Technisches: Es gibt zwei Dinge, mit denen ich unzufrieden bin: Zum einen passt der Motion Blur nicht nahtlos aneinander; ich denke, dass die Projektion noch nicht so ganz gelingt. Bin aber noch dran. Zum anderen musste ich die Auflösung des Hintergrunds vierteln, damit es in den Anhang passt. Ich kann aber gern eine FullHD-Version bei einem Filehoster hochladen, falls jemand Interesse anmeldet.

So eine Demo hätte man mit DXUT wohl in ein paar Stunden basteln können … ich wollte die Möglichkeit aber nutzen, um das Grundgerüst meiner Engine in der Wildnis zu testen. Etwaige technische Probleme seien mir bitte mit angehängter Logdatei berichtet und vergeben …

Ich benutze nun keine Sternentextur mehr, sondern einen Anti-Aliasing-Lookup gemäß diesem GPU Gems-Artikel … funktioniert super, sieht noch besser aus und die Sterne sind dadurch noch kleiner und klarer.

Freue mich über Feedback, teile auch gern Quellcode – auch, wenn ich nichts direkt Kompilierbares vorlegen kann, weil die Chose relativ stark abhängig von meinem Framework ist.
„All in all, I had a good life. What do you say the three of us grab a six-pack and watch the universe end?“
– „That's basically what I do every day!“


Kurzartikel – Hochwertiges Rendern von Sternen (mit Demo)
Benutzeravatar
Krishty
 
Beiträge: 1072
Registriert: 26.02.2009, 11:18

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon Aramis » 16.04.2010, 12:18

Danke fuers Releasen der Demo, damit haben alle Leser deines Artikels endlich eine lauffaehige Referenz :-)

Sieht optisch natuerlich absolut perfekt aus. Kein Vergleich zu Crysis. Ich kann allen spaeteren Betrachtern nur empfehlen vorher wirklich alles abzudunkeln, dann ist die Wirkung um Welten besser als in einem hellen Raum mit viel Mausraddreherei.

Getestet auf Win7, February2010, Core i7 860 & einer HD5850. Hardware und Displaykonfiguration laut Logdatei korrekt erkannt.

Danke auch dafuer, dass ich seitdem du mit diesem Artikel angefangen hast in jedem Spiel aufs neue in den Himmel gucken muss. Ich will gar nicht erst wissen wie schlimm das dann erst bei dir sein muss :-)
Open Asset Import Library (Assimp) - Multiformat 3D Model-Importer
YIANG - Ein Jump'n'Run in ASCII-Grafik
Benutzeravatar
Aramis
Alexander Gessler
Moderator
 
Beiträge: 744
Registriert: 25.02.2009, 19:50
Wohnort: 2011
Benutzertext: Auch als Athos bekannt …

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitragvon Jörg » 16.04.2010, 19:38

Schick schick!
Aber bei mir stimmt was mit dem Dithering-Noise nicht....extrem nervig gerade bei höheren Helligkeitsstufen, da es ebenfalls heller wird. Die Milchstrasse ist darin kaum zu erkennen.
Jörg
 
Beiträge: 165
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim

Nächste

Zurück zu Ressourcen für Spieleentwickler

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast