Was kann ich an den Raytracing-Bild noch verbessern?
-
Jetzt noch bei Nacht.
Jetzt können wir ja drüber abstimmen welche der 4 Varianten am Besten aussieht:
-
@XMAMan sagte in Was kann ich an den Raytracing-Bild noch verbessern?:
Hauptziel wäre das es physikalisch korrekt aussieht. Nebenziele wären dann Effekte wie Subsurface-Scattering/Spektrales Raytracing/Microfacet-Materialien. Also Dinge, die man noch einbauen könnnte, die interessant aussehen und über das bereits im Bild vorhandene hinausgehen. Mir gehts also darum das Bild als Anlaß zu nehmen mein Raytracer weiter zu entwickeln.
Das problem ist das es in so kuenstlichen szenen garnicht ersichtlich ist wie es aussehen soll, und mehr effekte koennen es am ende sogar in die falsche richtung schieben.
Aber dass du hdr output hast ist schonmal ein fundamentaler schritt.
Ich wuerde vorschlagen dass du "im grossen" nun darauf hinarbeitest dass dein raytracer kuenstliche objekte in bilder rein rendern kann, sodass jeder sehen kann wenn es nicht passt und es nicht 100 moegliche stellschrauben (und entsprechend viele meinungen) gibt.
Von daher schlage ich als naechsten task vor dass du hdr cubemaps laden und anzeigen kannst.
-
Gibt es eigentlich irgendwelche standardisierten Test-Szenen für Renderer?
Wäre auf jeden Fall praktisch wenn man da was hätte wo Bilder die mit anderen Renderern berechnet wurden als Vergleich zur Verfügung stehen.
-
Hallo Rapso. Schön das du dich jetzt auch hier meldest. Ich hab auf dich gewartet^^
Wenn du sagst ich soll in Bilder reinrendern, dann meinst du damit Augmented Reality?
Die Darstellung von Hdr-Cubemaps (Environmentmaps) habe ich hier verwendet, um die Reflexion zu erzeugen. D.h. komplett neu ist das Thema jetzt nicht für mich sondern ich müsste jetzt einfach hingehen und nur noch ein einzelnes Objekt erzeugen, wo das der Rest über das Umgebungslicht(Hdr-Cubemap) kommt.
-
@hustbaer
Es gibt szenen, aber meistens keine Vorgaben wie sie aussehen sollten, eine seltenheit:
https://www.graphics.cornell.edu/online/box/compare.htmlAnsonsten gibt es synthetische "szenen", z.b. "Furnace tests", wo die umgebung einfarbig ist (ja, du gibst einfach nur 0.5 oder 1.0 zurueck), so kannst du z.B. verifizieren, dass
- diffuse funktioniert, indem du bei einer sphere ueberall einheitlich die diffuse farbe siehst.
- PBR metal dass 100% reflektiv ist, "unsichtbar wird" z.b. flasch:
https://google.github.io/filament/images/material_furnace_energy_loss.png
richtig:
https://google.github.io/filament/images/material_furnace_energy_preservation.png - glass richtig ist, weil refraction+reflection+fresnel am ende auch "unsichtbar" wird.
sowas ist natuerlich langweilig anzuschauen, aber sehr nett fuer automatische regression test (Du kannst einzelne pixel oder rays schicken und musst im sehr kleinen tolleranzbereich enden)
@XMAMan sagte in Was kann ich an den Raytracing-Bild noch verbessern?:
Wenn du sagst ich soll in Bilder reinrendern, dann meinst du damit Augmented Reality?
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, klassisch:
z.b. http://www.hdrlabs.com/gallery/flashpanos_western-usa/index.html
oder https://hdrihaven.com/hdris/Ich glaube (wie bei wohl fast allem) hat Debevec damit angefangen: https://www.pauldebevec.com/Research/IBL/debevec-siggraph98.pdf
aber du findest sicherlich viele beispiele fuer IBLDie Darstellung von Hdr-Cubemaps (Environmentmaps) habe ich hier verwendet, um die Reflexion zu erzeugen. D.h. komplett neu ist das Thema jetzt nicht für mich sondern ich müsste jetzt einfach hingehen und nur noch ein einzelnes Objekt erzeugen, wo das der Rest über das Umgebungslicht(Hdr-Cubemap) kommt.
Das ist gut, dann ist der Einstieg schneller. Der "Sinn" ist aber leicht anders. zZ hast du zig effekte und komplexe, gebastelte szenen wo nicht ersichtlich ist, wo an den 100 stellschrauben es scheitert (tweaking von post effects oder tone mapping? bug in the implementierung? sind die eingangsdaten schlecht? ist dein monitor komisch eingestellt? usw.)
Deswegen mach jetzt IBL, wo du 75% das "Foto" siehst und 25% dein objekt. Erst mit einer glass Kugel in der mitte, dann chrome kugel, dann immer komplexere materialien, spaeter mal mit simplen figuren (z.B. dragon). wenn das irgendwann 99% ueberzeugend wirkt, kannst du anfangen volle szenen zu rendern und weisst es liegt (vermutlich) nicht an deinem tracer wenn es unrealitisch ausschaut.
-
Danke für die Antwort Rapso. Du hast mir erstmal wieder wichtigen guten Input geliefert. Ich schaue mir das im Detail an.
-
Ich habe mir das Paper von Paul Debevec mal angesehen. Er nimmt ein einzelnes gerendertes Objekt und dessen Schatten/Kaustiken und fügt es quasi in ein Foto ein. Damit man das machen kann, benötigt man zwei Bilder: Ein Hdr-Bild von ein Tisch (Bezeichnet er als lokale Szene) und ein Hdr-Bild von der Umgebung vom Tisch. Beide Bilder müssen mit der gleichen Blende/Belichtungszeit aufgenommen worden sein. Um das Hdr-Bild von der Umgebung zu erstellen, fotografiert er eine Metallkugel, welche an der Stelle liegt, wo dann das selbst erstellte Objekt hin soll. Wenn ich jetzt also sein Algorithmus für Augmented Reality anwenden will, dann benötige ich entweder zwei solche speziellen Hdr-Bilder oder aber eine Metallkugel(Weihnachtsbaum-Kugel), womit ich dann selber bei mir zuhause diese beiden Hdr-Bilder erzeugen kann.
Ich schau mal, ob ich entweder im Internet Szenenmaterial finde, was sein Anforderungen genügt oder ob ich eine Weihnachtsbaumkugel auftreiben kann, um selber eine Environmap zu erzeugen. Allerdings wäre das dann mit etwas Aufwand verbunden, da ich die Kugel ja genau im definierten Abstand/Richtung von zwei Seiten fotografieren müsste und wärend der Aufnahme müsste ich eine Belichtungsreihe machen, um somit Hdr-Bilder zu erzeugen. Wärend ich das ganze mache, sollte sich möglichst nicht das Sonnenlicht (Wenn ich das in der Nähe vom Fenster mache) ändern, damit beide Bilder unter gleichen Lichtverhältnissen erzeugt wurden.
Das alles ist möglich aber erforder erstmal etwas Bastelaufwand. Mal sehen ob und wie ich das hinbekomme.
-
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: