Skip to content

Commit 545157b

Browse files
committed
Fix high quality edges and python integrators
1 parent f0ce53e commit 545157b

File tree

6 files changed

+45
-26
lines changed

6 files changed

+45
-26
lines changed

include/mitsuba/render/spiral.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,6 @@ class MTS_EXPORT_RENDER Spiral : public Object {
3030
/// Create a new spiral generator for the given size, offset into a larger frame, and block size
3131
Spiral(Vector2i size, Vector2i offset, size_t block_size, size_t passes = 1);
3232

33-
template <typename Film>
34-
Spiral(const Film &film, size_t block_size, size_t passes = 1)
35-
: Spiral(film->crop_size(), film->crop_offset(), block_size, passes) {}
36-
3733
/// Return the maximum block size
3834
size_t max_block_size() const { return m_block_size; }
3935

src/librender/integrator.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ SamplingIntegrator<Float, Spectrum>::render(Scene *scene,
7575

7676
ref<Film> film = sensor->film();
7777
ScalarVector2i film_size = film->crop_size();
78+
if (film->has_high_quality_edges())
79+
film_size += 2 * film->reconstruction_filter()->border_size();
7880

7981
size_t total_spp = sensor->sampler()->sample_count();
8082
size_t samples_per_pass = (m_samples_per_pass == (size_t) -1)
@@ -115,7 +117,7 @@ SamplingIntegrator<Float, Spectrum>::render(Scene *scene,
115117
m_block_size = block_size;
116118
}
117119

118-
Spiral spiral(film, m_block_size, n_passes);
120+
Spiral spiral(film_size, film->crop_offset(), m_block_size, n_passes);
119121

120122
ThreadEnvironment env;
121123
ref<ProgressReporter> progress = new ProgressReporter("Rendering");
@@ -135,13 +137,20 @@ SamplingIntegrator<Float, Spectrum>::render(Scene *scene,
135137
ref<ImageBlock> block = new ImageBlock(
136138
m_block_size, channels.size(),
137139
film->reconstruction_filter(),
138-
/* warn_negative */ !has_aovs && !is_spectral_v<Spectrum>);
140+
!has_aovs && !is_spectral_v<Spectrum> /* warn_negative */,
141+
std::is_scalar_v<Float> /* warn_invalid */,
142+
true /* border */,
143+
false /* normalize */);
139144
std::unique_ptr<Float[]> aovs(new Float[channels.size()]);
140145

141146
// For each block
142147
for (auto i = range.begin(); i != range.end() && !should_stop(); ++i) {
143148
auto [offset, size, block_id] = spiral.next_block();
144149
Assert(ek::hprod(size) != 0);
150+
151+
if (film->has_high_quality_edges())
152+
offset -= film->reconstruction_filter()->border_size();
153+
145154
block->set_size(size);
146155
block->set_offset(offset);
147156

@@ -175,7 +184,8 @@ SamplingIntegrator<Float, Spectrum>::render(Scene *scene,
175184
if (samples_per_pass != 1)
176185
idx /= (uint32_t) samples_per_pass;
177186

178-
ref<ImageBlock> block = new ImageBlock(film_size, channels.size(),
187+
ref<ImageBlock> block = new ImageBlock(film->crop_size(),
188+
channels.size(),
179189
film->reconstruction_filter(),
180190
false /* warn_negative */,
181191
false /* warn_invalid */,
@@ -187,6 +197,9 @@ SamplingIntegrator<Float, Spectrum>::render(Scene *scene,
187197
Float(idx / uint32_t(film_size[0])));
188198
std::vector<Float> aovs(channels.size());
189199

200+
if (film->has_high_quality_edges())
201+
pos -= film->reconstruction_filter()->border_size();
202+
190203
Timer timer;
191204
for (size_t i = 0; i < n_passes; i++) {
192205
render_sample(scene, sensor, sampler, block, aovs.data(),
@@ -321,16 +334,9 @@ SamplingIntegrator<Float, Spectrum>::render_sample(const Scene *scene,
321334
Float wavelength_sample = sampler->next_1d(active);
322335

323336
const Film *film = sensor->film();
324-
ScalarVector2i size = film->crop_size();
325-
ScalarVector2i offset = film->crop_offset();
326-
327-
if (film->has_high_quality_edges()) {
328-
uint32_t border_size = film->reconstruction_filter()->border_size();
329-
position_sample -= border_size;
330-
position_sample *= Vector2f(size + 2 * border_size) / size;
331-
}
332337

333-
Vector2f adjusted_position = (position_sample - offset) / size;
338+
Vector2f adjusted_position =
339+
(position_sample - film->crop_offset()) / film->crop_size();
334340

335341
auto [ray, ray_weight] = sensor->sample_ray_differential(
336342
time, wavelength_sample, adjusted_position, aperture_sample);

src/python/python/ad/integrators/integrator.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,12 @@ def sample_sensor_rays(sensor):
106106
film = sensor.film()
107107
sampler = sensor.sampler()
108108
film_size = film.crop_size()
109-
spp = sampler.sample_count()
109+
border_size = film.reconstruction_filter().border_size()
110+
111+
if film.has_high_quality_edges():
112+
film_size += 2 * border_size
110113

114+
spp = sampler.sample_count()
111115
total_sample_count = ek.hprod(film_size) * spp
112116

113117
assert sampler.wavefront_size() == total_sample_count
@@ -116,15 +120,14 @@ def sample_sensor_rays(sensor):
116120
pos_idx //= ek.opaque(UInt32, spp)
117121
pos = Vector2f(Float(pos_idx % int(film_size[0])),
118122
Float(pos_idx // int(film_size[0])))
119-
pos += film.crop_offset()
120-
pos += sampler.next_2d()
121123

122124
if film.has_high_quality_edges():
123-
border_size = film.reconstruction_filter().border_size()
124125
pos -= border_size
125-
pos *= Vector2f(film_size + 2 * border_size) / Vector2f(film_size)
126126

127-
adjusted_pos = (pos - film.crop_offset()) / Vector2f(film_size)
127+
pos += film.crop_offset()
128+
pos += sampler.next_2d()
129+
130+
adjusted_pos = (pos - film.crop_offset()) / Vector2f(film.crop_size())
128131

129132
rays, weights = sensor.sample_ray_differential(
130133
time=0.0,

src/python/python/ad/integrators/prb.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,18 @@ def render_backward(self: mitsuba.render.SamplingIntegrator,
1919
seed: int,
2020
sensor_index: int = 0,
2121
spp: int = 0) -> None:
22-
2322
sensor = scene.sensors()[sensor_index]
2423
rfilter = sensor.film().reconstruction_filter()
2524
sampler = sensor.sampler()
2625
if spp > 0:
2726
sampler.set_sample_count(spp)
2827
spp = sampler.sample_count()
29-
sampler.seed(seed, ek.hprod(sensor.film().crop_size()) * spp)
28+
29+
film_size = sensor.film().crop_size()
30+
if sensor.film().has_high_quality_edges():
31+
film_size += 2 * rfilter.border_size()
32+
33+
sampler.seed(seed, ek.hprod(film_size) * spp)
3034

3135
ray, weight, pos, _ = sample_sensor_rays(sensor)
3236

src/python/python/ad/integrators/prbvolpath.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,12 @@ def render_backward(self: mitsuba.render.SamplingIntegrator,
6464
if spp > 0:
6565
sampler.set_sample_count(spp)
6666
spp = sampler.sample_count()
67-
sampler.seed(seed, ek.hprod(sensor.film().crop_size()) * spp)
67+
68+
film_size = sensor.film().crop_size()
69+
if sensor.film().has_high_quality_edges():
70+
film_size += 2 * rfilter.border_size()
71+
72+
sampler.seed(seed, ek.hprod(film_size) * spp)
6873

6974
ray, weight, pos, _ = sample_sensor_rays(sensor)
7075

src/python/python/ad/integrators/rb.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,12 @@ def render_backward(self: mitsuba.render.SamplingIntegrator,
2929
if spp > 0:
3030
sampler.set_sample_count(spp)
3131
spp = sampler.sample_count()
32-
sampler.seed(seed, ek.hprod(sensor.film().crop_size()) * spp)
32+
33+
film_size = sensor.film().crop_size()
34+
if sensor.film().has_high_quality_edges():
35+
film_size += 2 * rfilter.border_size()
36+
37+
sampler.seed(seed, ek.hprod(film_size) * spp)
3338

3439
ray, weight, pos, _ = sample_sensor_rays(sensor)
3540

0 commit comments

Comments
 (0)