Was kann ich an den Raytracing-Bild noch verbessern?



  • Das liegt an der geringen Auflösung von der Hdr-Map.

    Ich habe die Hdr-Map verwendet, welche 1,4 MB groß ist (1024*512) Pixel.

    Wenn ich die 22,5 MB große Datei nehme (4096*2048), dann sieht das Bild schärfer aus:

    https://i.ibb.co/8PQBfjp/ausgabe.png

    Das 16k-Bild ist sogar 331 MB groß.


  • Mod

    Wenn du willst dass dein objekt nicht herraussticht, musst du natuerlich als erstes fuer den hintergrund dieselbe aufloesung/qualitaet haben.

    Der himmel schaut tuerkies aus, entweder stimmt was am tonemapping nicht, oder du brauchst eine andere cubemap.



  • Der Himmel erscheint Türkis, weil ich die Hdr-Map mit Faktor 4 heller gemacht habe. Als Tonemapping verwende ich für die einzelnen RGB-Farbwerte folgende Formel:

    private static float Expo(float f)
            {
                return Clamp((float)Math.Pow(f, 1 / 2.2));
            }
    
            private static float Clamp(float x)
            {
                return x < 0 ? 0 : x > 1 ? 1 : x;
            }
    

    Von folgender Seite hab ich das Hdr-Bild:
    https://hdrihaven.com/hdri/?h=wide_street_01

    Wenn du dort runter scrollst, siehst du, aus welchen Einzelbildern das Hdr-Bild erstellt wurde. Das zweite Bild in der ersten Reihe ist das Haus, was bei mir auch im Hintergrund zu sehen ist.

    Schon beim umrechnen von den Einzelbildern zum Hdr-Bild gibt es eine Farbveränderung (Könnte am Tonemapping liegen)
    In mein Vergleichsbild siehst du:
    Original-EInzelbild (Zweite Bild aus Reihe 1)
    Das von mir im Gimp geöffnete Hdr-Bild
    Meine Ausgabe mit Emission-Faktor 1 (Keine Skalierung der Helligkeit von der Hdr-Map)
    Das Bild mit Emissionfaktor 4 wie ich es im vorherigen Post gezeigt habe.
    https://i.ibb.co/FKhpzx8/Der-Vergleich.png

    Leider ist die maximale Bildauflösung momentan die 22MB-Datei. Schon bei der 89Mb-Datei bekomme ich eine OutOfMemory-Exception da ich beim Einlesen des Bildes die Daten entpacke. Um also die großen Hdr-Dateien verwenden zu können, muss ich mir ein Weg überlegen, wie ich einzelne Pixel-Werte eines Hdr-Bildes auslesen kann, ohne aber das gesamte Bild zu entpacken.

    Das Haus ist doch aber weit weg im Hintergrund und mein Objekt ist nah an der Kamera bei mir. Gilt das dann nicht als Tiefenunschärfeeffekt, wenn das Haus im Hintergrund dann unscharf ist oder MUSS es jetzt unbedingt gestochen scharf sein, damit du Fehler besser siehst?


  • Mod

    @XMAMan sagte in Was kann ich an den Raytracing-Bild noch verbessern?:

    Der Himmel erscheint Türkis, weil ich die Hdr-Map mit Faktor 4 heller gemacht habe. Als Tonemapping verwende ich für die einzelnen RGB-Farbwerte folgende Formel:

    private static float Expo(float f)
            {
                return Clamp((float)Math.Pow(f, 1 / 2.2));
            }
    
            private static float Clamp(float x)
            {
                return x < 0 ? 0 : x > 1 ? 1 : x;
            }
    

    das ist nur gamma, das ist kein tone mapping.
    clamping ist quasi ein verbrechen bei gfx programmierern, tonemapping ist was du verwendest um clamping zu verhindern. (natuerlich, zur sicherheit, kann clamping am ende verwendet werden, aber nicht als methode der farbraumeinschraenkung).
    schau dir https://www.slideshare.net/ozlael/hable-john-uncharted2-hdr-lighting an
    du hast davon quasi teil 1., teil 2 faengt auf seite 53 an.

    Fuer den anfang, implementiere doch filmic tonemapping. Damit sieht die cubemap bzw der hintergrund vielleicht eher aus wie wir es von einem bild/video erwarten wuerden.

    Das Bild mit Emissionfaktor 4 wie ich es im vorherigen Post gezeigt habe.

    Obwohl es das Bild schlechter macht? Wieso?

    Leider ist die maximale Bildauflösung momentan die 22MB-Datei. Schon bei der 89Mb-Datei bekomme ich eine OutOfMemory-Exception da ich beim Einlesen des Bildes die Daten entpacke. Um also die großen Hdr-Dateien verwenden zu können, muss ich mir ein Weg überlegen, wie ich einzelne Pixel-Werte eines Hdr-Bildes auslesen kann, ohne aber das gesamte Bild zu entpacken.

    8k/512MB sollte doch eigentlich kein OoM triggern, selbst 2GB (ist zwar nicht wenig fuer ein bild) sollte doch ein gaengiger PC schaffen. Wenn du wirklich so wenig speicher hast, behalte das bild als RGBE im speicher und konvertiere zu float3 beim zugriff.

    Das Haus ist doch aber weit weg im Hintergrund und mein Objekt ist nah an der Kamera bei mir. Gilt das dann nicht als Tiefenunschärfeeffekt, wenn das Haus im Hintergrund dann unscharf ist oder MUSS es jetzt unbedingt gestochen scharf sein, damit du Fehler besser siehst?

    Du entscheidest fuer deinen path tracer ob er jetzt seinen qualitaetszenit erreicht hat.



  • Anstatt einfach nur Gamma-Korrektur zu machen verwende ich nun ACES Filmic Tonemapping unter Verwendung der höchstmöglichen Hdr-Image-Map (16K)

    https://i.ibb.co/BKyZSFp/Der-Vergleich.png

    Ich habe das Tonemapping so implementiert:

    //https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/
            //Krzysztof Narkowicz says: you need to multiply by exposure before the tone mapping and do the gamma correction after.
            private static float ACESFilmicToneMappingCurvePixel(float x)
            {
                float a = 2.51f;
                float b = 0.03f;
                float c = 2.43f;
                float d = 0.59f;
                float e = 0.14f;
                return GammaCorrection((x * (a * x + b)) / (x * (c * x + d) + e));
            }
    
    private static float GammaCorrection(float f)
            {
                return (float)Math.Pow(f, 1 / 2.2); 
            }
    

    Ich konnte die große Hdr-Datei (331MB) verwenden, da ich das Projekt nun mit 64Bit übersetzt habe und mein Dienstlaptop mit 16GB RAM verwendet habe.

    Obwohl es das Bild schlechter macht? Wieso?

    Damit das Objekt heller erscheint. Vielleicht ist bei Verwendung von Hdr-Bildern das ändern der Helligkeit über den Exposure/Emission-Term nicht ok sondern sowas muss ich rein über Albedo und Tonemapping machen. Ich denke diese Lektion habe ich jetzt an dieser Stelle hier gelernt.

    Wie geht es nun weiter nachdem ich die nächsten beiden Anmerkungen von dir umgesetzt habe?



  • Ich finde das schwer zu vergleichen, wenn in den "nur Gamma" Bildern gleichzeitig auch die Auflösung schlechter ist. Damit sehen die automatisch schlechter aus.



  • Ok hier ist mal der direkte Vergleich wo ich überalle die 16K-Hdr-Datei nehme:

    https://i.ibb.co/3024mQ2/Der-Vergleich.png



  • OK. Ich finde das 16K Filmic sieht eindeutig besser aus 🙂


  • Mod

    @hustbaer sagte in Was kann ich an den Raytracing-Bild noch verbessern?:

    OK. Ich finde das 16K Filmic sieht eindeutig besser aus 🙂

    dem stimme ich zu, schaut besser als gimp aus.

    @XMAMan sagte in Was kann ich an den Raytracing-Bild noch verbessern?:

    Wie geht es nun weiter nachdem ich die nächsten beiden Anmerkungen von dir umgesetzt habe?

    Kannst du ein groesseres bild in guter qualitaet rendern? Vielleicht erstmal nur eine chrome kugel



  • Ok hier die Chrome-Kugel mit Filmic-Tonemapping:

    https://i.ibb.co/4frvRcy/Chrome-Sphere.jpg


  • Mod

    schaut irgendwie aus, als ob die hintergrund-cubemap eine andere rotation hat als die kugel, sodass die reflektion irgendwie nicht 100% passt.

    bei manchen pixeln in the reflektion schaut es aus als ob kein AA vorhanden ist, oder liegt das an JPG?

    der asphalt hat einen leicht roetlichereren stich als auf dem hintergrund (oder ist das schon in der cubemap?)

    ich wuerde das tonemapping anpassen dass die sonne definierter ist und weniger tuerkies zusehen ist. (oder eine mit blauen himmel waehlen, z.b. https://hdrihaven.com/hdri/?h=kiara_5_noon )



  • @rapso Ich denke die Rotation kam daher, dass ich nicht 100% in Straßenrichtung geschaut habe.

    Hier ist jetzt mal ein Bild, wo ich genau in Straßenrichtung auf die Kugel schaue. Ich stehe in der Mitte von der Straße.

    https://i.ibb.co/RQy3qhf/Chrome-Sphere.png

    Bei der Internetseite wo ich die Hdr-Datei her habe gibt es auch eine 3D-Ansicht ähnlihch wie bei Google-Streetview.

    So sieht die Front-Ansicht laut ihrer Seite aus:

    https://i.ibb.co/Dg1sL6v/Front.jpg

    und so die Backansicht:

    https://i.ibb.co/Lp9Yfqv/Back.jpg

    Wenn du jetzt nochmal diese Bilder dir anschaust, dann siehst du, das die Reflektion stimmig ist.

    Hast du die Farbwerte der Kugeln in Hex analysiert? Wenn ja wie hast du das gemacht? Ich habe das Bild jetzt in Png-Format gespeichert. Schau mal ob das so besser ist.

    Der Asphalt ist in der Mitte etwas rötlich. Das siehst du an den Front/Back-Bildern gut. Ich muss dir aber zustimmen, dass die Straße in der Kugel rötlicher wirkt als direkt die Straße vom Hintergrund. Trotz der Neuausrichtung der Kamera. Wovon der Unterschied kommt weiß ich momentan noch nicht.

    Du verwendest den Begriff Cubemap. Ich verwende hier aber Spheremapping und auch die Hdr-Map wurde aus mehr als 6 Einzelbildern erzeugt. Von daher wäre es mir lieb, wenn du das ganze Spheremap und nicht Cubemap nennst, da ich sonst mir unsicher bin, ob ich nun mit Sphere- oder Cubemapping arbeiten soll. Ich denke aber Spheremapping weil jetzt bei ein Kameraöffungswinkel von 80Grad sieht meine Ausgabe ähnlich aus wie die Ausgabe vom Front-Bild.

    D.h. ich soll die Parameter a,b,c,d,e modifizieren, damit der Himmel ein anderen Farbstich bekommt? Sowas kann ich doch nicht nach Gefühl machen. Sowas muss doch mit realen Messdaten erfolgen, um die Wirklichkeit möglichst ohne Veränderung widerzugeben.



  • @XMAMan sagte in Was kann ich an den Raytracing-Bild noch verbessern?:

    Sowas muss doch mit realen Messdaten erfolgen, um die Wirklichkeit möglichst ohne Veränderung widerzugeben.

    Ich hätte angenommen dass Tone-Mapping meistens nach Gefühl angepasst wird.

    Klar, man kann sich an sowas wie Film orientieren. Bloss dass echter Film ein brauchbares Tone-Mapping macht ist soweit ich weiss auch mehr Zufall als was anderes. Wie sich die Chemikalien da verhalten kann man ja schliesslich nicht programmieren - man kann höchstens versuchen durch Verwendung anderer Chemikalien und unterschiedlicher Temperaturen/Entwicklungszeiten etwas daran zu schrauben. Und wenn ich mir ansehe wie das in Programmen zur Nachbearbeitung von RAW Bildern gemacht wird, da gibt's auch immer zumindest einen Slider wenn nicht 2 oder 3 an denen man schrauben kann um die "Belichtung" (das Tone-Mapping) manuell anzupassen. Also um etwa die "Steilheit" des mittleren Bereichs der S-Kurve zu ändern.

    Tone-Mapping ist ja physikalisch sowieso nicht "richtig". Da geht's einfach nur darum etwas zu schaffen, was dann unter den Bedingungen unter denen das Bild halt präsentiert wird, von Menschen als halbwegs stimmig empfunden wird. Trotz dem die Dynamik des Bildes massiv komprimiert wurde. Deswegen braucht man auch unterschiedliches Tone-Mapping für Bilder die man ausdruckt vs. welche die man in hellen Räumen am Bildschirm anguckt vs. welche die man in dunklen Räumen am Bildschirm anguckt.


Anmelden zum Antworten