Raytracing - Kameraöffnungwinkel hat Einfluß auf die Helligkeit des Bildes



  • Hallo,

    mir ist aufgefallen, dass die Helligkeit eines Bildes von der Brennweite(Kameraöffnungswinkel) der Kamera abhängt.

    Ich habe dazu mit meiner Casio-Kamera mehrere Bilder gemacht, wo der ISO-Wert gleich, die Brennweite, gleich der Weißabgleich deaktiviert und die Blende und Belichtungszeit auch überall gleich ist. Nur der Zoomfaktor wurde verändert. Bei diesen Bildern sieht man, dass um so größer der Zoom ist, um so dunkler wird das Bild:

    https://image.ibb.co/fFr3pv/Casio_Bildreihe.jpg

    Frage: Habe ich bei mein Versuch ein Fehler gemacht oder ist das wirklich so, dass wenn man eine weiße Wand fotografiert, dann wird das Bild dunkler, wenn man näher ranzoomt? Meine Erklärung für das Verhalten: Wenn ich ranzoome und eine 10cm² großes Wandstück fotografiere, dann ist die Menge der ausgestrahlen Lichtenergie von diesen Wandstück kleiner, als wenn ich eine 1m² Wand fotografiere.

    Ich habe nun geschaut wie sich ein Raytracer verhält.

    SmallVCM (Ein Raytracer aus dem Internet), welche von Leuten geschrieben wurde, die sich beruflich mit Raytracing beschäftigen, verhält sich so, dass die Bildhelligkeit unabhängig vom Kamera-Öffnungwinkel ist.

    https://image.ibb.co/h9QXXF/SmallVCM.jpg

    Der Grund, warum das so ist, ist mir mitlerweile klar.

    Das Pfadgewicht wird nicht durch die Kamera-PdfW (Wahrscheinlichkeitsdichte, mit der der Richtungsvektor des Primärstrahl bestimmt wurde) dividiert.

    Hier wird beschrieben, wie man diese PdfW errechnet:

    http://webcache.googleusercontent.com/search?q=cache:kjfcz5xrEW8J:www.edxgraphics.com/blog/calculating-the-directional-probability-of-primary-rays+&cd=1&hl=de&ct=clnk&gl=de

    Die gleiche Formel verwendet auch SmallVCM und sie ist laut eigenen Überlegungen auch richtig.

    Der Grund, warum ich überhaupt auf dieses Thema aufmerksam geworden bin ist, da SmallVCM ein Lighttracer enthält, bei dem das Pfadgewicht mit ein 'surfaceToImageFactor' dividiert wird.

    Ich denke, diese Division wird nur deswegen gemacht, um diesen Kamera-PdfW-Term herraus zu rechen, da LighTracing als einziges von den ganzen Verfahren diese Faktor implizit enthält. Dieser surfaceToImageFactor setzt sich aus der camera-PdfW und dem Geometryterm zusammen. Wenn ich die camera-PdfW-Sache weglasse, dann ist die Helligkeit beim Lightracing vom Kamera-Öffnungswinkel abhängig. Pathtracing, bei dem man nicht durch die camera-PdfW dividiert ist immer gleichhell egal welche Brennweite ich wähle.

    // Compute pdf conversion factor from image plane area to surface area
            const float cosAtCamera = Dot(camera.mForward, -directionToCamera);
            const float imagePointToCameraDist = camera.mImagePlaneDist / cosAtCamera;
            const float imageToSolidAngleFactor = Sqr(imagePointToCameraDist) / cosAtCamera;
            const float imageToSurfaceFactor = imageToSolidAngleFactor * std::abs(cosToCamera) / Sqr(distance);
    
            // We put the virtual image plane at such a distance from the camera origin
            // that the pixel area is one and thus the image plane sampling pdf is 1.
            // The area pdf of aHitpoint as sampled from the camera is then equal to
            // the conversion factor from image plane area density to surface area density
            const float cameraPdfA = imageToSurfaceFactor;
    
            // Partial light sub-path weight [tech. rep. (46)]. Note the division by
            // mLightPathCount, which is the number of samples this technique uses.
            // This division also appears a few lines below in the framebuffer accumulation.
            const float wLight = Mis(cameraPdfA / mLightSubPathCount) * (
                mMisVmWeightFactor + aLightState.dVCM + aLightState.dVC * Mis(bsdfRevPdfW));
    
            // Partial eye sub-path weight is 0 [tech. rep. (47)]
    
            // Full path MIS weight [tech. rep. (37)]. No MIS for traditional light tracing.
            const float misWeight = mLightTraceOnly ? 1.f : (1.f / (wLight + 1.f));
    
            const float surfaceToImageFactor = 1.f / imageToSurfaceFactor;
    
            // We divide the contribution by surfaceToImageFactor to convert the (already
            // divided) pdf from surface area to image plane area, w.r.t. which the
            // pixel integral is actually defined. We also divide by the number of samples
            // this technique makes, which is equal to the number of light sub-paths
            const Vec3f contrib = misWeight * aLightState.mThroughput * bsdfFactor /
                (mLightSubPathCount * surfaceToImageFactor);
    

    https://github.com/SmallVCM/SmallVCM/blob/master/src/vertexcm.hxx

    Die Frage ist nun wer hat denn nun recht und wie muss es sein? Wenn mein Versuchsaufbau mit der Kamera und der Wand stimmt, dann wäre SmallVCM falsch. Wenn ich aber ein Fehler bei mein Versuch gemacht habe und die Helligkeit unabängig von der Brennweite ist, dann wäre SmallVCM richtig.

    All die Raytracer, die ich im Internet bis zum heutigen Tage finden konnte, sind so aufgebaut, dass sie das Pfadgewicht mit (1,1,1) festlegen und dann einfach den Primärstrahl loßschießen und erst durch die Brdf vom ersten Szenen-Hitpoint wird das Pfadgewicht dann verändert. Ich kann mir aber schwer vorstellen, dass ich der erste Mensch sein soll, dem dieser Umstand, dass die Kamera-PdfW-Division fehlt, auffällt.

    Hat jemand neben SmallVCM noch anderer Raytracer, wo er mal testen kann, ob die Helligkeit des Bildes vom Kamera-Öffnungswinkel abhängt?

    Um mein Raytracer also zu überprüfen, wollte ich die Cornellbox exakt nach den Vorgaben aufbauen wie sie hier beschrieben wurde und sie dann mit ein realen Foto(Kein gerendertes Bild) vergleichen.

    Ich war also auf dieser Seite: http://www.graphics.cornell.edu/online/box/data.html

    und habe mir die Tiff-Bilder angesehen und musste feststellen, dass die alle ganz dunkel sind. Sieht man sich das syntetisch gerenderter Bild an dann ist das nicht so dunkel. Außerdem wurden die Farbwerte auf der Internetseite so angegeben, dass sie für jeden Wellenlängenbereich die Menge(Prozentwert?) angeben. Wie rechne ich das in eine RGB-Farbe um?

    Warum sieht das syntetische Bild so aus, als ob da Toneshadding verwendet wurde? Ich habe noch nie ein Foto gesehen, das so abgehakte Rot-Farbverläufe hat.

    @Rapso: Ich habe die anderen Raytracingthemen nicht vergessen aber ich wollte erstmal dieses Kamera-PdfW-Thema verstehen bevor ich neue Dinge anfange.


  • Mod

    XMAMan schrieb:

    mir ist aufgefallen, dass die Helligkeit eines Bildes von der Brennweite(Kameraöffnungswinkel) der Kamera abhängt.

    Ich habe dazu mit meiner Casio-Kamera mehrere Bilder gemacht, wo der ISO-Wert gleich, die Brennweite, gleich der Weißabgleich deaktiviert und die Blende und Belichtungszeit auch überall gleich ist. Nur der Zoomfaktor wurde verändert. Bei diesen Bildern sieht man, dass um so größer der Zoom ist, um so dunkler wird das Bild:

    https://image.ibb.co/fFr3pv/Casio_Bildreihe.jpg

    Frage: Habe ich bei mein Versuch ein Fehler gemacht oder ist das wirklich so, dass wenn man eine weiße Wand fotografiert, dann wird das Bild dunkler, wenn man näher ranzoomt? Meine Erklärung für das Verhalten: Wenn ich ranzoome und eine 10cm² großes Wandstück fotografiere, dann ist die Menge der ausgestrahlen Lichtenergie von diesen Wandstück kleiner, als wenn ich eine 1m² Wand fotografiere.

    Sehr gute Beobachtung!

    (Rein)Zoomen == verteilen von einer kleineren Menge an Licht auf dieselbe Fläche vom Sensor ➡ rein logisch muss es dunkler werden, wenn du keinen Weissabgleich, Iso anpassung usw. hast.


Anmelden zum Antworten