Kurzartikel: Hochwertiges Rendern von Sternen 2.0

Hier können Artikel, Tutorials, Bücherrezensionen, Dokumente aller Art, Texturen, Sprites, Sounds, Musik und Modelle zur Verfügung gestellt bzw. verlinkt werden.
Forumsregeln
Möglichst sinnvolle Präfixe oder die Themensymbole nutzen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Krishty »

@Aramis: Ich fühle mich (in dieser Reihenfolge) bestätigt, geschmeichelt, erleichtert, stolz und wehmütig.

@Jörg:
Krishty hat geschrieben: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.
;) Das Dithering ist hochfrequenter, schwächer und, zumindest in dieser Demo, nicht erkennbar. Du kannst es getrennt über Numpad 3 / 9 runter- und hochregeln und per Numpad 6 abschalten oder resetten. (Willst du die Milchstraße trotzdem im natürlich-bläulichen Look, geh in Direct3D11\Tonemapping Operator (human) 10.0.hlsl und korrigier in Zeile 28 EigengrauMaximum um ein oder zwei Dekaden nach unten.) Und dankeschön natürlich.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Jörg »

Ah :) Ich hab hier keine Maus und das Scrollen hab ich ueber die Touchpad-Extension hinbekommen. Scheint so, als haette das mit dem mittleren Klick nicht gepasst. Da muss ich wohl mal eine 'echte' Maus anknüppern.

PS: Nun passt es! Das Noise hatte also nichts mit dem Dithering zu tun sondern ist ein zusaetzlicher Effekt.

Hast Du mal ueberlegt, die Sternen-"Sprites" ala Clear-Type sub-pixel-genau zu steuern ? Um diesen "Game-Of-Life"-Effekt bei langsamen Bewegungen mildern.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Krishty »

Jörg hat geschrieben:Hast Du mal ueberlegt, die Sternen-"Sprites" ala Clear-Type sub-pixel-genau zu steuern ? Um diesen "Game-Of-Life"-Effekt bei langsamen Bewegungen mildern.
Der Gedanke kam mir mal, aber ich habe ihn schnell wieder verworfen – zum einen ist das Anti-Aliasing der Sterne ausreichend (bei der Demo ist es 32-fach AA mit Gauss-Kernel) und ich habe sichergestellt, dass das AA immer optimal funktioniert, indem ich die Sterne bei verschiedenen Auflösungen innerhalb eines Pixels hin- und herzittern ließ, ohne, dass es flimmerte (auch bei der Demo bewegen sich die Sterne noch zufällig innerhalb eines zehntel Pixels, selbst, wenn du die Maus still hälst). Zum anderen ist es technisch nicht machbar, weil das Rendering der Sterne vor dem Tone-Mapping erfolgt und ich deshalb nicht vorhersagen kann, mit welcher Helligkeit ein Subpixel am Ende tatsächlich dargestellt wird.

Alles, was du an Game-of-Life-Effekt beobachten kannst, sollte eine Auswirkung des Anti-Aliasings sein. Sollte es bei dir aber der umgekehrte Fall sein – dass das Aliasing dadurch verstärkt wird – dann habe ich da irgendwo einen Fehler gemacht. Es könnte auch sein, dass du im Treiber anisotrope Filterung erzwingst und dass der AA-Kernel dadurch aufgemischt wird …

… ich habe hier leider keine Nvidia-Karte, deshalb konnte ich nur testen, ob es auf nicht-ATI-Karten läuft – nicht, ob es dort auch korrekt läuft. Solltest du also eine nicht-ATI-Karte haben und/oder bist dir sicher, dass AF abgeschaltet ist und siehst Aliasing, schick Screenshots und Hardware-Konfiguration und ich sehe zu, was ich tun kann.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Jörg »

Ja, an das Tone-Mapping habe ich nicht gedacht, das stimmt. Wahrscheinlich bin ich nur zu pingelig und muesste mal wissen , wie es ohne AA aussieht. Kann man es im Programm deaktivieren? Oder muss ich im Treiber rumspielen?
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Krishty »

Ist nicht implementiert. Wenn du mir ein bisschen Zeit gibst, kann ich dir aber eine Version ohne AA schreiben …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Krishty »

Ging schnell, musste nur den Geo-Shader rausnehmen … damit ist Motion-Blur natürlich auch weg.

