[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58091] branches/soc-2013-dingto: Cycles / Ray Depth:

Thomas Dinges blender at dingto.org
Tue Jul 9 02:18:13 CEST 2013


Revision: 58091
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58091
Author:   dingto
Date:     2013-07-09 00:18:13 +0000 (Tue, 09 Jul 2013)
Log Message:
-----------
Cycles / Ray Depth:
* Added a Ray Depth output to the Light Path node, which returns the current ray bounce (0, 1, 2, 3...)
* This can be used to use different shaders for direct and indirect lighting and artificial effects.

Examples:
* http://www.pasteall.org/pic/show.php?id=55158 Here we use the output to apply a different shader to the third bounce. As in this example, you can use Math Nodes (Greater Than / Less Than) if you want to use values outside of the 0/1 range.

* http://www.pasteall.org/pic/show.php?id=55159 Here we restrict the maximum bounce on a per shader basis for the left sphere. This way it looks like we would only have 1 max bounce set in the scene "Light paths" panel. 
This can be used to e.g. improve performance for objects far from the camera, which do not need full GI. 

Technical notes:
* Implemented for both integrators and SVM/OSL.
* This is done by passing state.bounce to the shader_setup_from_* functions.
* Note: We don't pass state.bounce to kernel_shader_evaluate() and therefore shader_setup_from_displacement() method doesn't set the value, this is outside the path trace loop. Maybe a ToDo?

Modified Paths:
--------------
    branches/soc-2013-dingto/intern/cycles/kernel/kernel_displace.h
    branches/soc-2013-dingto/intern/cycles/kernel/kernel_emission.h
    branches/soc-2013-dingto/intern/cycles/kernel/kernel_path.h
    branches/soc-2013-dingto/intern/cycles/kernel/kernel_shader.h
    branches/soc-2013-dingto/intern/cycles/kernel/kernel_types.h
    branches/soc-2013-dingto/intern/cycles/kernel/osl/osl_services.cpp
    branches/soc-2013-dingto/intern/cycles/kernel/osl/osl_services.h
    branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_light_path.osl
    branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_light_path.h
    branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_types.h
    branches/soc-2013-dingto/intern/cycles/render/nodes.cpp
    branches/soc-2013-dingto/source/blender/nodes/shader/nodes/node_shader_light_path.c

Modified: branches/soc-2013-dingto/intern/cycles/kernel/kernel_displace.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/kernel_displace.h	2013-07-09 00:17:43 UTC (rev 58090)
+++ branches/soc-2013-dingto/intern/cycles/kernel/kernel_displace.h	2013-07-09 00:18:13 UTC (rev 58091)
@@ -57,7 +57,7 @@
 #endif
 
 		/* setup shader data */
-		shader_setup_from_background(kg, &sd, &ray);
+		shader_setup_from_background(kg, &sd, &ray, 0);
 
 		/* evaluate */
 		int flag = 0; /* we can't know which type of BSDF this is for */

Modified: branches/soc-2013-dingto/intern/cycles/kernel/kernel_emission.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/kernel_emission.h	2013-07-09 00:17:43 UTC (rev 58090)
+++ branches/soc-2013-dingto/intern/cycles/kernel/kernel_emission.h	2013-07-09 00:18:13 UTC (rev 58091)
@@ -21,7 +21,7 @@
 /* Direction Emission */
 
 __device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando,
-	LightSample *ls, float u, float v, float3 I, differential3 dI, float t, float time)
+	LightSample *ls, float u, float v, float3 I, differential3 dI, float t, float time, int bounce)
 {
 	/* setup shading at emitter */
 	ShaderData sd;
@@ -41,7 +41,7 @@
 #ifdef __CAMERA_MOTION__
 		ray.time = time;
 #endif
-		shader_setup_from_background(kg, &sd, &ray);
+		shader_setup_from_background(kg, &sd, &ray, bounce);
 		eval = shader_eval_background(kg, &sd, 0, SHADER_CONTEXT_EMISSION);
 	}
 	else
@@ -49,10 +49,10 @@
 	{
 #ifdef __HAIR__
 		if(ls->type == LIGHT_STRAND)
-			shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, ls->prim);
+			shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, bounce, ls->prim);
 		else
 #endif
-			shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, ~0);
+			shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, bounce, ~0);
 
 		ls->Ng = sd.Ng;
 
@@ -74,7 +74,7 @@
 
 __device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex,
 	float randt, float rando, float randu, float randv, Ray *ray, BsdfEval *eval,
-	bool *is_lamp)
+	bool *is_lamp, int bounce)
 {
 	LightSample ls;
 
@@ -97,7 +97,7 @@
 	differential3 dD = differential3_zero();
 
 	/* evaluate closure */
-	float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D, dD, ls.t, sd->time);
+	float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D, dD, ls.t, sd->time, bounce);
 
 	if(is_zero(light_eval))
 		return false;
