[Bf-blender-cvs] [f3300db] soc-2016-cycles_denoising: Cycles: Implement RenderResult -> RenderBuffers import
Lukas Stockner
noreply at git.blender.org
Wed Jul 6 04:28:53 CEST 2016
Commit: f3300db92112129f3ebd3104a598a6b3b0146a5e
Author: Lukas Stockner
Date: Wed Jul 6 04:13:16 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBf3300db92112129f3ebd3104a598a6b3b0146a5e
Cycles: Implement RenderResult -> RenderBuffers import
This commit adds a function that takes an existing RenderResult and copies the passes
to newly created RenderBuffers. That will later be used to copy the rendered image
back for post-processing denoising.
===================================================================
M intern/cycles/blender/blender_session.cpp
M intern/cycles/blender/blender_sync.cpp
M intern/cycles/blender/blender_sync.h
M intern/cycles/render/buffers.cpp
===================================================================
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 4ec1dde..63f5626 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -238,86 +238,6 @@ void BlenderSession::free_session()
delete session;
}
-static PassType get_pass_type(BL::RenderPass& b_pass)
-{
- switch(b_pass.type()) {
- case BL::RenderPass::type_COMBINED:
- return PASS_COMBINED;
-
- case BL::RenderPass::type_Z:
- return PASS_DEPTH;
- case BL::RenderPass::type_MIST:
- return PASS_MIST;
- case BL::RenderPass::type_NORMAL:
- return PASS_NORMAL;
- case BL::RenderPass::type_OBJECT_INDEX:
- return PASS_OBJECT_ID;
- case BL::RenderPass::type_UV:
- return PASS_UV;
- case BL::RenderPass::type_VECTOR:
- return PASS_MOTION;
- case BL::RenderPass::type_MATERIAL_INDEX:
- return PASS_MATERIAL_ID;
-
- case BL::RenderPass::type_DIFFUSE_DIRECT:
- return PASS_DIFFUSE_DIRECT;
- case BL::RenderPass::type_GLOSSY_DIRECT:
- return PASS_GLOSSY_DIRECT;
- case BL::RenderPass::type_TRANSMISSION_DIRECT:
- return PASS_TRANSMISSION_DIRECT;
- case BL::RenderPass::type_SUBSURFACE_DIRECT:
- return PASS_SUBSURFACE_DIRECT;
-
- case BL::RenderPass::type_DIFFUSE_INDIRECT:
- return PASS_DIFFUSE_INDIRECT;
- case BL::RenderPass::type_GLOSSY_INDIRECT:
- return PASS_GLOSSY_INDIRECT;
- case BL::RenderPass::type_TRANSMISSION_INDIRECT:
- return PASS_TRANSMISSION_INDIRECT;
- case BL::RenderPass::type_SUBSURFACE_INDIRECT:
- return PASS_SUBSURFACE_INDIRECT;
-
- case BL::RenderPass::type_DIFFUSE_COLOR:
- return PASS_DIFFUSE_COLOR;
- case BL::RenderPass::type_GLOSSY_COLOR:
- return PASS_GLOSSY_COLOR;
- case BL::RenderPass::type_TRANSMISSION_COLOR:
- return PASS_TRANSMISSION_COLOR;
- case BL::RenderPass::type_SUBSURFACE_COLOR:
- return PASS_SUBSURFACE_COLOR;
-
- case BL::RenderPass::type_EMIT:
- return PASS_EMISSION;
- case BL::RenderPass::type_ENVIRONMENT:
- return PASS_BACKGROUND;
- case BL::RenderPass::type_AO:
- return PASS_AO;
- case BL::RenderPass::type_SHADOW:
- return PASS_SHADOW;
-
- case BL::RenderPass::type_DIFFUSE:
- case BL::RenderPass::type_COLOR:
- case BL::RenderPass::type_REFRACTION:
- case BL::RenderPass::type_SPECULAR:
- case BL::RenderPass::type_REFLECTION:
- return PASS_NONE;
-#ifdef WITH_CYCLES_DEBUG
- case BL::RenderPass::type_DEBUG:
- {
- if(b_pass.debug_type() == BL::RenderPass::debug_type_BVH_TRAVERSAL_STEPS)
- return PASS_BVH_TRAVERSAL_STEPS;
- if(b_pass.debug_type() == BL::RenderPass::debug_type_BVH_TRAVERSED_INSTANCES)
- return PASS_BVH_TRAVERSED_INSTANCES;
- if(b_pass.debug_type() == BL::RenderPass::debug_type_RAY_BOUNCES)
- return PASS_RAY_BOUNCES;
- break;
- }
-#endif
- }
-
- return PASS_NONE;
-}
-
static ShaderEvalType get_shader_type(const string& pass_type)
{
const char *shader_type = pass_type.c_str();
@@ -492,7 +412,7 @@ void BlenderSession::render()
for(b_rlay.passes.begin(b_pass_iter); b_pass_iter != b_rlay.passes.end(); ++b_pass_iter) {
BL::RenderPass b_pass(*b_pass_iter);
- PassType pass_type = get_pass_type(b_pass);
+ PassType pass_type = BlenderSync::get_pass_type(b_pass);
if(pass_type == PASS_MOTION && scene->integrator->motion_blur)
continue;
@@ -759,7 +679,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
return;
BufferParams& params = buffers->params;
- float exposure = scene->film->exposure;
+ float exposure = scene? scene->film->exposure : 1.0f;
int4 rect = make_int4(rtile.x + params.overscan, rtile.y + params.overscan,
rtile.x+rtile.w - params.overscan, rtile.y+rtile.h - params.overscan);
@@ -790,7 +710,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
}
else {
/* find matching pass type */
- PassType pass_type = get_pass_type(b_pass);
+ PassType pass_type = BlenderSync::get_pass_type(b_pass);
if(!buffers->get_pass_rect(pass_type, exposure, sample, components, rect, &pixels[0]))
memset(&pixels[0], 0, pixels.size()*sizeof(float));
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 33084f1..f1bbc3d 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -675,5 +675,147 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine& b_engine,
return params;
}
+PassType BlenderSync::get_pass_type(BL::RenderPass& b_pass)
+{
+ switch(b_pass.type()) {
+ case BL::RenderPass::type_COMBINED:
+ return PASS_COMBINED;
+
+ case BL::RenderPass::type_Z:
+ return PASS_DEPTH;
+ case BL::RenderPass::type_MIST:
+ return PASS_MIST;
+ case BL::RenderPass::type_NORMAL:
+ return PASS_NORMAL;
+ case BL::RenderPass::type_OBJECT_INDEX:
+ return PASS_OBJECT_ID;
+ case BL::RenderPass::type_UV:
+ return PASS_UV;
+ case BL::RenderPass::type_VECTOR:
+ return PASS_MOTION;
+ case BL::RenderPass::type_MATERIAL_INDEX:
+ return PASS_MATERIAL_ID;
+
+ case BL::RenderPass::type_DIFFUSE_DIRECT:
+ return PASS_DIFFUSE_DIRECT;
+ case BL::RenderPass::type_GLOSSY_DIRECT:
+ return PASS_GLOSSY_DIRECT;
+ case BL::RenderPass::type_TRANSMISSION_DIRECT:
+ return PASS_TRANSMISSION_DIRECT;
+ case BL::RenderPass::type_SUBSURFACE_DIRECT:
+ return PASS_SUBSURFACE_DIRECT;
+
+ case BL::RenderPass::type_DIFFUSE_INDIRECT:
+ return PASS_DIFFUSE_INDIRECT;
+ case BL::RenderPass::type_GLOSSY_INDIRECT:
+ return PASS_GLOSSY_INDIRECT;
+ case BL::RenderPass::type_TRANSMISSION_INDIRECT:
+ return PASS_TRANSMISSION_INDIRECT;
+ case BL::RenderPass::type_SUBSURFACE_INDIRECT:
+ return PASS_SUBSURFACE_INDIRECT;
+
+ case BL::RenderPass::type_DIFFUSE_COLOR:
+ return PASS_DIFFUSE_COLOR;
+ case BL::RenderPass::type_GLOSSY_COLOR:
+ return PASS_GLOSSY_COLOR;
+ case BL::RenderPass::type_TRANSMISSION_COLOR:
+ return PASS_TRANSMISSION_COLOR;
+ case BL::RenderPass::type_SUBSURFACE_COLOR:
+ return PASS_SUBSURFACE_COLOR;
+
+ case BL::RenderPass::type_EMIT:
+ return PASS_EMISSION;
+ case BL::RenderPass::type_ENVIRONMENT:
+ return PASS_BACKGROUND;
+ case BL::RenderPass::type_AO:
+ return PASS_AO;
+ case BL::RenderPass::type_SHADOW:
+ return PASS_SHADOW;
+
+ case BL::RenderPass::type_DIFFUSE:
+ case BL::RenderPass::type_COLOR:
+ case BL::RenderPass::type_REFRACTION:
+ case BL::RenderPass::type_SPECULAR:
+ case BL::RenderPass::type_REFLECTION:
+ return PASS_NONE;
+#ifdef WITH_CYCLES_DEBUG
+ case BL::RenderPass::type_DEBUG:
+ {
+ if(b_pass.debug_type() == BL::RenderPass::debug_type_BVH_TRAVERSAL_STEPS)
+ return PASS_BVH_TRAVERSAL_STEPS;
+ if(b_pass.debug_type() == BL::RenderPass::debug_type_BVH_TRAVERSED_INSTANCES)
+ return PASS_BVH_TRAVERSED_INSTANCES;
+ if(b_pass.debug_type() == BL::RenderPass::debug_type_RAY_BOUNCES)
+ return PASS_RAY_BOUNCES;
+ break;
+ }
+#endif
+ }
+
+ return PASS_NONE;
+}
+
+RenderBuffers* BlenderSync::get_render_buffer(Device *device,
+ BL::RenderLayer& b_rl,
+ BL::RenderResult& b_rr,
+ int samples)
+{
+ BufferParams params;
+ params.width = params.full_width = params.final_width = b_rr.resolution_x();
+ params.height = params.full_height = params.final_height = b_rr.resolution_y();
+
+ params.full_x = params.full_y = 0;
+
+ BL::RenderLayer::passes_iterator b_pass;
+
+ int denoising_passes = 0;
+ for(b_rl.passes.begin(b_pass); b_pass != b_rl.passes.end(); ++b_pass) {
+ PassType type = get_pass_type(*b_pass);
+ if(type != PASS_NONE)
+ Pass::add(type, params.passes);
+
+ int extended_type = b_pass->extended_type();
+ if(extended_type) {
+ denoising_passes |= extended_type;
+ if(extended_type == EX_TYPE_DENOISE_CLEAN)
+ params.selective_denoising = true;
+ }
+ }
+ params.denoising_passes = ((~denoising_passes & EX_TYPE_DENOISE_REQUIRED) == 0);
+
+ RenderBuffers *buffer = new RenderBuffers(device);
+ buffer->reset(device, params);
+
+ int4 rect = make_int4(0, 0, params.width, params.height);
+
+ /* Some passes are divided by another pass when exporting to a RenderPass.
+ * Therefore, these passes need to be multiplied when importing, so some passes must be imported before others. */
+ PassType import_first_array[] = {PASS_DIFFUSE_COLOR, PASS_GLOSSY_COLOR, PASS_TRANSMISSION_COLOR, PASS_SUBSURFACE_COLOR, PASS_MOTION_WEIGHT};
+ std::set<PassType> import_first(import_first_array, import_first_array + 5);
+ for(b_rl.passes.begin(b_pass); b_pass != b_rl.passes.end(); ++b_pass) {
+ if(b_pass->extended_type()) continue;
+
+ PassType type = get_pass_type(*b_pass);
+ if(!import_first.count(type)) continue;
+
+ BL::DynamicArray<float> b_rect = b_pass->rect();
+ buffer->get_pass_rect(type, 1.0f, samples, b_pass->channels(), rect, b_rect.data, true);
+ }
+
+ for(b_rl.passes.begin(b_pass); b_pass != b_rl.passes.end(); ++b_pass) {
+ int extended_type = b_pass->extended_type();
+ PassType type = get_pass_type(*b_pass);
+ if(import_first.count(type)) continue;
+
+ BL::DynamicArray<float> b_rect = b_pass->rect();
+ if(extended_type)
+ buffer->get_denoising_rect(extended_type, 1.0f, samples, b_pass->channels(), rect, b_rect.data, true);
+ else
+ buffer->get_pass_rect(type, 1.0f, samples, b_pass->channels(), rect, b_rect.data, true);
+ }
+
+ return buffer;
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index d690adb..74685a6 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -24,6 +24,7 @@
#include "blender_util.h"
+#include "film.h"
#include "scene.h"
#include "session.h"
@@ -92,6 +93,12 @@ public:
Camera *cam,
int width, int height);
+ static RenderBuffers* get_render_buffer(Device *device,
+ BL::RenderLayer& b_rl,
+ BL::RenderResult& b_rr,
+ int samples);
+ static PassType get_pass_type(BL::RenderPass& b_pass);
+
private:
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list