Da die Sterne ohne AA und ohne Bewegung natürlich perfekt aussehen, habe ich mal eine minimale Rotation um den Himmelsnordpol reingebracht … jetzt sieht man die Sprünge.

Sicherheitskopie machen, dann ersetzen
NoAA.7z
(865.73 KiB) 1578-mal heruntergeladen
Edit: Zu pingelig kann man kaum sein :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Jörg »

Danke, das macht den Unterschied wirklich deutlich. Aber dafuer muss ich auch echt nah an den Bildschirm ran :) hmm...ich lauf mal zum Fernseher, da sind die Pixel groesser.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Krishty »

Mal ein kleines Update der Demo …
… das meiste hat sich unter der Haube getan, aber zu den deutlich erkennbaren Veränderungen gehört:
  • Sonne und Mond enthalten
  • Sonne, Mond und Sterne bewegen sich auf realistischen Bahnen
  • Beschleunigen und bremsen der Zeit (z.B. für Motion Blur, Mondphasen im Zeitraffer und Rotation der Sterne um die Himmelspole)
  • Größerer Leistungshunger auf Direct3D-10.1- und -11-Chips
  • neu: Glare
Schnellstart:
  • Raum verdunkeln ;)
  • Direct3D-10- oder 11-taugliche Grafikkarte benötigt, außerdem die DirectX-Runtime Juni 2010 (falls kein aktuelles SDK installiert, Download hier)
  • Die Demo zeigt den Himmel zur aktuellen Systemzeit von Deutschland (genauer: NRW) aus
  • Mausrad hoch und runter macht heller und dunkler
  • Bild auf / Bild ab zoomt hinein oder weg
  • Plus- und Minustaste auf dem Numpad beschleunigen und verlangsamen die Zeit
  • Drücken und Halten der rechten Maustaste schaltet von menschlichem auf digitales Tonemapping um (farbenfroh, ohne Glare & ohne Griesel)
neu: D3D-11-only-Version mit Glare:
BiederOzonblau20110320.7z
(2.03 MiB) 7566-mal heruntergeladen
Alte D3D-11-only-Version ohne Glare:
BiederOzonblau20101125.7z
(4.86 MiB) 1735-mal heruntergeladen
Alte D3D-10-Version:
BiederOzonblau201009233.7z
(4.86 MiB) 1875-mal heruntergeladen


Ausführlich:
Im letzten halben Jahr hat sich viel an der Engine getan und ich wollte die kleinen Fortschritte am Sternenhimmel nutzen, um sie mal wieder „in der Wildnis“ zu testen. Die Sonne ist nur als einfarbige Scheibe implementiert; der Mond deutlich liebevoller, aber z.B. fehlt noch das von eXile vorgeschlagene Beleuchtungsmodell. Die Demo benutzt die aktuelle Systemzeit für Chronologie und Himmelsmechanik – leider nicht präzise genug, um z.B. Sonnenfinsternisse wiederzugeben, aber für den Spielealltag mehr als ausreichend. Da kein künstlicher Horizont drin ist, ist ernsthafte Navigation anstrengend, aber möglich – der Betrachter schaut beim Start genau nach Norden; die Y-Achse findet man durch hin- und herbewegen der Maus und der Nordstern ist relativ einfach zu finden, indem man die Zeit beschleunigt und schaut, worum die Sterne rotieren (falls man nicht fachkundig ist und ihn sowieso sofort erkennt).

Steuerung:
  • Alt+Eingabe zum Umschalten zwischen Vollbild- und Fenstermodus; Alt+F4 zum Beenden.
  • Maus zum Umsehen (manchmal ungünstig, wenn sie das Fenster verlässt. Ist mir als Fenstermodus-Fan aber lieber, als sie einzusperren).
  • Mausrad hoch/runter ändert die Belichtungszeit, macht also das Bild heller oder dunkler.
  • Drücken und Halten der rechten Maustaste deaktiviert menschliches Tonemapping und schaltet auf digitales um – die menschlichen Limitierungen entfallen (bei geringer Helligkeit Farben- statt Schwarz-Weiß-Sehen, kein Rauschen mehr) und man sieht den Himmel wie auf Fotos.
  • Bild-auf- und Bild-ab-Taste steuern den Zoom.
  • Plus- und Minustaste auf dem Numpad lassen die Zeit schneller und langsamer vergehen. Sehr nützlich, um den Motion Blur zu betrachten, den Nordstern zu finden, sich den Mond während verschiedener Phasen anzuschauen oder zu beobachten, wie die Sonne im Sommer aufsteigt. Ich habe die Maximalgeschwindigkeit auf drei Tage pro Sekunde – also ein halbes Jahr pro Minute – begrenzt, damit das Ganze auch bei niedrigen Frame-Raten kontrollierbar bleibt.
