Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use regular AOVs to export diagnostic AOVs #2121

Merged
merged 13 commits into from
Jul 19, 2018
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project format_revision="26">
<project format_revision="27">
<scene>
<camera name="camera" model="pinhole_camera">
<parameter name="film_dimensions" value="0.025 0.025" />
Expand Down
10 changes: 0 additions & 10 deletions src/appleseed.studio/mainwindow/renderingsettingswindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -467,12 +467,10 @@ namespace
create_direct_link("uniform_sampler.samples", "uniform_pixel_renderer.samples");
create_direct_link("uniform_sampler.force_antialiasing", "uniform_pixel_renderer.force_antialiasing");
create_direct_link("uniform_sampler.decorrelate_pixels", "uniform_pixel_renderer.decorrelate_pixels");
create_direct_link("uniform_sampler.enable_diagnostics", "uniform_pixel_renderer.enable_diagnostics");

create_direct_link("adaptive_sampler.min_samples", "adaptive_pixel_renderer.min_samples");
create_direct_link("adaptive_sampler.max_samples", "adaptive_pixel_renderer.max_samples");
create_direct_link("adaptive_sampler.quality", "adaptive_pixel_renderer.quality");
create_direct_link("adaptive_sampler.enable_diagnostics", "adaptive_pixel_renderer.enable_diagnostics");

load_directly_linked_values(config);
}
Expand Down Expand Up @@ -555,10 +553,6 @@ namespace
m_uniform_sampler_decorrelate_pixels->setToolTip(m_params_metadata.get_path("uniform_pixel_renderer.decorrelate_pixels.help"));
layout->addWidget(m_uniform_sampler_decorrelate_pixels);

QCheckBox* enable_diagnostics = create_checkbox("uniform_sampler.enable_diagnostics", "Enable Diagnostic AOVs");
enable_diagnostics->setToolTip(m_params_metadata.get_path("uniform_pixel_renderer.enable_diagnostics.help"));
layout->addWidget(enable_diagnostics);

connect(
m_image_plane_sampler_passes, SIGNAL(valueChanged(const int)),
SLOT(slot_changed_image_plane_sampler_passes(const int)));
Expand Down Expand Up @@ -586,10 +580,6 @@ namespace
QDoubleSpinBox* quality = create_double_input("adaptive_sampler.quality", -20.0, +20.0, 2, 0.5);
quality->setToolTip(m_params_metadata.get_path("adaptive_pixel_renderer.quality.help"));
sublayout->addRow("Quality:", quality);

QCheckBox* enable_diagnostics = create_checkbox("adaptive_sampler.enable_diagnostics", "Enable Diagnostic AOVs");
enable_diagnostics->setToolTip(m_params_metadata.get_path("adaptive_pixel_renderer.enable_diagnostics.help"));
layout->addWidget(enable_diagnostics);
}

private slots:
Expand Down
2 changes: 2 additions & 0 deletions src/appleseed/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1399,6 +1399,8 @@ set (renderer_modeling_aov_sources
renderer/modeling/aov/denoiseraov.h
renderer/modeling/aov/depthaov.cpp
renderer/modeling/aov/depthaov.h
renderer/modeling/aov/diagnosticaov.cpp
renderer/modeling/aov/diagnosticaov.h
renderer/modeling/aov/diffuseaov.cpp
renderer/modeling/aov/diffuseaov.h
renderer/modeling/aov/emissionaov.cpp
Expand Down
1 change: 1 addition & 0 deletions src/appleseed/renderer/api/aov.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include "renderer/modeling/aov/aovfactoryregistrar.h"
#include "renderer/modeling/aov/aovtraits.h"
#include "renderer/modeling/aov/depthaov.h"
#include "renderer/modeling/aov/diagnosticaov.h"
#include "renderer/modeling/aov/diffuseaov.h"
#include "renderer/modeling/aov/emissionaov.h"
#include "renderer/modeling/aov/glossyaov.h"
Expand Down
20 changes: 20 additions & 0 deletions src/appleseed/renderer/kernel/aov/tilestack.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@ class TileStack
const size_t i,
const foundation::Color4f& color) const;

foundation::Tile& get_tile(
const size_t index);

const foundation::Tile& get_tile(
const size_t index) const;

private:
foundation::Tile* m_tiles[MaxAOVCount];
size_t m_size;
Expand Down Expand Up @@ -99,6 +105,20 @@ inline void TileStack::set_pixel(
m_tiles[i]->set_pixel(x, y, color);
}

inline foundation::Tile& TileStack::get_tile(
const size_t index)
{
assert(index < m_size);
return *m_tiles[index];
}

inline const foundation::Tile& TileStack::get_tile(
const size_t index) const
{
assert(index < m_size);
return *m_tiles[index];
}

} // namespace renderer

