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: 8227
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: 8227
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: 8227
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: 8227
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: 8227
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: 8227
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