Schnellhilfe:

Alles ist weiß! (in der Version mit Glare)
Du schaust in die Sonne. Mausrad hoch / runter ändert die Helligkeitsempfindlichkeit.

Alles ist schwarz! (in den Versionen ohne Glare)
Mausrad hoch / runter ändert die Helligkeitsempfindlichkeit.

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

Sonne und Mond fehlen! (wahrscheinlich nur in den Versionen ohne Glare)
Höchstwahrscheinlich nicht; sie sind nur kleiner, als wir denken. Ranzoomen und genau hinschauen. Helligkeit runterdrehen, damit die meisten Sterne verschwinden und nur Sonne und Mond übrig bleiben. Zeit beschleunigen und ein paar Tage überspringen, um sicher zu gehen, dass nicht Neumond oder Sonnenfinsternis ist.

Probleme:
Ich habe die Demo auf Windows 7 mit einer GeForce 8600M GT und einer Radeon HD 5770 getestet, aber es kann natürlich immer mal vorkommen, dass was nicht läuft. In dem Fall schickt mir bitte ein Log und Eckdaten zum System – ist ja auch in meinem Interesse, dass die Engine überall wie erwartet funktioniert. Bekannt:
  • Gedrückte rechte Maustaste verträgt sich nicht mit dem Verlassen des Fensters. In dem Fall rechte Maustaste außerhalb des Fensters drücken und gedrückt haltend zurückkehren ;)
  • Bei hohen Auflösungen kann die Performance massiv einbrechen (von eigentlich 30 auf 4 fps), nachdem man das Fenster vergrößert hat. Die Ursache habe ich noch nicht gefunden, aber Maximieren und Wiederherstellen hilft meistens. Letzter Ausweg ist der Vollbildmodus, der funktioniert immer reibungslos. Ist in der Glare-Version behoben.
  • Die Performance ist schwach. Auf D3D-10.1- und 11-Karten schalte ich 2- bzw. 4-fach MSAA zu, um Mond und Sonne zu glätten. Bei Full-HD-Auflösungen bringt das aktuelle Karten schnell an die Grenze … es ist wirklich lächerlich, die Performance wegen der zwei Pünktchen auf ein Viertel (2×MSAA) / Achtel (4×MSAA) einbrechen zu lassen – aber ich sehe es positiv; für alles, was in nächster Zeit an Effekten und Geometrie nachkommt muss ich diesen Schritt früher oder später eh wagen und ist die Performance erst ruiniert, lebt es sich ganz ungeniert. Und so lange da nur Sonne, Mond und Sterne sind, sollte es nicht unspielbar langsam werden. Die D3D-11-Versionen sind mittlerweile ziemlich gut optimiert.
  • Beim Schalten in den Vollbildmodus verschiebt sich die Maus. Leider macht Direct3D das automatisch.
Technik:
Hachja, das ist wieder mal alles so wunderbar overengineered ;)

Bewegung in die Sterne zu bringen ist eigentlich ganz einfach. Man braucht nur das derzeitige Julianische Datum in koordinierter Weltzeit (ich empfehle GetSystemTimeAsFileTime()) und rechnet es dann auf die Epoche J2000.0 um (d.h., subtrahiert 2451545; lässt sich mit GetSystemTimeAsFileTime() kombinieren). Daraus berechnet man die derzeitige Sternzeit in Greenwich (GMST). Die Transformation der Sterne ist dann eine Rotation um die Y-Achse um GMST ÷ 24 × 2 × π + Länge des Beobachters gefolgt von einer Rotation um die X-Achse um 90 - Breite des Beobachters.

Mit der Sonne wird es schon schwieriger – aber auch hier liefert Wikipedia alles, was man braucht, inklusive Beispiel.

Kniffliger wird es mit dem Mond. Die Formel für die Mondbahn habe ich dem exzellenten Paper A Physically-Based Night Sky Model entnommen, und sie funktioniert zufriedenstellend.

