[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