mmp / pbrt-v4

Source code to pbrt, the ray tracer described in the forthcoming 4th edition of the "Physically Based Rendering: From Theory to Implementation" book.
https://pbrt.org
Apache License 2.0
2.81k stars 433 forks source link

Equivalent of Kt and Kr in dielectric material? #434

Open gugray opened 3 weeks ago

gugray commented 3 weeks ago

I am trying to achieve the effect of colored glass in v4. Information I have found online (e.g. here) points me to the Kt property of the glass material in v3. "color Kt" [0.7 1 0.7 ]

v4's dielectric material does not have the Kt ad Kr properties which were available for glass in v3. If I try and start from a v3 file with glass, the --upgrade function converts "color Kt" [0.7 1 0.7 ] to "rgb Kt" [0.7 1 0.7 ]. The result, however, is rejected by v4 with the error ""Kr": unused parameter".

What is the right way to achieve colored glass in v4?

shadeops commented 3 weeks ago

In pbrt-v4 I believe the approach to take is to use a homogeneous Medium and set the appropriate absorption values.

red_glass

Left sphere is a diffuse transmission, right sphere is a default dielectric with a interior medium that absorbs everything but red.

gugray commented 3 weeks ago

Thank you! May I trouble you to include an XML snippet for the two spheres?

shadeops commented 3 weeks ago
PixelFilter "gaussian" "float xradius" [ 2 ] "float yradius" [ 2 ]
Sampler "zsobol" "integer pixelsamples" [ 8192 ]
Integrator "volpath" "integer maxdepth" [ 5 ]
Accelerator "bvh"
Film "gbuffer"
    "string filename" [ "pbrt.exr" ]
    "integer xresolution" [ 1280 ]
    "integer yresolution" [ 720 ]

Transform [ 0.707106781186547462 -0.353553390593273731 -0.612372435695794581 0.0
            0 0.866025403784438597 -0.5 0.0
           -0.707106781186547573 -0.353553390593273897 -0.612372435695794359 0.0
            0.0 0.0 4.0 1.0 ]
Camera "perspective" "float fov" [ 45 ] "float screenwindow" [ -1 1 -0.5625 0.5625 ]

WorldBegin

    AttributeBegin
        Translate -2 3 0
        Rotate -50 0 0 1
        Rotate -90 0 1 0
        AreaLightSource "diffuse"
            "float scale" [ 200 ]
            "bool twosided" [ false ]
        AttributeBegin
            Rotate 180 1 0 0
            Shape "disk" "float radius" [ 0.25 ]
        AttributeEnd
    AttributeEnd

    Texture "/mat/checkerboard" "spectrum" "checkerboard"
        "rgb tex1" [ 0.75 0.75 0.75 ]
        "rgb tex2" [ 0.3 0.3 0.3 ]
        "float uscale" [ 300 ]
        "float vscale" [ 300 ]

    MakeNamedMaterial "/mat/ground"
        "string type"
        "diffuse" "texture reflectance" [ "/mat/checkerboard" ]

    MakeNamedMaterial "/mat/red_diffuse"
        "string type" "diffusetransmission"
        "rgb transmittance" [ 1 0 0 ]

    MakeNamedMaterial "/mat/glass" "string type" "dielectric"
        "rgb eta" [ 1.33 1.33 1.33 ]
        "float roughness" [ 0.001 ]

    AttributeBegin
        MakeNamedMedium "/mat/red_interior"
            "string type" "homogeneous"
            "float scale" [ 10 ]
            "rgb sigma_a" [ 0.01 1.0 1.0 ]
            "rgb sigma_s" [ 0.01 0.01 0.01 ]
    AttributeEnd

    AttributeBegin
        NamedMaterial "/mat/ground"
        AttributeBegin
            ReverseOrientation
            Shape "bilinearmesh"
                "normal N" [ 0 1 0 0 1 0 0 1 0 0 1 0 ]
                "point3 P" [ -50 0 -50 50 0 -50 -50 0 50 50 0 50 ]
                "integer indices" [ 0 1 2 3 ]
        AttributeEnd
    AttributeEnd

    AttributeBegin
        Translate -0.25 0.5 0.25
        Scale 0.2 0.2 0.2
        NamedMaterial "/mat/red_diffuse"
        AttributeBegin
            Shape "sphere"
        AttributeEnd
    AttributeEnd

    AttributeBegin
        Translate 0.25 0.5 -0.25
        Scale 0.2 0.2 0.2
        NamedMaterial "/mat/glass"
        MediumInterface "/mat/red_interior" ""
        AttributeBegin
            Shape "sphere"
        AttributeEnd
    AttributeEnd

I used the GPU (volume pathtracer), then ran it through imgtool's denoiser.