@@ -185,7 +185,7 @@
 
 /* Indirect Lamp Emission */
 
-__device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, float randt, float3 *emission)
+__device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, float randt, float3 *emission, int bounce)
 {
 	LightSample ls;
 	int lamp = lamp_light_eval_sample(kg, randt);
@@ -209,7 +209,7 @@
 	/* todo: missing texture coordinates */
 	float u = 0.0f;
 	float v = 0.0f;
-	float3 L = direct_emissive_eval(kg, 0.0f, &ls, u, v, -ray->D, ray->dD, ls.t, ray->time);
+	float3 L = direct_emissive_eval(kg, 0.0f, &ls, u, v, -ray->D, ray->dD, ls.t, ray->time, bounce);
 
 	if(!(path_flag & PATH_RAY_MIS_SKIP)) {
 		/* multiple importance sampling, get regular light pdf,
@@ -224,7 +224,7 @@
 
 /* Indirect Background */
 
-__device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf)
+__device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, int bounce)
 {
 #ifdef __BACKGROUND__
 	int shader = kernel_data.background.shader;
@@ -240,7 +240,7 @@
 
 	/* evaluate background closure */
 	ShaderData sd;
-	shader_setup_from_background(kg, &sd, ray);
+	shader_setup_from_background(kg, &sd, ray, bounce);
 
 	float3 L = shader_eval_background(kg, &sd, path_flag, SHADER_CONTEXT_EMISSION);
 

Modified: branches/soc-2013-dingto/intern/cycles/kernel/kernel_path.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/kernel_path.h	2013-07-09 00:17:43 UTC (rev 58090)
+++ branches/soc-2013-dingto/intern/cycles/kernel/kernel_path.h	2013-07-09 00:18:13 UTC (rev 58091)
@@ -215,7 +215,7 @@
 					return true;
 
 				ShaderData sd;
-				shader_setup_from_ray(kg, &sd, &isect, ray);
+				shader_setup_from_ray(kg, &sd, &isect, ray, state->bounce);
 				shader_eval_surface(kg, &sd, 0.0f, PATH_RAY_SHADOW, SHADER_CONTEXT_SHADOW);
 
 				throughput *= shader_bsdf_transparency(kg, &sd);
@@ -300,7 +300,7 @@
 			float light_t = path_rng_1D(kg, rng, sample, num_samples, rng_offset + PRNG_LIGHT);
 			float3 emission;
 
-			if(indirect_lamp_emission(kg, &light_ray, state.flag, ray_pdf, light_t, &emission))
+			if(indirect_lamp_emission(kg, &light_ray, state.flag, ray_pdf, light_t, &emission, state.bounce))
 				path_radiance_accum_emission(&L, throughput, emission, state.bounce);
 		}
 #endif
@@ -318,7 +318,7 @@
 
 #ifdef __BACKGROUND__
 			/* sample background shader */
-			float3 L_background = indirect_background(kg, &ray, state.flag, ray_pdf);
+			float3 L_background = indirect_background(kg, &ray, state.flag, ray_pdf, state.bounce);
 			path_radiance_accum_background(&L, throughput, L_background, state.bounce);
 #endif
 
@@ -327,7 +327,7 @@
 
 		/* setup shading */
 		ShaderData sd;
-		shader_setup_from_ray(kg, &sd, &isect, &ray);
+		shader_setup_from_ray(kg, &sd, &isect, &ray, state.bounce);
 		float rbsdf = path_rng_1D(kg, rng, sample, num_samples, rng_offset + PRNG_BSDF);
 		shader_eval_surface(kg, &sd, rbsdf, state.flag, SHADER_CONTEXT_MAIN);
 
@@ -464,7 +464,7 @@
 				light_ray.time = sd.time;
 #endif
 