Komplett selber gemacht ist das Rendern von Sonne und Mond. Textur und Normal-Map des Mondes habe ich, wie schon weiter vorne im Thread geschrieben, aus verschiedensten Quellen selber zusammenkombiniert. Gerendert werden die Gestirne als Sprites – dafür gibt es mehrere Gründe:
  • 50 MiB Texturdaten (Albedo und Normalen beim Mond, allerdings nicht in dieser Demo, um Bandbreite zu sparen) sind auch heute noch ziemlich viel; erst recht für einen letztendlich meist 15×15 Pixel kleinen Punkt.
  • Auf weniger Details kann man aber leider nicht ausweichen, weil sonst die Krater verloren gehen und die Qualität des Renderings zu leiden beginnt (erst recht, falls sich tatsächlich mal zufällig jemand den Mond angucken will).
  • Die Gestirne verändern sich sehr, sehr langsam – von Vollmond bis Neumond vergehen 14 Tage. Warum also 50 Mal pro Sekunde neu zeichnen?
Lange Rede, kurzer Sinn – die Gestirne stecken bei mir in einer 256² Pixel großen Sprite. Sie wird frühstens dann aktualisiert, wenn eine Stunde in-game-Zeit vergangen ist (obwohl man den Zeitraum sicher noch ausdehnen könnte). Obwohl eine riesige Menge Details im Mond steckt, von hochauflösenden Texturen bis – bald – einem detaillierten Beleuchtungsmodell, besteht die per-Frame-Arbeit also nur im Runterrendern einer stinknormalen Sprite. Hier ist mal das Exemplar von heute mittag:
Moon Sprite.png
Moon Sprite.png (337.82 KiB) 45222 mal betrachtet
Man sieht, dass gerade Vollmond ist :) Man beachte den Kranz: Der ist notwendig, um durch Texturfilterung bedingte Ränder zu vermeiden, wenn die Textur auf eine runde Sprite gerendert wird. Für eine runde Sprite habe ich mich aus dem schlichten Grund entschieden, dass mit einer eckigen Sprite und einem Alpha-Kanal kein Anti-Aliasing möglich ist – es handelt sich schließlich um ein HDR-Bild, was bedeutet, dass ein geantialiaster Rand in einem anderen Helligkeitsraum vorliegen würde als das finale Bild und nach dem Tonemapping wieder eckig aussehen würde (was sich auch nicht vermeiden lässt, da man beim Rendern der Sprite nicht weiß, mit welcher Helligkeitskurve das Bild letztendlich ausgegeben werden wird). Erzwingt man hingegen Antialiasing durch Multisampling, das nach dem Tonemapping aufgelöst wird, erhält man ein klares Bild wie dieses hier:
Moon.png
Moon.png (74.97 KiB) 45222 mal betrachtet
Zu guter Letzt noch ein Tipp, wie man so eine Sprite am effizientesten rendert (auch, wenn es unter Einsatzbedingungen wahrscheinlich keinen Unterschied macht ;) ). Achja, da ist auch meine größte Sauerei: Um mir Input-Layout und Vertex-Buffer zu sparen, habe ich den Winkel jedes Vertex als Gleitkommazahl in einen 32-Bit-Index-Buffer gesteckt, im Vertex-Shader SV_VertexID entgegengenommen und die ID wieder zu float uminterpretiert, um per Sinus und Kosinus die Position zu berechnen. Boah, war ich stolz und mein Schlüpfer nass, als das funktionierte.
Das alles erscheint wie ein bisschen viel Arbeit für einen Himmelskörper, der auf dem Bildschirm gerade mal ein paar Pixel einnimmt – aber imo ist gerade das ein Grund, so viel zu investieren: Wenn man es nicht tut, hat man nämlich einfach ein paar helle Pixel in der Luft hängen, die keiner als irgendwas erkennt.
Zuletzt geändert von Krishty am 20.03.2011, 19:53, insgesamt 11-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Despotist
Establishment
Beiträge: 394
Registriert: 19.02.2008, 16:33

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Despotist »

Da kann ich nur sagen Hut ab vor so viel Mühe und Liebe zum Detail. Ich könnte mir nicht wochenlang so viele Gedanken machen damit ein paar Pixel etwas schöner aussehen ;). Aber ich finds toll dass es Leute gibt die es tun, ihr Wissen teilen und damit auch anderen die Möglichkeit geben sich zu verbessern. Weiter so.
Alexander Kornrumpf
Moderator
Beiträge: 2106
Registriert: 25.02.2009, 13:37

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Alexander Kornrumpf »