#endif // !APPLESEED_RENDERER_KERNEL_AOV_TILESTACK_H
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
#include "renderer/kernel/rendering/pixelrendererbase.h"
#include "renderer/kernel/rendering/shadingresultframebuffer.h"
#include "renderer/kernel/shading/shadingresult.h"
#include "renderer/modeling/aov/aov.h"
#include "renderer/modeling/frame/frame.h"
#include "renderer/utility/settingsparsing.h"

Expand Down Expand Up @@ -86,22 +87,14 @@ namespace
ISampleRendererFactory* factory,
const ParamArray& params,
const size_t thread_index)
: PixelRendererBase(frame, thread_index, params)
: PixelRendererBase()
, m_params(params)
, m_sample_renderer(factory->create(thread_index))
, m_sample_aov_tile(nullptr)
, m_variation_aov_tile(nullptr)
{
if (are_diagnostics_enabled())
{
m_variation_aov_index = frame.create_extra_aov_image("variation");
m_samples_aov_index = frame.create_extra_aov_image("samples");

if ((thread_index == 0) && (m_variation_aov_index == ~size_t(0) || m_samples_aov_index == ~size_t(0)))
{
RENDERER_LOG_WARNING(
"could not create some of the diagnostic aovs, maximum number of aovs (" FMT_SIZE_T ") reached.",
MaxAOVCount);
}
}
m_variation_aov_index = frame.aovs().get_index("pixel_variation");
m_sample_aov_index = frame.aovs().get_index("pixel_sample");
}

void release() override
Expand All @@ -115,22 +108,27 @@ namespace
"adaptive pixel renderer settings:\n"
" min samples %s\n"
" max samples %s\n"
" max variation %f\n"
" diagnostics %s",
" max variation %f",
pretty_uint(m_params.m_min_samples).c_str(),
pretty_uint(m_params.m_max_samples).c_str(),
m_params.m_max_variation,
are_diagnostics_enabled() ? "on" : "off");
m_params.m_max_variation);

m_sample_renderer->print_settings();
}

void on_tile_begin(
const Frame& frame,
const size_t tile_x,
const size_t tile_y,
Tile& tile,
TileStack& aov_tiles) override
{
PixelRendererBase::on_tile_begin(frame, tile, aov_tiles);
PixelRendererBase::on_tile_begin(
frame,
tile_x,
tile_y,
tile,
aov_tiles);

m_scratch_fb_half_width = truncate<int>(ceil(frame.get_filter().get_xradius()));
m_scratch_fb_half_height = truncate<int>(ceil(frame.get_filter().get_yradius()));
Expand All @@ -142,40 +140,29 @@ namespace
frame.aov_images().size(),
frame.get_filter()));

if (are_diagnostics_enabled())
{
m_diagnostics.reset(new Tile(
tile.get_width(), tile.get_height(), 2, PixelFormatFloat));
}
if (m_sample_aov_index != ~size_t(0))
m_sample_aov_tile = &frame.aovs().get_by_index(m_sample_aov_index)->get_image().tile(tile_x, tile_y);

if (m_variation_aov_index != ~size_t(0))
m_variation_aov_tile = &frame.aovs().get_by_index(m_variation_aov_index)->get_image().tile(tile_x, tile_y);
}

void on_tile_end(
const Frame& frame,
const size_t tile_x,
const size_t tile_y,
Tile& tile,
TileStack& aov_tiles) override
{
PixelRendererBase::on_tile_end(frame, tile, aov_tiles);

if (are_diagnostics_enabled())
{
const size_t width = tile.get_width();
const size_t height = tile.get_height();

for (size_t y = 0; y < height; ++y)
{
for (size_t x = 0; x < width; ++x)
{
Color<float, 2> values;
m_diagnostics->get_pixel(x, y, values);

if (m_variation_aov_index != ~size_t(0))
aov_tiles.set_pixel(x, y, m_variation_aov_index, scalar_to_color(values[0]));

if (m_samples_aov_index != ~size_t(0))
aov_tiles.set_pixel(x, y, m_samples_aov_index, scalar_to_color(values[1]));
}
}
}
PixelRendererBase::on_tile_end(
frame,
tile_x,
tile_y,
tile,
aov_tiles);

m_sample_aov_tile = nullptr;
m_variation_aov_tile = nullptr;
}

void render_pixel(
Expand Down Expand Up @@ -293,28 +280,29 @@ namespace
}

