Cycles: fix issues rendering second render layer passes, and avoid unnecessary
clear of buffer.
This commit is contained in:
		| @@ -203,6 +203,9 @@ void BlenderSession::render() | |||||||
| 		b_rlay = *b_iter; | 		b_rlay = *b_iter; | ||||||
|  |  | ||||||
| 		/* add passes */ | 		/* add passes */ | ||||||
|  | 		vector<Pass> passes; | ||||||
|  | 		Pass::add(PASS_COMBINED, passes); | ||||||
|  |  | ||||||
| 		if(session_params.device.type == DEVICE_CPU) { /* todo */ | 		if(session_params.device.type == DEVICE_CPU) { /* todo */ | ||||||
| 			BL::RenderLayer::passes_iterator b_pass_iter; | 			BL::RenderLayer::passes_iterator b_pass_iter; | ||||||
| 			 | 			 | ||||||
| @@ -211,12 +214,13 @@ void BlenderSession::render() | |||||||
| 				PassType pass_type = get_pass_type(b_pass); | 				PassType pass_type = get_pass_type(b_pass); | ||||||
|  |  | ||||||
| 				if(pass_type != PASS_NONE) | 				if(pass_type != PASS_NONE) | ||||||
| 					Pass::add(pass_type, buffer_params.passes); | 					Pass::add(pass_type, passes); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		scene->film->passes = buffer_params.passes; | 		buffer_params.passes = passes; | ||||||
| 		scene->film->need_update = true; | 		scene->film->passes = passes; | ||||||
|  | 		scene->film->tag_update(scene); | ||||||
|  |  | ||||||
| 		/* update session */ | 		/* update session */ | ||||||
| 		session->reset(buffer_params, session_params.samples); | 		session->reset(buffer_params, session_params.samples); | ||||||
|   | |||||||
| @@ -36,15 +36,6 @@ __device_inline void kernel_write_pass_float4(__global float *buffer, int sample | |||||||
| 	*buf = (sample == 0)? value: *buf + value; | 	*buf = (sample == 0)? value: *buf + value; | ||||||
| } | } | ||||||
|  |  | ||||||
| __device_inline void kernel_clear_passes(__global float *buffer, int sample, int pass_stride) |  | ||||||
| { |  | ||||||
| #ifdef __PASSES__ |  | ||||||
| 	if(sample == 0 && pass_stride != 4) |  | ||||||
| 		for(int i = 4; i < pass_stride; i++) |  | ||||||
| 			buffer[i] = 0.0f; |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
|  |  | ||||||
| __device void kernel_write_data_passes(KernelGlobals *kg, __global float *buffer, PathRadiance *L, | __device void kernel_write_data_passes(KernelGlobals *kg, __global float *buffer, PathRadiance *L, | ||||||
| 	ShaderData *sd, int sample, int path_flag, float3 throughput) | 	ShaderData *sd, int sample, int path_flag, float3 throughput) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -377,8 +377,6 @@ __device void kernel_path_trace(KernelGlobals *kg, | |||||||
| 	rng_state += index; | 	rng_state += index; | ||||||
| 	buffer += index*pass_stride; | 	buffer += index*pass_stride; | ||||||
|  |  | ||||||
| 	kernel_clear_passes(buffer, sample, pass_stride); |  | ||||||
|  |  | ||||||
| 	/* initialize random numbers */ | 	/* initialize random numbers */ | ||||||
| 	RNG rng; | 	RNG rng; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -157,12 +157,19 @@ bool RenderBuffers::get_pass(PassType type, float exposure, int sample, int comp | |||||||
| 			assert(pass.components == components); | 			assert(pass.components == components); | ||||||
|  |  | ||||||
| 			/* scalar */ | 			/* scalar */ | ||||||
|  | 			if(type == PASS_DEPTH) { | ||||||
|  | 				for(int i = 0; i < size; i++, in += pass_stride, pixels++) { | ||||||
|  | 					float f = *in; | ||||||
|  | 					pixels[0] = (f == 0.0f)? 1e10f: f*scale_exposure; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
| 				for(int i = 0; i < size; i++, in += pass_stride, pixels++) { | 				for(int i = 0; i < size; i++, in += pass_stride, pixels++) { | ||||||
| 					float f = *in; | 					float f = *in; | ||||||
|  |  | ||||||
| 					pixels[0] = f*scale_exposure; | 					pixels[0] = f*scale_exposure; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | 		} | ||||||
| 		else if(components == 3) { | 		else if(components == 3) { | ||||||
| 			assert(pass.components == 4); | 			assert(pass.components == 4); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user