[Bf-blender-cvs] [feab905] gooseberry_farm: Cycles: Implement sample offset feature

Sergey Sharybin noreply at git.blender.org
Sat Jun 27 20:07:36 CEST 2015


Commit: feab905d6f6d12d4f28581046e1cc3c1a0bda576
Author: Sergey Sharybin
Date:   Sat Jun 27 19:59:37 2015 +0200
Branches: gooseberry_farm
https://developer.blender.org/rBfeab905d6f6d12d4f28581046e1cc3c1a0bda576

Cycles: Implement sample offset feature

This is real quick implementation of the feature which allows to render
different sample ranges on different machines and merge the result into
final image as if it was rendered on a single machine. Same is feature
makes it possible to refine animation with more samples after it was
rendered with lower number of samples.

Control is happening via the following environment variables:

- CYCLES_RENDER_SAMPLE_START, which defines which sample to start
  rendering from.

- CYCLES_RENDER_NUM_SAMPLES, which defines how much samples are to be
  sampled by the Blender instance.

Limitations:

- Not really intuitive, final implementation will require better
  integration into command line arguments.

- All the render layers are to have the same exact number of samples,
  meaning using samples override for layer will lead to undesired
  results.

- No compositor is allowed.

===================================================================

M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/render/tile.cpp
M	intern/cycles/render/tile.h

===================================================================

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index e928a60..3d362de 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -138,6 +138,13 @@ void BlenderSession::create_session()
 	session->reset(buffer_params, session_params.samples);
 
 	b_engine.use_highlight_tiles(session_params.progressive_refine == false);
+
+	char *sample_start_string = getenv("CYCLES_RENDER_SAMPLE_START");
+	char *num_samples_string = getenv("CYCLES_RENDER_NUM_SAMPLES");
+	if(sample_start_string != NULL && num_samples_string != NULL) {
+		session->tile_manager.start_sample = atoi(sample_start_string);
+		session->tile_manager.num_subsequent_samples = atoi(num_samples_string);
+	}
 }
 
 void BlenderSession::reset_session(BL::BlendData b_data_, BL::Scene b_scene_)
@@ -618,6 +625,10 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult b_rr, BL::Re
 	float exposure = scene->film->exposure;
 
 	vector<float> pixels(params.width*params.height*4);
+	int sample = rtile.sample;
+	if(session->tile_manager.start_sample != -1) {
+		sample -= session->tile_manager.start_sample;
+	}
 
 	if(!do_update_only) {
 		/* copy each pass */
@@ -631,7 +642,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult b_rr, BL::Re
 			int components = b_pass.channels();
 
 			/* copy pixels */
-			if(!buffers->get_pass_rect(pass_type, exposure, rtile.sample, components, &pixels[0]))
+			if(!buffers->get_pass_rect(pass_type, exposure, sample, components, &pixels[0]))
 				memset(&pixels[0], 0, pixels.size()*sizeof(float));
 
 			b_pass.rect(&pixels[0]);
@@ -640,7 +651,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult b_rr, BL::Re
 	else {
 		/* copy combined pass */
 		BL::RenderPass b_combined_pass(b_rlay.passes.find_by_type(BL::RenderPass::type_COMBINED, b_rview_name.c_str()));
-		if(buffers->get_pass_rect(PASS_COMBINED, exposure, rtile.sample, 4, &pixels[0]))
+		if(buffers->get_pass_rect(PASS_COMBINED, exposure, sample, 4, &pixels[0]))
 			b_combined_pass.rect(&pixels[0]);
 	}
 
@@ -806,12 +817,12 @@ void BlenderSession::get_progress(float& progress, double& total_time, double& r
 	int tile, sample, samples_per_tile;
 	int tile_total = session->tile_manager.state.num_tiles;
 	int samples = session->tile_manager.state.sample + 1;
-	int total_samples = session->tile_manager.num_samples;
+	int total_samples = session->tile_manager.get_samples_per_tile();
 
 	session->progress.get_tile(tile, total_time, render_time, tile_time);
 
 	sample = session->progress.get_sample();
-	samples_per_tile = session->tile_manager.num_samples;
+	samples_per_tile = session->tile_manager.get_samples_per_tile();
 
 	if(background && samples_per_tile && tile_total)
 		progress = ((float)sample / (float)(tile_total * samples_per_tile));
diff --git a/intern/cycles/render/tile.cpp b/intern/cycles/render/tile.cpp
index 7e68ce8..5f724c6 100644
--- a/intern/cycles/render/tile.cpp
+++ b/intern/cycles/render/tile.cpp
@@ -33,6 +33,9 @@ TileManager::TileManager(bool progressive_, int num_samples_, int2 tile_size_, i
 	preserve_tile_device = preserve_tile_device_;
 	background = background_;
 
+	start_sample = 0;
+	num_subsequent_samples = -1;
+
 	BufferParams buffer_params;
 	reset(buffer_params, 0);
 }
@@ -60,7 +63,7 @@ void TileManager::reset(BufferParams& params_, int num_samples_)
 	num_samples = num_samples_;
 
 	state.buffer = BufferParams();
-	state.sample = -1;
+	state.sample = start_sample - 1;
 	state.num_tiles = 0;
 	state.num_rendered_tiles = 0;
 	state.num_samples = 0;
@@ -253,7 +256,11 @@ bool TileManager::next_tile(Tile& tile, int device)
 
 bool TileManager::done()
 {
-	return (state.sample+state.num_samples >= num_samples && state.resolution_divider == 1);
+	int end_sample = (num_subsequent_samples == -1)
+	                     ? num_samples
+	                     : start_sample + num_subsequent_samples;
+	return (state.resolution_divider == 1) &&
+	       (state.sample+state.num_samples >= end_sample);
 }
 
 bool TileManager::next()
@@ -272,8 +279,10 @@ bool TileManager::next()
 
 		if(progressive)
 			state.num_samples = 1;
-		else
+		else if(num_subsequent_samples == -1)
 			state.num_samples = num_samples;
+		else
+			state.num_samples = num_subsequent_samples;
 
 		state.resolution_divider = 1;
 		set_tiles();
@@ -282,5 +291,11 @@ bool TileManager::next()
 	return true;
 }
 
+int TileManager::get_samples_per_tile()
+{
+	return (num_subsequent_samples == -1) ? num_samples
+	                                      : num_subsequent_samples;
+}
+
 CCL_NAMESPACE_END
 
diff --git a/intern/cycles/render/tile.h b/intern/cycles/render/tile.h
index c9bdc86..97b3f7b 100644
--- a/intern/cycles/render/tile.h
+++ b/intern/cycles/render/tile.h
@@ -80,6 +80,12 @@ public:
 	bool done();
 	
 	void set_tile_order(TileOrder tile_order_) { tile_order = tile_order_; }
+
+	/* Sample range rendering. */
+	int start_sample;
+	int num_subsequent_samples;
+
+	int get_samples_per_tile();
 protected:
 
 	void set_tiles();




More information about the Bf-blender-cvs mailing list