-				if(direct_emission(kg, &sd, -1, light_t, light_o, light_u, light_v, &light_ray, &L_light, &is_lamp)) {
+				if(direct_emission(kg, &sd, -1, light_t, light_o, light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce)) {
 					/* trace shadow ray */
 					float3 shadow;
 
@@ -575,7 +575,7 @@
 			float light_t = path_rng_1D(kg, rng, sample, num_total_samples, rng_offset + PRNG_LIGHT);
 			float3 emission;
 
-			if(indirect_lamp_emission(kg, &light_ray, state.flag, ray_pdf, light_t, &emission))
+			if(indirect_lamp_emission(kg, &light_ray, state.flag, ray_pdf, light_t, &emission, state.bounce))
 				path_radiance_accum_emission(L, throughput, emission, state.bounce);
 		}
 #endif
@@ -583,7 +583,7 @@
 		if(!hit) {
 #ifdef __BACKGROUND__
 			/* sample background shader */
-			float3 L_background = indirect_background(kg, &ray, state.flag, ray_pdf);
+			float3 L_background = indirect_background(kg, &ray, state.flag, ray_pdf, state.bounce);
 			path_radiance_accum_background(L, throughput, L_background, state.bounce);
 #endif
 
@@ -592,7 +592,7 @@
 
 		/* setup shading */
 		ShaderData sd;
-		shader_setup_from_ray(kg, &sd, &isect, &ray);
+		shader_setup_from_ray(kg, &sd, &isect, &ray, state.bounce);
 		float rbsdf = path_rng_1D(kg, rng, sample, num_total_samples, rng_offset + PRNG_BSDF);
 		shader_eval_surface(kg, &sd, rbsdf, state.flag, SHADER_CONTEXT_INDIRECT);
 		shader_merge_closures(kg, &sd);
@@ -706,7 +706,7 @@
 #endif
 
 				/* sample random light */
-				if(direct_emission(kg, &sd, -1, light_t, light_o, light_u, light_v, &light_ray, &L_light, &is_lamp)) {
+				if(direct_emission(kg, &sd, -1, light_t, light_o, light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce)) {
 					/* trace shadow ray */
 					float3 shadow;
 
@@ -838,7 +838,7 @@
 				float light_u, light_v;
 				path_rng_2D(kg, &lamp_rng, sample*num_samples + j, aa_samples*num_samples, rng_offset + PRNG_LIGHT_U, &light_u, &light_v);
 
-				if(direct_emission(kg, sd, i, 0.0f, 0.0f, light_u, light_v, &light_ray, &L_light, &is_lamp)) {
+				if(direct_emission(kg, sd, i, 0.0f, 0.0f, light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce)) {
 					/* trace shadow ray */
 					float3 shadow;
 
@@ -867,7 +867,7 @@
 				if(kernel_data.integrator.num_all_lights)
 					light_t = 0.5f*light_t;
 
-				if(direct_emission(kg, sd, -1, light_t, 0.0f, light_u, light_v, &light_ray, &L_light, &is_lamp)) {
+				if(direct_emission(kg, sd, -1, light_t, 0.0f, light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce)) {
 					/* trace shadow ray */
 					float3 shadow;
 
@@ -1016,7 +1016,7 @@
 
 #ifdef __BACKGROUND__
 			/* sample background shader */
-			float3 L_background = indirect_background(kg, &ray, state.flag, ray_pdf);
+			float3 L_background = indirect_background(kg, &ray, state.flag, ray_pdf, state.bounce);
 			path_radiance_accum_background(&L, throughput, L_background, state.bounce);
 #endif
 
@@ -1025,7 +1025,7 @@
 
 		/* setup shading */
 		ShaderData sd;
-		shader_setup_from_ray(kg, &sd, &isect, &ray);
+		shader_setup_from_ray(kg, &sd, &isect, &ray, state.bounce);
 		shader_eval_surface(kg, &sd, 0.0f, state.flag, SHADER_CONTEXT_MAIN);
 		shader_merge_closures(kg, &sd);
 

Modified: branches/soc-2013-dingto/intern/cycles/kernel/kernel_shader.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/kernel_shader.h	2013-07-09 00:17:43 UTC (rev 58090)
+++ branches/soc-2013-dingto/intern/cycles/kernel/kernel_shader.h	2013-07-09 00:18:13 UTC (rev 58091)
@@ -64,7 +64,7 @@
 __device
 #endif
 void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
-	const Intersection *isect, const Ray *ray)
+	const Intersection *isect, const Ray *ray, int bounce)
 {
 #ifdef __INSTANCING__
 	sd->object = (isect->object == ~0)? kernel_tex_fetch(__prim_object, isect->prim): isect->object;
@@ -80,6 +80,7 @@
 
 	sd->prim = kernel_tex_fetch(__prim_index, isect->prim);
 	sd->ray_length = isect->t;
+	sd->ray_depth = (float)bounce;
 
 #ifdef __HAIR__
 	if(kernel_tex_fetch(__prim_segment, isect->prim) != ~0) {
@@ -277,7 +278,7 @@
 #endif
 void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd,
 	const float3 P, const float3 Ng, const float3 I,
-	int shader, int object, int prim, float u, float v, float t, float time, int segment)
+	int shader, int object, int prim, float u, float v, float t, float time, int bounce, int segment)
 {
 	/* vectors */
 	sd->P = P;
@@ -300,6 +301,7 @@
 	sd->v = v;
 #endif
 	sd->ray_length = t;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list