Speziell für dich dürfte es interessant sein zu erfahren dass effizient eine binäre Kategorie ist. Effizienter als effizient geht es nicht und am effizientesten schon gar nicht.

SCNR.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von eXile »

Sehr schön! Aber hier doch etwas Manöverkritik:

Sollte die Core.exe in einem Pfad mit Umlauten liegen, so findet er das Plugin nicht. Log-Datei:
Logdatei hat geschrieben:C:\asd ü\Core.exe
invalid ASCII sequence
The plugin's version information could not be loaded.
Add a valid VERSIONINFO resource to the module. The following fields are required:
• InternalName — the plugin's name.
• FileVersion — the plugin's version.
• LegalCopyright — copyright information.
the plugin factory "" in "C:\asd ü\Core.exe" failed
plugin (unknown) crashed; terminating
(Die Umlaute habe ich einfach mal so kopiert, wie WordPad mir die Datei angezeigt hat.) Eine andere Sache: Beim Wechsel zwischen Vollbildschirm und Fenstermodus wird die Kamerarichtung verändert. Vielleicht einfach bei einem solchen Wechsel die relative Mausposition zurücksetzen?
Krishty hat geschrieben:Für eine runde Sprite habe ich mich aus dem schlichten Grund entschieden, dass mit einer eckigen Sprite und einem Alpha-Kanal kein Anti-Aliasing möglich ist – es handelt sich schließlich um ein HDR-Bild, was bedeutet, dass ein geantialiaster Rand in einem anderen Helligkeitsraum vorliegen würde als das finale Bild und nach dem Tonemapping wieder eckig aussehen würde (was sich auch nicht vermeiden lässt, da man beim Rendern der Sprite nicht weiß, mit welcher Helligkeitskurve das Bild letztendlich ausgegeben werden wird).
Das kann ich mir graphisch irgendwie gerade nicht visualisieren. Sieht das dann eckig aus, weil der anti-aliaste Rand einfach durch das Tonemapping sehr, sehr dunkel wird, und man darum den Eindruck bekommt, es wird überhaupt gar kein Anti-Aliasing betrieben? Bei einem anderen Tonemapping könnte dann dementsprechend eine zu helle Korona an dem Anti-Aliasing-Rand erscheinen. Das prinzipielle Problem mit HDR und Alphakanälen ist mir aber klar, denn das Anti-Aliasing sollte in der Theorie erst nach dem Tonemapping erfolgen ;)
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Krishty »

eXile hat geschrieben:Sollte die Core.exe in einem Pfad mit Umlauten liegen, so findet er das Plugin nicht.
Sehr schöner Fund, danke! Keine Typsicherheit bei der Unterscheidung von ASCII und UTF-8, weil C++ noch keine UTF-8-Literale anbietet, und schon passiert sowas. Ist gefixt.
eXile hat geschrieben:(Die Umlaute habe ich einfach mal so kopiert, wie WordPad mir die Datei angezeigt hat.)
Hmm, scheinbar kann Wordpad kein UTF-8 automatisch erkennen (aber immerhin packt es die Zeilenumbrüche). Btw ist Notepad++ klasse :)
eXile hat geschrieben:Eine andere Sache: Beim Wechsel zwischen Vollbildschirm und Fenstermodus wird die Kamerarichtung verändert. Vielleicht einfach bei einem solchen Wechsel die relative Mausposition zurücksetzen?
Oha. Tatsächlich setzt D3D die Maus beim Moduswechsel immer in die Mitte zurück. Werde zusehen, wie ich das unter Kontrolle kriege.
eXile hat geschrieben:Sieht das dann eckig aus, weil der anti-aliaste Rand einfach durch das Tonemapping sehr, sehr dunkel wird, und man darum den Eindruck bekommt, es wird überhaupt gar kein Anti-Aliasing betrieben?
Ja, nur andersrum – die Sprite wäre ständig überbelichtet, weil sie – vor allem nachts – das hellste Objekt am Himmel wäre. Dann „kriecht“ die Helligkeit im Extremfall in die geantialiasten Ränder hinein, bis die Pixel ganz ausgefüllt werden und nur der volltransparente Rand als pixelige Grenze bleibt; aber auch schon vorher wird die Helligkeitskurve so verbogen, dass es kantiger erscheint.
Alexander Kornrumpf hat geschrieben:Speziell für dich dürfte es interessant sein zu erfahren dass effizient eine binäre Kategorie ist. Effizienter als effizient geht es nicht und am effizientesten schon gar nicht.
Das Wort "effektiv" ist logischerweise nicht steigerbar; entweder hat etwas einen Effekt oder nicht. Bei "effizient" hingegen lassen sich durchaus Abstufungen unterscheiden, eine bestimmte Vorgehensweise kann effizienter sein als eine andere.
(Quelle) Mehr Glück beim nächsten Mal ;)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Alexander Kornrumpf
Moderator
Beiträge: 2106
Registriert: 25.02.2009, 13:37

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Alexander Kornrumpf »

