-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_envmap.py
108 lines (90 loc) · 3.62 KB
/
test_envmap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import numpy as np
import os
import mitsuba
import enoki as ek
mts_variant = 'rgb'
mitsuba.set_variant('gpu_autodiff_' + mts_variant)
from mitsuba.core import Transform4f, Bitmap
from mitsuba.core.xml import load_string
from mitsuba.python.util import traverse
from utils import test_finite_difference
test_name = "test_envmap"
def make_scene(integrator, spp, param):
return load_string("""
<?xml version="1.0"?>
<scene version="2.0.0">
{integrator}
<sensor type="perspective">
<string name="fov_axis" value="smaller"/>
<float name="near_clip" value="0.1"/>
<float name="far_clip" value="2800"/>
<float name="focus_distance" value="1000"/>
<transform name="to_world">
<lookat origin="0, 0, 10" target="0, 0, 0" up="0, 1, 0"/>
</transform>
<float name="fov" value="10"/>
<sampler type="independent">
<integer name="sample_count" value="{spp}"/>
</sampler>
<film type="hdrfilm">
<integer name="width" value="250"/>
<integer name="height" value="250"/>
<rfilter type="box"/>
</film>
</sensor>
<emitter type="envmap">
<float name="scale" value="1"/>
<string name="filename" value="data/maps/sun.exr"/>
<transform name="to_world">
<rotate x="1.0" angle="90"/>
</transform>
</emitter>
<shape type="obj" id="object">
<string name="filename" value="data/meshes/smooth_empty_cube.obj"/>
<bsdf type="diffuse" id="objectmat">
</bsdf>
<transform name="to_world">
<translate z="0.6"/>
<translate x="{param}"/>
</transform>
</shape>
<shape type="obj" id="planemesh">
<string name="filename" value="data/meshes/xy_plane.obj"/>
<bsdf type="diffuse">
<rgb name="reflectance" value="0.8 0.8 0.8"/>
</bsdf>
<transform name="to_world">
<scale value="2.0"/>
</transform>
</shape>
</scene>
""".format(integrator=integrator, spp=spp, param=param))
def get_diff_param(scene):
# Create a differentiable hyperparameter
diff_param = mitsuba.core.Float(0.0);
ek.set_requires_gradient(diff_param);
# Update vertices so that they depend on diff_param
properties = traverse(scene)
t = mitsuba.core.Transform4f.translate(mitsuba.core.Vector3f(1.0,0.0,0.0) * diff_param)
vertex_positions = properties['object.vertex_positions']
vertex_positions_t = t.transform_point(vertex_positions)
properties['object.vertex_positions'] = vertex_positions_t
# Update the scene
properties.update()
return diff_param
# Test settings and integrators
fd_eps = 0.001
fd_spp = 256
fd_passes = 10
fd_integrator = """<integrator type="path">
<integer name="max_depth" value="2"/>
</integrator>"""
diff_spp = 4
diff_passes = 10
diff_integrator = """<integrator type="pathreparam">
<integer name="max_depth" value="2"/>
<boolean name="use_convolution_envmap" value="false"/>
</integrator>"""
test_finite_difference(test_name, make_scene, get_diff_param,
diff_integrator, diff_spp, diff_passes,
fd_integrator, fd_spp, fd_passes, fd_eps)