mitsuba-renderer / mitsuba2

Mitsuba 2: A Retargetable Forward and Inverse Renderer
Other
2.04k stars 267 forks source link

[❔ other question] How to split "aov" rendering while remaining differentiable? #559

Open Agent-INF opened 2 years ago

Agent-INF commented 2 years ago

Summary

How to split differentiable render results of an "aov" integrator?

Description

I have a scene with an aov integrator defined as follows:

    <integrator type="aov">
        <string name="aovs" value="depth.y:depth"/>
        <integrator type="path">
          <integer name="max_depth" value="$max_depth"/>
        </integrator>
    </integrator>

then I render the scene following the tutorial https://mitsuba2.readthedocs.io/en/latest/src/inverse_rendering/diff_render.html:

 image = render(scene, optimizer=opt, unbiased=True, spp=1)

I want to optimize the depth and RGB channel separately in a gradient-based manner, so I tried:

 render_list = image.split()

but it gives me the following error:

AttributeError: 'enoki.cuda_autodiff.Float32' object has no attribute 'split'

So what I want to ask is, what is the suitable way to split the aov rendering results while keeping them differentiable? Thank you in advance!

Speierers commented 2 years ago

Hi @Agent-INF Unfortunately this is not currently supported in the Python render() function, but will be in the upcoming next release of the codebase.

You can take a look at the insides of the render() function and try to intercept the aov Float channels there.

Note also that differentiating a depth buffer requires visibility discontinuies to be handled properly, e.g. see PR #157 .

Good luck!

Agent-INF commented 2 years ago

Thank you very much for your reply! Looking forward to the upcoming next release!