Ich denke das jetzt ausführlich zu diskutieren, insbesondere die Kompetenz von Herrn Sick in dieser Frage, wäre wohl das größte Off-Topic aller Zeiten. Auch wenn es mir wirklich schwerfällt den Schmarrn vom Sick so stehen zu lassen. Nur um nicht völlig dumm dazustehen:

1) Der Unterschied zwischen effektiv und effizient ist mir bewusst.

2) Ich bezog mich jedenfalls auf diese Definition von Effizienz:
http://books.google.de/books?id=hqog9vj ... oQ6AEwATgK

Auch hier (weniger Quellencharakter, aber dafür kürzer):
http://img115.imageshack.us/img115/7441 ... ionzl5.jpg
via
http://de.answers.yahoo.com/question/in ... 229AAD5lPg
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von kimmi »

Kann mir mal jemand sagen, was die effektiv-against-effizient-Diskussion hier zu suchen hat?

Und ich kann mir leider deine Demo nicht ansehen, da ich hier im Büro XP benutze. Aber die Bilder schauen sehr vielversprechend aus und zu Hause stürze ich mich gleich darauf.

Gruß Kimmi
Alexander Kornrumpf
Moderator
Beiträge: 2106
Registriert: 25.02.2009, 13:37

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Alexander Kornrumpf »

Hat hier nichts zu suchen, war nur eine Reaktion auf den inneren Stromschlag den ich verspürte als Krishty "am effizientesten" schrieb. Sorry.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Krishty »

Ach komm – ich hasse Wirtschaftswissenschaften viel zu sehr als dass ich jemals freiwillig einen ihrer verhudelten Fachtermini meinen würde, wenn ich ein Wort schreibe, was die doppelt belegt haben. Auf dem Bildschirm erscheint ein identisches Resultat und bewirkt dabei weniger Samples als andere Methoden, also ist es effizienter. Das hier ist Pixelschaufeln in Umgangssprache und keine Klausur in Kosten- und Leistungsrechnung – sonst könnten wir jedes zweite Wort auseinandernehmen, weil es in irgendeiner Subsparte einer Wissenschaft mal anders benutzt wurde.

@Topic: Ich habe jetzt die Helligkeit an den Öffnungswinkel angepasst; heißt, Sterne verschwinden bei weiten Öffnungswinkeln und schwache Sterne werden beim Zoom erst sichtbar.
Komischerweise habe ich hier aber ein irrsinniges Flackern in der Frame-Zeit (circa um den Faktor sechs). An der Verbesserung kann es nicht liegen (die betrifft nur ein paar Shader-Konstanten) und es verschwindet, wenn die Frame-Rate sinkt. Ich hake das erstmal als „mein Scheduler ist mir gerade ungnädig“ ab. Falls es aber bei euch auch ruckeln, flackern oder unregelmäßigen Motion-Blur produzieren sollte, meldet euch, dann werde ich der Sache auf den Grund gehen.
Habe übrigens auch noch eine falsch gefilterte Textur ersetzt, aber das schon letzte Nacht.
Und seit gerade eben ist auch dieser Bug behoben. Wenn der liebe Gott gewollt hätte, dass ich auf Koordinatensysteme klarkomme, hätte er mir Solarzellen auf die Stirn gepappt :roll:

Gerade vergessen:
Despotist hat geschrieben:Da kann ich nur sagen Hut ab vor so viel Mühe und Liebe zum Detail. Ich könnte mir nicht wochenlang so viele Gedanken machen damit ein paar Pixel etwas schöner aussehen ;). Aber ich finds toll dass es Leute gibt die es tun, ihr Wissen teilen und damit auch anderen die Möglichkeit geben sich zu verbessern. Weiter so.
Dankeschön. Ich find’s auch toll, dass es gelesen wird :)
Zuletzt geändert von Krishty am 01.03.2011, 19:09, insgesamt 4-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Alexander Kornrumpf
Moderator
Beiträge: 2106
Registriert: 25.02.2009, 13:37

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Alexander Kornrumpf »

