Was kann ich an den Raytracing-Bild noch verbessern?
-
Das ist spaeter sicherlich moeglich, aber als erstes reicht es wenn du einfach objekte in cubemaps renderst (also wirklicht kugel, schwebend im raum). Du findest im netz viele HDR cubemaps,
Wozu ueberspringst du die simple loesung wenn dir klar ist:
Allerdings wäre das dann mit etwas Aufwand verbunden
-
Ich habe die Lösung ja nicht übersprungen. Ich dachte nur es wäre nicht nötig^^
Also ok. Ich habe jetzt hier 4 Kugeln genommen und sie mit ein Hdr-Bild erstellt:
Die Quelle für das Hdr-Bild habe ich von hier und dort habe ich auch die Idee für die 4 Kugeleln her:
Link TextMeinst du das jetzt so oder noch ganz anders?
-
wo du 75% das "Foto" siehst und 25% dein objekt
auf deinem bild sehe ich 100% deine 3d objekte.
ein sehr alter test von mir https://ibb.co/rc0MDBH (ist nicht path tracing sondern nur normales rendering, lief auf dem alten macbook air wo eine nvidia gpu drin war).
Schau dir mal auf seite 8 an wie die es machen: https://renderwonk.com/publications/s2010-shading-course/snow/sigg2010_physhadcourse_ILM.pdf
(oder auch https://i2.wp.com/www.artofvfx.com/Avengers3/Avengers3_ILM_ITW_06A.jpg von https://www.artofvfx.com/avengers-infinity-war-russell-earl-vfx-supervisor-industrial-light-magic/ )Die idee ist, dass du das sowohl dein objekt als auch die echte aufnahme siehst, damit du siehst wo es scheitert bzw noch mangelt. (es geht nicht um AR! sondern einfach nur dein 3D model mittig im bild oder ins bild ragend).
-
Ok ich habe mein Legoman jetzt freischwebend hier reingesetzt in mitten vom Hdr-Bild (Und übers Hdr-Bild beleuchtet)
https://i.ibb.co/R3Zx2bS/ausgabe.png
https://i.ibb.co/RQ2VmLr/ausgabe.png
Ich muss jetzt mal schauen, wie das ganze Aussieht, wenn ich verschiedene Materialien verwende. Meine momentane MaterialTest-Ausgabe ist das hier:https://i.ibb.co/MhQ7Syb/Raytracing-Materials.jpg
Hier verwende ich ja eine diffuse Lichtquelle und diffuse Wände. Also lasse ich jetzt einfach die Wände und diffuse Lichtquelle weg und beleuchte alles nur wie im ersten Bild über Hdr? Ich bin gespannt was da rauskommt. Ob das neue Fehler aufdeckt. Aber zumindest finde ich die Idee Umgebungslicht zu nehmen an sich sehr gut, weil es doch realistischwer wirkt.
Habe das bis jetzt nie so aufm Schirm gehabt.
-
Hier sind meine ersten vorsichtigen Versuche die Legofigur freischwebend per Hdr zu beleuchten.
https://s12.directupload.net/images/201122/mskqtsor.jpg
Ich muss sagen das bringt ganz neue Probleme mit sich^^ Auf einmal macht es ein riesen Unterschied, welchen Wert man beim Diffuse-Albedo und welchen beim Specular-Albedo verwendet. Es ist sehr wichtig, dass Diffuse-Albedo deutlich kleiner als Specular-Albedo ist, da sonst diffuse Objekte im Vergleich zum spiegelnden viel zu hell sind. Außerdem ist Tonemapping wichtig, da das Sonnenlicht im Verhältnis zum Rest des Bildes sehr hell ist.
Ich kann ja nun als nächstes anstelle der Legofigur nun eine freischwebende Kugel nehmen.
Das könnte dann so aussehen:
https://i.ibb.co/vJpTDgM/Raytracing-Materials3.jpg
Aber wie geht es jetzt weiter? Mir fällt es leichter, wenn ich ein konkretes Zielvorgabebild habe, an den ich mich orientieren kann. Ich habe nun die Kugeln + Legelfigur freischwebend wie gefordert aber weiß nun nicht, wie ich da nun unstimmigkeien/Fehler finden kann.
-
wieso schaut die HDR cubemap wie eine N64 textur aus?
-
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ß.
-
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_01Wenn 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.pngLeider 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?
-
@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:
-
OK. Ich finde das 16K Filmic sieht eindeutig besser aus
-
@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:
-
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.