// Store diagnostics values in the diagnostics tile.
if (are_diagnostics_enabled() && tile_bbox.contains(pt))
if ((m_sample_aov_tile || m_variation_aov_tile) && tile_bbox.contains(pt))
{
Color<float, 2> values;

values[0] =
saturate(
max(
trackers[0].get_variation(),
trackers[1].get_variation(),
trackers[2].get_variation())
/ m_params.m_max_variation);

values[1] =
m_params.m_min_samples == m_params.m_max_samples
? 1.0f
: fit(
static_cast<float>(trackers[0].get_size()),
static_cast<float>(m_params.m_min_samples),
static_cast<float>(m_params.m_max_samples),
0.0f, 1.0f);

m_diagnostics->set_pixel(pt.x, pt.y, values);
Color3f value(0.0f, 0.0f, 0.0f);

if (m_sample_aov_tile)
{
value[0] = trackers[0].get_size();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You need a static_cast<> here as in general this will loose precision.


m_sample_aov_tile->set_pixel(pt.x, pt.y, value);
}

if (m_variation_aov_tile)
{
value[0] =
saturate(
max(
trackers[0].get_variation(),
trackers[1].get_variation(),
trackers[2].get_variation())
/ m_params.m_max_variation);

m_variation_aov_tile->set_pixel(pt.x, pt.y, value);
}
}

on_pixel_end(pi, pt, tile_bbox, aov_accumulators);
Expand Down Expand Up @@ -350,18 +338,12 @@ namespace
const Parameters m_params;
auto_release_ptr<ISampleRenderer> m_sample_renderer;
size_t m_variation_aov_index;
size_t m_samples_aov_index;
size_t m_sample_aov_index;
int m_scratch_fb_half_width;
int m_scratch_fb_half_height;
unique_ptr<ShadingResultFrameBuffer> m_scratch_fb;
unique_ptr<Tile> m_diagnostics;

static Color4f scalar_to_color(const float value)
{
static const Color4f Blue(0.0f, 0.0f, 1.0f, 1.0f);
static const Color4f Red(1.0f, 0.0f, 0.0f, 1.0f);
return lerp(Blue, Red, saturate(value));
}
Tile* m_sample_aov_tile;
Tile* m_variation_aov_tile;
};
}

Expand Down Expand Up @@ -397,7 +379,7 @@ IPixelRenderer* AdaptivePixelRendererFactory::create(

Dictionary AdaptivePixelRendererFactory::get_params_metadata()
{
Dictionary metadata = PixelRendererBaseFactory::get_params_metadata();
Dictionary metadata;

metadata.dictionaries().insert(
"min_samples",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
#define APPLESEED_RENDERER_KERNEL_RENDERING_FINAL_ADAPTIVEPIXELRENDERER_H

// appleseed.renderer headers.
#include "renderer/kernel/rendering/pixelrendererbase.h"
#include "renderer/kernel/rendering/ipixelrenderer.h"
#include "renderer/utility/paramarray.h"

// appleseed.foundation headers.
Expand All @@ -53,7 +53,7 @@ namespace renderer
//

class AdaptivePixelRendererFactory
: public PixelRendererBaseFactory
: public IPixelRendererFactory
{
public:
// Constructor.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ namespace
ISampleRendererFactory* factory,
const ParamArray& params,
const size_t thread_index)
: PixelRendererBase(frame, thread_index, params)
: PixelRendererBase()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You no longer need to explicitly invoke the constructor here.

, m_params(params)
, m_sample_renderer(factory->create(thread_index))
, m_sample_count(m_params.m_samples)
Expand Down Expand Up @@ -113,12 +113,10 @@ namespace
"uniform pixel renderer settings:\n"
" samples %s\n"
" force antialiasing %s\n"
" decorrelate pixels %s\n"
" diagnostics %s",
" decorrelate pixels %s",
pretty_uint(m_params.m_samples).c_str(),
m_params.m_force_aa ? "on" : "off",
m_params.m_decorrelate ? "on" : "off",
are_diagnostics_enabled() ? "on" : "off");
m_params.m_decorrelate ? "on" : "off");

m_sample_renderer->print_settings();
}
Expand Down Expand Up @@ -324,7 +322,7 @@ IPixelRenderer* UniformPixelRendererFactory::create(

Dictionary UniformPixelRendererFactory::get_params_metadata()
{
Dictionary metadata = PixelRendererBaseFactory::get_params_metadata();
Dictionary metadata;

metadata.dictionaries().insert(
"samples",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
#define APPLESEED_RENDERER_KERNEL_RENDERING_FINAL_UNIFORMPIXELRENDERER_H

// appleseed.renderer headers.
#include "renderer/kernel/rendering/pixelrendererbase.h"
#include "renderer/kernel/rendering/ipixelrenderer.h"
#include "renderer/utility/paramarray.h"

// appleseed.foundation headers.
Expand All @@ -53,7 +53,7 @@ namespace renderer
//

class UniformPixelRendererFactory
: public PixelRendererBaseFactory
: public IPixelRendererFactory
{
public:
// Constructor.
Expand Down
Loading