Die Argunmente die ich gegen die von dir zitierte Quelle vorzubringen habe sind rein linguistisch, sie haben mit BWL nichts zu tun. Provozier mich noch ein wenig und ich mach einen richtig langen Post dazu im off-topic Board :)
Tejio
Establishment
Beiträge: 107
Registriert: 11.11.2010, 11:33

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Tejio »

Hallo zusammen

Erstmal riesenlob für diesen artikel, Krishty!!! da kriege ich schon beim lesen deines artikels bzw. dieses threads lust darauf, dir nachzueifern, auch wenn es lange dauern wird, um an deine arbeit ranzukommen. wie würdest du eine implementierung eines solchen algorithmus unter opengl bewerten, in hinblick auf die verfügbare technik? ich hab bisher nur kleinere spiele unter opengl entwickelt :$
vllt werde ich vergleichbare schätze im thread finden ;)
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Krishty »

Freut mich, dass er dir gefällt.

Falls du auf Motion-Blur verzichtest, ist die Implementierung mit jeder programmierbaren GPU der letzten zehn Jahre möglich. Um Motion Blur schnell realisieren und die Umsetzung generell eleganter zu machen sollte es aber schon Geometry-Shader-Unterstützung geben; das kann OpenGL – aber frag mich nicht nach Details, habe Open*L nie angerührt.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Lynxeye »

Nur zur Ergänzung: OpenGL Geometry Shader 4. Ist ein ganz schöner Brocken, aber da steht genau drin, wie Geometry Shader unter OGL funktionieren.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen

Beitrag von Krishty »

Nachtrag: Die Sternenliste befindet sich nun In Kapitel 4.3 des Artikels.
Hier mal eine aktualisierte Sternenliste – die Helligkeiten sind gemäß dieses Threads berechnet (Koordinaten und Farben sind von einer alten Version übernommen, scheinen aber zu stimmen). Dateiendung .txt ignorieren – ist nur, weil das Board keine beliebigen Dateitypen unterstützt:
Layout:

Code: Alles auswählen

class snorm2; // 16-bit signed normalized value (two's complement, little endian)
class half; // 16-bit floating-point number (IEEE 754-2008 binary16)
// or otherwise
typedef short snorm2, half;

struct Star {
    snorm2 x, y, z; // declination and right ascension of 0 at -1,0,0; polaris at 0,1,0
    half r, g, b; // cd÷m² for 45° fov at 1920 pixels × 256 (to avoid denormalized numbers)
};

assert(fileSize == 9110 * sizeof(Star));
Wenn man die Datei direkt in einen Vertex-Buffer lädt, kann man unter D3D10/11 per folgendem Input-Layout darauf zugreifen (im Shader müssen die Paare und einzelnen Werte wieder zu Tripeln zusammengefasst werden, weil Grafik-Hardware keine Formate mit drei Komponenten unterstützt):

Code: Alles auswählen

::D3D11_INPUT_ELEMENT_DESC const starElements[] = {
	{ "DIRXY", 0, ::DXGI_FORMAT_R16G16_SNORM,	0, D3D11_APPEND_ALIGNED_ELEMENT, ::D3D11_INPUT_PER_VERTEX_DATA, 0, },
	{ "DIRZ" , 0, ::DXGI_FORMAT_R16_SNORM,		0, D3D11_APPEND_ALIGNED_ELEMENT, ::D3D11_INPUT_PER_VERTEX_DATA, 0, },
	{ "LUMR" , 0, ::DXGI_FORMAT_R16_FLOAT,		0, D3D11_APPEND_ALIGNED_ELEMENT, ::D3D11_INPUT_PER_VERTEX_DATA, 0, },
	{ "LUMGB", 0, ::DXGI_FORMAT_R16G16_FLOAT,	0, D3D11_APPEND_ALIGNED_ELEMENT, ::D3D11_INPUT_PER_VERTEX_DATA, 0, },
};
Um die Sterne richtig darzustellen muss man noch einen Ausgleichsfaktor für die Konvertierung zu half (1 ÷ 256), den Zoom (doppelt so groß gezoomt => halbe scheinbare Sprite-Größe => vierfache Leuchtdichte) und die Bildauflösung (halbe Auflösung => doppelte scheinbare Größe => viertel Leuchtdichte) treffen:

