[Bf-blender-cvs] [d6bcacf] bake-cycles: Cycles-Bake: Passing samples, and hack to enhance bake result
Dalai Felinto
noreply at git.blender.org
Wed Apr 23 02:46:56 CEST 2014
Commit: d6bcacfc00f12e3fc526b45565b2847a0e8855f7
Author: Dalai Felinto
Date: Mon Feb 3 22:30:57 2014 -0200
https://developer.blender.org/rBd6bcacfc00f12e3fc526b45565b2847a0e8855f7
Cycles-Bake: Passing samples, and hack to enhance bake result
To see the result pick a scene render sample odd (e.g., 27, 39, ...).
Only working-ish for diffuse only scene (no emmit and no lights).
===================================================================
M intern/cycles/blender/blender_session.cpp
M intern/cycles/kernel/kernel_displace.h
M intern/cycles/kernel/kernel_types.h
M intern/cycles/render/film.cpp
M intern/cycles/render/integrator.cpp
M intern/cycles/render/integrator.h
M intern/cycles/render/session.cpp
===================================================================
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 814fb97..6ee2039 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -600,7 +600,10 @@ void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::Bake
Pass::add(PASS_UV, scene->film->passes);
}
- scene->film->use_light_visibility = is_light_pass(shader_type);
+ if (is_light_pass(shader_type)) {
+ /* force use_light_pass to be true */
+ Pass::add(PASS_LIGHT, scene->film->passes);
+ }
/* create device and update scene */
scene->film->tag_update(scene);
@@ -614,15 +617,9 @@ void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::Bake
SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
- /* set number of samples per layer */
- int samples = sync->get_layer_samples();
- bool bound_samples = sync->get_layer_bound_samples();
-
- if(samples != 0 && (!bound_samples || (samples < session_params.samples)))
- session->reset(buffer_params, samples);
- else
- session->reset(buffer_params, session_params.samples);
-
+ /* set number of samples */
+ session->tile_manager.set_samples(session_params.samples);
+ session->reset(buffer_params, session_params.samples);
session->update_scene();
/* when used, non-instanced convention: object = ~object */
diff --git a/intern/cycles/kernel/kernel_displace.h b/intern/cycles/kernel/kernel_displace.h
index 8783bd3..be87318 100644
--- a/intern/cycles/kernel/kernel_displace.h
+++ b/intern/cycles/kernel/kernel_displace.h
@@ -21,6 +21,7 @@ CCL_NAMESPACE_BEGIN
ccl_device void compute_light_pass(KernelGlobals *kg, ShaderData *sd, PathRadiance *L, uint xy_hash)
{
+ int samples = kernel_data.integrator.samples;
RNG rng = lcg_init(xy_hash);
PathState state;
Ray ray;
@@ -31,15 +32,37 @@ ccl_device void compute_light_pass(KernelGlobals *kg, ShaderData *sd, PathRadian
assert(kernel_data.film.use_light_pass);
path_radiance_init(L, true);
- /* TODO: copy bounce and other settings from scene */
path_state_init(kg, &state, &rng, 0);
-
- //state.rng_offset += PRNG_BOUNCE_NUM;
+ state.num_samples = samples;
float rbsdf = path_state_rng_1D(kg, &rng, &state, PRNG_BSDF);
shader_eval_surface(kg, sd, rbsdf, 0, SHADER_CONTEXT_MAIN);
- kernel_path_integrate_lighting(kg, &rng, sd, &throughput, &state, L, &ray);
+ for(int i = 0; i < kernel_data.integrator.max_bounce; i++) {
+ if (kernel_path_integrate_lighting(kg, &rng, sd, &throughput, &state, L, &ray) == false)
+ break;
+ }
+
+
+ /** XXX
+ hack to see something (only runs for odd samples values, so you can turn it on/off
+ here it starts showing something if I multiply the value by 11
+ (i.e., set the scene render samples to 11)
+ */
+ if (samples % 2){
+ float3 factor = make_float3(samples);
+
+ L->direct_diffuse *= factor;
+ L->direct_emission *= factor;
+ L->direct_glossy *= factor;
+ L->direct_subsurface *= factor;
+ L->direct_transmission *= factor;
+
+ L->indirect_diffuse *= factor;
+ L->indirect_glossy *= factor;
+ L->indirect_subsurface *= factor;
+ L->indirect_transmission *= factor;
+ }
}
ccl_device bool is_light_pass(ShaderEvalType type)
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index c636a9c..51ed5ac 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -340,7 +340,8 @@ typedef enum PassType {
PASS_MIST = 2097152,
PASS_SUBSURFACE_DIRECT = 4194304,
PASS_SUBSURFACE_INDIRECT = 8388608,
- PASS_SUBSURFACE_COLOR = 16777216
+ PASS_SUBSURFACE_COLOR = 16777216,
+ PASS_LIGHT = 33554432, /* no real pass, used to force use_light_pass */
} PassType;
#define PASS_ALL (~0)
@@ -929,6 +930,9 @@ typedef struct KernelIntegrator {
int volume_max_steps;
float volume_step_size;
int volume_samples;
+
+ /* baking */
+ int samples, pad6, pad7, pad8;
} KernelIntegrator;
typedef struct KernelBVH {
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index 30ad86a..c619661 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -393,6 +393,10 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
kfilm->pass_shadow = kfilm->pass_stride;
kfilm->use_light_pass = 1;
break;
+
+ case PASS_LIGHT:
+ kfilm->use_light_pass = 1;
+ break;
case PASS_NONE:
break;
}
diff --git a/intern/cycles/render/integrator.cpp b/intern/cycles/render/integrator.cpp
index e079e7e..c94640b 100644
--- a/intern/cycles/render/integrator.cpp
+++ b/intern/cycles/render/integrator.cpp
@@ -53,6 +53,7 @@ Integrator::Integrator()
sample_clamp_indirect = 0.0f;
motion_blur = false;
+ samples = 1;
aa_samples = 0;
diffuse_samples = 1;
glossy_samples = 1;
@@ -201,7 +202,8 @@ bool Integrator::modified(const Integrator& integrator)
motion_blur == integrator.motion_blur &&
sampling_pattern == integrator.sampling_pattern &&
sample_all_lights_direct == integrator.sample_all_lights_direct &&
- sample_all_lights_indirect == integrator.sample_all_lights_indirect);
+ sample_all_lights_indirect == integrator.sample_all_lights_indirect &&
+ samples == integrator.samples);
}
void Integrator::tag_update(Scene *scene)
diff --git a/intern/cycles/render/integrator.h b/intern/cycles/render/integrator.h
index 2570b13..e5b7635 100644
--- a/intern/cycles/render/integrator.h
+++ b/intern/cycles/render/integrator.h
@@ -55,6 +55,7 @@ public:
float sample_clamp_indirect;
bool motion_blur;
+ int samples;
int aa_samples;
int diffuse_samples;
int glossy_samples;
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 9cf7f49..07fd82f 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -733,7 +733,8 @@ void Session::update_scene()
cam->tag_update();
}
- /* number of samples is needed by multi jittered sampling pattern */
+ /* number of samples is needed by multi jittered
+ sampling pattern and by baking */
Integrator *integrator = scene->integrator;
if(integrator->sampling_pattern == SAMPLING_PATTERN_CMJ) {
@@ -745,6 +746,12 @@ void Session::update_scene()
}
}
+ int samples = tile_manager.num_samples;
+ if(samples != integrator->samples) {
+ integrator->samples = samples;
+ integrator->tag_update(scene);
+ }
+
/* update scene */
if(scene->need_update()) {
progress.set_status("Updating Scene");
More information about the Bf-blender-cvs
mailing list