Raytracing - Ich brauche neue Ideen was ich an den Bild noch verbessern kann



  • Wenn ich das mit der Switch-Anweisung mache, dann braucht er auch 47 Sekunden zum rendern. D.h. genau so lange, wie mit der Pointerarritmethik. Das verwundert mich doch sehr, da 3 If-Anweisungen doch mehr Rechenzeit brauchen müssten, als eine Addition und Multiplikation.

    Ich benutze die Vektor-Klasse auch um darin meinen Farbwert zu speichern. Wenn ein Strahl aber kein Objekt trifft, dann zeige ich über den Null-Wert an, dass bei diesen Pixel dort nichts ist. Ich darf an der Stelle noch keine Farbe vom Hintergrundbild zurück geben, da ich beim Tonemapping die Hintergrundfarbwerte nicht mit verrechnen will/darf.

    Deswegen ist ist das eine Klasse, um es auf Null setzen zu können.


  • Mod

    das macht mich neugierig irgendwie, wie schnell es in c++ waere. Von jemand anderem die c++ version war ca 4mal schneller, aber das ist sicherlich sehr von fall zu fall abhaengig.

    wenn unabhaengig vom code die laufzeit fast gleich bleibt, bist du vielleicht memory bound. ein if bzw switch kostet dich 1 bis 20 cycle, ein cache miss kann 100cycle+ sein.



  • XMAMan schrieb:

    Wenn ich das mit der Switch-Anweisung mache, dann braucht er auch 47 Sekunden zum rendern. D.h. genau so lange, wie mit der Pointerarritmethik. Das verwundert mich doch sehr, da 3 If-Anweisungen doch mehr Rechenzeit brauchen müssten, als eine Addition und Multiplikation.

    Mich verwundert dass es mit switch nicht deutlich schneller ist. Denn fixed riecht für mich nach Pinning, und Pinning hätte ich für teuer gehalten. Aber vielleicht ist Pinning hauptsächlich hinderlich für den GC, wenn zu viel gleichzeitig gepinnt ist während ne Collection läuft. Hmmm...
    Müsste man sich den generierten Code angucken.

    Und... die switch (((uint)key) & 3u) Variante sollte er genau so optimieren können, mit dem einzigen kleinen Unterschied dass er dabei ein or reg, imm mehr braucht - was jetzt nicht die Welt kostet.

    XMAMan schrieb:

    Ich benutze die Vektor-Klasse auch um darin meinen Farbwert zu speichern. Wenn ein Strahl aber kein Objekt trifft, dann zeige ich über den Null-Wert an, dass bei diesen Pixel dort nichts ist. Ich darf an der Stelle noch keine Farbe vom Hintergrundbild zurück geben, da ich beim Tonemapping die Hintergrundfarbwerte nicht mit verrechnen will/darf.

    Deswegen ist ist das eine Klasse, um es auf Null setzen zu können.

    Dann pack nen bool zusätzlich mit rein. Ganz im Ernst. Hier nen Reference-Type zu verwenden ist doch geradezu das Textbook Example für Performance Killer.



  • Wiso ist eine Struct schneller als eine class? Die eine Variable liegt auf dem Heap, die andere auf dem Stack. Der GC muss immer dann ran, wenn ich also eine Vektor-Klasse erzeuge oder damit rechne, was ja beim Raytracen sehr häufig passiert. Habe ich stattdessen eine Struct, geht das erzeugen(und somit rechnen) schneller. Ist das der Grund warum du mir Struct empfielst? Wenn das wirklich stimmen sollte, dann sollte ich die Klasse Vektor, Ray und all so anderes Zeug, was für jedes Pixelsamples mehrmals erzeugt wird, überdenken.

    Ich bräuchte mal ein Programm, womit man feststellen kann, ob der Garbage Collecdtor der Flaschenhals ist.

    @Update:
    Ich habe mal Testweise Vektor-class durch Vektor-struct ersetzt. Das Problem mit den Farbwert, der anzeigt, ob ein Objekt getroffen wurde, habe ich dadurch gelößt, dass ich Vektor? bei der Methode zurück gebe. Die Renderzeit ist durch die Struct 1-2 Sekunden langsamer. Schade... War ne gute Idee aber so einfach läßt sich C# nicht austricksen.



  • XMAMan schrieb:

    Mein nächstes Bild wird diesmal eine Nahaufnahme von kleinen Gegenständen sein. Sowas muss auch mal sein^^ Dort möchte ich mich um Subsurface Scattering kümmern.

    Ohne Tiefenunschärfe:
    https://picload.org/image/rodpowrg/test.png

    Mit Tiefenunschärfe
    https://picload.org/image/rodwgpll/test.png

    Ich hab den Raytracer in den letzten 8 Wochen jetzt nochmal komplett neu geschrieben und nun sieht das Bild auch schon viel besser aus.

    https://img1.picload.org/image/rwrpwagi/schneeman.jpg


  • Mod

    schaut immer besser aus 😉

    die pflanze im hintergrund schaut irgendwie seltsam zerschnitten aus im bereich vor dem licht. wobei das durch bokeh kommen kann, schaut dennoch ungewohnt aus fuer mein auge.
    vielleicht stimmt was nicht mit dem sample selektieren, fuers DOF.



  • Wenn du damit das ganz rechte Blatt meinst, was vor dem Fenster ist, dann denke ich, dass es einfach vom Fenster überstrahl wird. Selbst vor der Wand ist es ja kaum 1 Pixel breit, da man dort seitlich draufschaut.

    Ich habe jetzt noch ein Topf hinzugefügt:

    https://img1.picload.org/image/rwdcdrdl/schneeman1.jpg


  • Mod

    Ich meinte alle Blätter, die sehen aus als ob sie aliasing bei der ueberstrahlung haben. Das schaut aus als wuerde etwas nicht stimmen.

    https://picload.org/view/rwdcagll/aliasing.jpg.html



  • Der Grund warum es genau vor der Lichtquelle Aliasingeffekte gibt und vor der Wand nicht ist folgender.

    Die Wand und das Blatt ist ungefähr gleichhell. Bilde ich den Durchschnittswert zwischen (0.5; 0.5; 0.5) = Wand und (0; 0.5; 0) Blatt, dann erhalte ich (0.25; 0.5; 0.25).

    Bild ich aber den Durchschnitt zwischen Fenster (100; 100; 100) und Blatt (0.5; 0.5; 0.5) dann erhalte ich ~ (50; 50; 50). Das Grün wird quasi weggewichtet. Damit ich aber ein schönes Farbverlauf zwischen Grün und Weiß erhalte, müssen beide Farben ungfähr gleichhell sein.

    Beim umrechnen eines Farbwertes, wie es der Raytracer erzeugt, gehe ich so vor, dass ich alles, was über 1 ist wegschneide. D.h. (100; 100; 100) wird zu (1;1;1) Nun multipliziere ich noch mit 255 und erhalte so die RGB-Werte. Auf die Weise verschwindet dann das grüne Blatt vor dem Fenster.


  • Mod

    XMAMan schrieb:

    Bild ich aber den Durchschnitt zwischen Fenster (100; 100; 100) und Blatt (0.5; 0.5; 0.5) dann erhalte ich ~ (50; 50; 50). Das Grün wird quasi weggewichtet. Damit ich aber ein schönes Farbverlauf zwischen Grün und Weiß erhalte, müssen beide Farben ungfähr gleichhell sein.

    selbst dann sollte es durch die abnehmender/zunehmende abdeckung faelle geben, wo du z.b. 90% oder 99% vom blatt hast.

    Beim umrechnen eines Farbwertes, wie es der Raytracer erzeugt, gehe ich so vor, dass ich alles, was über 1 ist wegschneide. D.h. (100; 100; 100) wird zu (1;1;1) Nun multipliziere ich noch mit 255 und erhalte so die RGB-Werte. Auf die Weise verschwindet dann das grüne Blatt vor dem Fenster.

    Kann man machen, aber das ist wirklich nicht so gut. Du brauchst tonemapping

    http://filmicworlds.com/blog/filmic-tonemapping-operators/
    https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/
    https://de.slideshare.net/ozlael/hable-john-uncharted2-hdr-lighting



  • rapso schrieb:

    Kann man machen, aber das ist wirklich nicht so gut. Du brauchst tonemapping

    http://filmicworlds.com/blog/filmic-tonemapping-operators/
    https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/
    https://de.slideshare.net/ozlael/hable-john-uncharted2-hdr-lighting

    Ich habe jetzt sämtliche Tonemapping-Operatoren die du mir gegeben hast eingebaut und so sieht das aus:

    https://image.ibb.co/kYec1a/Tonemapping_Result.jpg

    Ich finde bei vielen von diesen Operatoren sehen die Farben einfach nicht mehr so kräftig aus. Schön wäre es ja, wenn es da was gäbe, was schön satte Farben erzeugt und trotzdem mit verschiedenen Helligkeitsstufen klar kommt.


  • Mod

    ich finde das schaut schon nicht schlecht aus, gerade ACES!

    An sich gibt es zwei (bzw 3) vorgehensweisen das zu verbessern
    1. du speicherst die bilder in einem HDR format ab, z.B. rgbe und dann kannst du in photoshop/gimp as tonemapping machen.
    2. du gibst die regler in deinem tool, damit artist das interaktiv aendern
    3. bei Filmen kommt es auf den eigentlich Film in der kamera an. Die sind deswegen auch so teuer, weil es sehr viele verisonen gibt von denen alle ganz genau spezifiziert sind und je nach situation (helligkeit, bewegungsschnelligkeit, kamera, framerate, gewuenschter effekt wie z.B. grain) ein spezieller film ausgesucht wird. Alles noetige zu wissen ist schon viel arbeit, darin profi zu sein macht dann den ueberbezahlten seltenen fachmann aus: https://photo.stackexchange.com/questions/60707/how-to-read-a-film-color-response-chart

    Ich wuerde dir vorschlagen immer 2 bilder auszugeben, ein in HDR, ein schon nach tonemapping als platzsparendes jpg. (So wie es DSLRs machen).


Anmelden zum Antworten