Code: Alles auswählen

float const viewFactor = tan(fov);
float const resolutionFactor = resolution / 1920.0f;
float const luminanceScale = 1.0f / 256.0f / (viewFactor * viewFactor) * (resolutionFactor * resolutionFactor);
Man setzt luminanceScale als Konstante und multipliziert die Sprite-Leuchtdichte im Pixel-Shader damit.
Und damit ihr wisst, worauf ihr euch einlasst, noch ein aktueller Screenshot mit Tonemapping (inklusive Farbverschiebung, Eigengrau, Glare und Dithering):
galactic center.png
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen 2.0

Beitrag von Krishty »

Ich habe den Artikel mal generalüberholt:
  • Es gibt nun eine Schritt-für-Schritt-Anleitung. Die ist zwar immernoch abstrakt, sollte die Implementierung aber erheblich vereinfachen.
  • Ich bin schon vor über einem Jahr von Point-Sprites auf eine andere Methode umgestiegen, auf die ich bisher einfach schnell verlinkt hatte. Nun ist sie erläutert:
    • Die Implementierung ist erklärt
    • Vorteile gegenüber Point-Sprites sind aufgezählt
    • Quelltext für die benötigte Lookup-Tabelle ist gepostet
    • Es gibt Vergleichs-Schnappschüsse
  • Die überarbeitete Sternenliste und Hintergrundtextur sind verlinkt.
  • Die Tonemapping-Abschnitte, die vorher über mehrere Posts verteilt waren, sind zusammengefasst.
  • Glare ist diskutiert.
  • Es gibt neue Screenshots, auch aus Entwicklungsabschnitten, an denen man sich orientieren kann.
Gleichzeitig gibt es nun die neue Demo mit Glare.

Mein Sternenfanatismus dürfte damit vollendet sein. Ihr braucht euch aber natürlich auch weiterhin nicht zu scheuen, mich bei Fragen, Kritik und Anregungen hier anzuquatschen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Despotist
Establishment
Beiträge: 394
Registriert: 19.02.2008, 16:33

Re: Kurzartikel: Hochwertiges Rendern von Sternen 2.0

Beitrag von Despotist »

Krishty hat geschrieben: Mein Sternenfanatismus dürfte damit vollendet sein.
Wie viel Zeit (Mannjahre) hast du denn da reingesteckt (in das ganze Sternenzeug).

Und welchen spannenden Themen wendest du dich jetzt zu (klingt ja wie ein Abschluss)?
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen 2.0

Beitrag von Krishty »

Despotist hat geschrieben:Wie viel Zeit (Mannjahre) hast du denn da reingesteckt (in das ganze Sternenzeug).
Weniger, als man denkt – einen großen Teil habe ich schließlich in Glare, Tonemapping und die Engine hinter den Demos investiert … und damit kann man deutlich mehr machen als nur Sterne zu rendern. Die Monate, die ich tatsächlich ausschließlich mit Sternen verbracht habe, hatten auch einen darüber hinausweisenden Nutzen – es handelte sich ja sozusagen um die Quantenphysik der Grafikprogrammierung. Allein das Compute-Shader-Wissen, das ich mittlerweile angehäuft habe (und vor allem der unbändige Hass auf die ganze damit verbundene Pipeline), wäre auf konventionellem Wege schwer zu erarbeiten.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Kurzartikel: Hochwertiges Rendern von Sternen 2.0

Beitrag von Krishty »

Nach fast genau zehn Jahren wieder ausgegraben, weil joeydee dieses Paper gefunden hat: Digital color codes of stars
In der ursprünglichen Sternenliste haben wir die Farbe laut Spektralklasse und Stephan Theisgens Formel berechnet; das sollte ich gemäß obigem Link überholen!

Außerdem muss ich die anderen Probleme mit dem Artikel korrigieren (http statt https; Bilder sind durch irgendwelche Proxy-Sachen kaputtgegangen).
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Stephan Theisgen
Beiträge: 94
Registriert: 29.07.2003, 11:13

Re: Kurzartikel: Hochwertiges Rendern von Sternen 2.0

Beitrag von Stephan Theisgen »

Wow, mein Account funktioniert noch. Ein sehr interessantes Paper und schön zu sehen, dass es auch nach so langer Zeit immer mal wieder etwas Neues (Fortschritt) gibt.Ich frage mich gerade nur, wo zum Himmel die letzten 10 Jahre hingegangen sind...
Antworten