[Bf-blender-cvs] [bfffcb5] soc-2016-cycles_denoising: Cycles: Implement half float file output and fix flipped standalone-denoised images
Lukas Stockner
noreply at git.blender.org
Sat Aug 13 05:12:35 CEST 2016
Commit: bfffcb518a5da85c3a322b7e10628f16db3f4001
Author: Lukas Stockner
Date: Sat Aug 13 03:52:58 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBbfffcb518a5da85c3a322b7e10628f16db3f4001
Cycles: Implement half float file output and fix flipped standalone-denoised images
Since the tonemapping task already supports both Byte and Half output,
the only needed change is to the DisplayBuffer itself.
===================================================================
M intern/cycles/app/cycles_denoising.cpp
M intern/cycles/app/cycles_standalone.cpp
M intern/cycles/render/buffers.cpp
M intern/cycles/render/buffers.h
M intern/cycles/render/session.cpp
M intern/cycles/render/session.h
===================================================================
diff --git a/intern/cycles/app/cycles_denoising.cpp b/intern/cycles/app/cycles_denoising.cpp
index de54b2c..5515fb1 100644
--- a/intern/cycles/app/cycles_denoising.cpp
+++ b/intern/cycles/app/cycles_denoising.cpp
@@ -203,6 +203,7 @@ bool cycles_denoising_session()
options.session_params.progressive = false;
options.session_params.background = true;
options.session_params.tile_order = TILE_BOTTOM_TO_TOP;
+ options.session_params.flip_output = false;
options.session = new Session(options.session_params);
options.session->progress.set_update_callback(function_bind(&session_print_status));
diff --git a/intern/cycles/app/cycles_standalone.cpp b/intern/cycles/app/cycles_standalone.cpp
index 899f6d6..c07f17f 100644
--- a/intern/cycles/app/cycles_standalone.cpp
+++ b/intern/cycles/app/cycles_standalone.cpp
@@ -369,6 +369,7 @@ static void options_parse(int argc, const char **argv)
"--half-window %d", &options.session_params.half_window, "Size of the denoising window",
"--samples %d", &options.session_params.samples, "Number of samples to render",
"--output %s", &options.session_params.output_path, "File path to write output image",
+ "--output-half", &options.session_params.output_half_float, "Write output image in half float format",
"--threads %d", &options.session_params.threads, "CPU Rendering Threads",
"--width %d", &options.width, "Window width in pixel",
"--height %d", &options.height, "Window height in pixel",
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index f1e552d..e056934 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -518,6 +518,7 @@ DisplayBuffer::DisplayBuffer(Device *device_, bool linear)
draw_height = 0;
transparent = true; /* todo: determine from background */
half_float = linear;
+ flip_image = true;
}
DisplayBuffer::~DisplayBuffer()
@@ -588,8 +589,7 @@ void DisplayBuffer::write(Device *device, const string& filename)
if(w == 0 || h == 0)
return;
- if(half_float)
- return;
+ TypeDesc output_format = half_float? TypeDesc::HALF : TypeDesc::UINT8;
/* read buffer from device */
device_memory& rgba = rgba_data();
@@ -597,16 +597,22 @@ void DisplayBuffer::write(Device *device, const string& filename)
/* write image */
ImageOutput *out = ImageOutput::create(filename);
- ImageSpec spec(w, h, 4, TypeDesc::UINT8);
- int scanlinesize = w*4*sizeof(uchar);
+ ImageSpec spec(w, h, 4, output_format);
+ int scanlinesize = w*spec.pixel_bytes();
out->open(filename, spec);
+ uchar *pixels = (uchar*)rgba.data_pointer;
/* conversion for different top/bottom convention */
- out->write_image(TypeDesc::UINT8,
- (uchar*)rgba.data_pointer + (h-1)*scanlinesize,
+ if(flip_image) {
+ pixels += (h-1)*scanlinesize;
+ scanlinesize = -scanlinesize;
+ }
+
+ out->write_image(output_format,
+ pixels,
AutoStride,
- -scanlinesize,
+ scanlinesize,
AutoStride);
out->close();
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index 4a9287f..716b1b7 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -147,6 +147,8 @@ public:
/* byte buffer for converted result */
device_vector<uchar4> rgba_byte;
device_vector<half4> rgba_half;
+ /* flip the image while writing? */
+ bool flip_image;
DisplayBuffer(Device *device, bool linear = false);
~DisplayBuffer();
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 4488584..5a75f50 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -108,7 +108,8 @@ Session::~Session()
/* tonemap and write out image if requested */
delete display;
- display = new DisplayBuffer(device, false);
+ display = new DisplayBuffer(device, params.output_half_float);
+ display->flip_image = params.flip_output;
display->reset(device, buffers->params);
tonemap(params.samples);
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index 8939b4e..1f709e5 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -45,7 +45,10 @@ public:
DeviceInfo device;
bool background;
bool progressive_refine;
+
string output_path;
+ bool flip_output;
+ bool output_half_float;
bool progressive;
bool experimental;
@@ -73,7 +76,10 @@ public:
{
background = false;
progressive_refine = false;
+
output_path = "";
+ flip_output = true;
+ output_half_float = false;
progressive = false;
experimental = false;
@@ -104,6 +110,8 @@ public:
&& background == params.background
&& progressive_refine == params.progressive_refine
&& output_path == params.output_path
+ && flip_output == params.flip_output
+ && output_half_float == params.output_half_float
/* && samples == params.samples */
&& progressive == params.progressive
&& experimental == params.experimental
More information about the Bf-blender-cvs
mailing list