[Bf-blender-cvs] [c553041b817] cycles_texture_cache: Cycles: Added texture differentials to mesh light sampling. Currently based on purely specular reflection, can probably be wider than that.

Stefan Werner noreply at git.blender.org
Mon Nov 27 20:40:27 CET 2017


Commit: c553041b817a9f6ac8121e17ab30193f02f3e870
Author: Stefan Werner
Date:   Mon May 15 19:48:01 2017 +0200
Branches: cycles_texture_cache
https://developer.blender.org/rBc553041b817a9f6ac8121e17ab30193f02f3e870

Cycles: Added texture differentials to mesh light sampling. Currently based on purely specular reflection, can probably be wider than that.

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

M	intern/cycles/kernel/kernel_bake.h
M	intern/cycles/kernel/kernel_differential.h
M	intern/cycles/kernel/kernel_emission.h
M	intern/cycles/kernel/kernel_shader.h
M	intern/cycles/kernel/svm/svm.h
M	intern/cycles/kernel/svm/svm_image.h

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

diff --git a/intern/cycles/kernel/kernel_bake.h b/intern/cycles/kernel/kernel_bake.h
index 8788e89c40e..f8b625b3cdb 100644
--- a/intern/cycles/kernel/kernel_bake.h
+++ b/intern/cycles/kernel/kernel_bake.h
@@ -301,7 +301,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
 	PathRadiance L;
 
 	shader_setup_from_sample(kg, &sd,
-	                         P, Ng, Ng,
+	                         P, Ng, Ng, NULL,
 	                         shader, object, prim,
 	                         u, v, 1.0f, 0.5f,
 	                         !(kernel_tex_fetch(__object_flag, object) & SD_OBJECT_TRANSFORM_APPLIED),
diff --git a/intern/cycles/kernel/kernel_differential.h b/intern/cycles/kernel/kernel_differential.h
index ae1e70f0167..5f6b913defc 100644
--- a/intern/cycles/kernel/kernel_differential.h
+++ b/intern/cycles/kernel/kernel_differential.h
@@ -31,6 +31,19 @@ ccl_device void differential_transfer(ccl_addr_space differential3 *dP_, const d
 	dP_->dy = tmpy - dot(tmpy, Ng)*tmp;
 }
 
+ccl_device void differential_reflect(ccl_addr_space differential3 *dD_, float3 D, const differential3* dD, float3 N, const differential3* dN)
+{
+	/* ray differential transfer through homogeneous medium, to
+	 * compute dPdx/dy at a shading point from the incoming ray */
+
+	const float dotDN = dot(D, N);
+	const float3 tmpx = N * (dot(dD->dx, N) + dot(D, dN->dx));
+	const float3 tmpy = N * (dot(dD->dy, N) + dot(D, dN->dy));
+
+	dD_->dx = dD->dx - 2.0f * (dotDN * dN->dx + tmpx);
+	dD_->dy = dD->dy - 2.0f * (dotDN * dN->dy + tmpy);
+}
+
 ccl_device void differential_incoming(ccl_addr_space differential3 *dI, const differential3 dD)
 {
 	/* compute dIdx/dy at a shading point, we just need to negate the
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 94b0a37ce62..02541221130 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -61,7 +61,7 @@ ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
 	else
 	{
 		shader_setup_from_sample(kg, emission_sd,
-		                         ls->P, ls->Ng, I,
+		                         ls->P, ls->Ng, I, &dI,
 		                         ls->shader, ls->object, ls->prim,
 		                         ls->u, ls->v, t, time, false, ls->lamp);
 
@@ -95,9 +95,16 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg,
 	if(ls->pdf == 0.0f)
 		return false;
 
-	/* todo: implement */
 	differential3 dD = differential3_zero();
 
+	/* todo: implement */
+	differential3 dN = differential3_zero();
+
+	/* This is how differentials are calculated for a perfect specular reflection.
+	 * This is not the exact value that we should be getting here,
+	 * but it's still better than using zero differentials. */
+	differential_reflect(&dD, ray->D, &ray->dD, sd->N, &dN);
+
 	/* evaluate closure */
 
 	float3 light_eval = direct_emissive_eval(kg,
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index ed9a917ff2d..2fb1743f00d 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -268,6 +268,7 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg,
                                                 const float3 P,
                                                 const float3 Ng,
                                                 const float3 I,
+												const differential3 *dI,
                                                 int shader, int object, int prim,
                                                 float u, float v, float t,
                                                 float time,
@@ -390,11 +391,18 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg,
 	}
 
 #ifdef __RAY_DIFFERENTIALS__
-	/* no ray differentials here yet */
-	sd->dP = differential3_zero();
-	sd->dI = differential3_zero();
-	sd->du = differential_zero();
-	sd->dv = differential_zero();
+	if(dI) {
+		sd->dI = *dI;
+		differential_transfer(&sd->dP, differential3_zero(), I, *dI, Ng, t);
+		differential_dudv(&sd->du, &sd->dv, sd->dPdu, sd->dPdv, sd->dP, sd->Ng);
+	}
+	else {
+		sd->dP = differential3_zero();
+		sd->dI = differential3_zero();
+		sd->du = differential_zero();
+		sd->dv = differential_zero();
+	}
+
 #endif
 }
 
@@ -412,7 +420,7 @@ ccl_device void shader_setup_from_displace(KernelGlobals *kg, ShaderData *sd,
 	shader |= SHADER_SMOOTH_NORMAL;
 
 	shader_setup_from_sample(kg, sd,
-	                         P, Ng, I,
+	                         P, Ng, I, NULL,
 	                         shader, object, prim,
 	                         u, v, 0.0f, 0.5f,
 	                         !(kernel_tex_fetch(__object_flag, object) & SD_OBJECT_TRANSFORM_APPLIED),
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index a6516cd203b..8ed7416f51d 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -383,7 +383,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a
 				break;
 #  ifdef __TEXTURES__
 			case NODE_TEX_ENVIRONMENT:
-				svm_node_tex_environment(kg, sd, stack, node);
+				svm_node_tex_environment(kg, sd, path_flag, stack, node);
 				break;
 			case NODE_TEX_SKY:
 				svm_node_tex_sky(kg, sd, stack, node, &offset);
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index ccc0a328f2e..4baf72fae4c 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -24,29 +24,24 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y,
 {
 	float4 r;
 #  ifdef __OIIO__
-	if(kg->oiio && kg->oiio->tex_paths.size() > id) {
+	if(kg->oiio && kg->oiio->tex_paths.size() > id && kg->oiio->tex_paths[id]) {
 		OIIO::TextureOpt options;
 		options.swrap = options.twrap = OIIO::TextureOpt::WrapPeriodic;
-#if 0
-		options.interpmode = OIIO::TextureOpt::InterpBilinear;
-		options.mipmode = OIIO::TextureOpt::MipModeNoMIP;
-#else
+
 		if(fast_lookup) {
 			options.interpmode = OIIO::TextureOpt::InterpClosest;
 			options.mipmode = OIIO::TextureOpt::MipModeOneLevel;
 		}
 		else {
-			options.interpmode = OIIO::TextureOpt::InterpSmartBicubic;
+			options.interpmode = OIIO::TextureOpt::InterpBilinear;
 			options.mipmode = OIIO::TextureOpt::MipModeAniso;
 		}
-#endif
-		if(kg->oiio->tex_paths[id]) {
-			bool success = kg->oiio->tex_sys->texture(kg->oiio->tex_paths[id], kg->oiio->tex_sys->get_perthread_info(), options, x, 1.0f - y, ds.dx, ds.dy, dt.dx, dt.dy, 3, (float*)&r);
-			if(!success) {
-				(void) kg->oiio->tex_sys->geterror();
-			}
+		bool success = kg->oiio->tex_sys->texture(kg->oiio->tex_paths[id], kg->oiio->tex_sys->get_perthread_info(), options, x, 1.0f - y, ds.dx, ds.dy, dt.dx, dt.dy, 3, (float*)&r);
+		if(!success) {
+			(void) kg->oiio->tex_sys->geterror();
 		}
-	} else
+	}
+	else
 #  endif
 	r = kernel_tex_image_interp(kg, id, x, y);
 	const float alpha = r.w;
@@ -227,7 +222,7 @@ ccl_device void svm_node_tex_image_box(KernelGlobals *kg, ShaderData *sd, float
 		stack_store_float(stack, alpha_offset, f.w);
 }
 
-ccl_device void svm_node_tex_environment(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
+ccl_device void svm_node_tex_environment(KernelGlobals *kg, ShaderData *sd, int path_flag, float *stack, uint4 node)
 {
 	uint id = node.y;
 	uint co_offset, out_offset, alpha_offset, srgb;
@@ -245,8 +240,9 @@ ccl_device void svm_node_tex_environment(KernelGlobals *kg, ShaderData *sd, floa
 	else
 		uv = direction_to_mirrorball(co);
 
+	bool fast_lookup = path_flag & (PATH_RAY_DIFFUSE | PATH_RAY_SHADOW | PATH_RAY_DIFFUSE_ANCESTOR | PATH_RAY_VOLUME_SCATTER);
 	uint use_alpha = stack_valid(alpha_offset);
-	float4 f = svm_image_texture(kg, id, uv.x, uv.y, differential_zero(), differential_zero(), srgb, use_alpha, false);
+	float4 f = svm_image_texture(kg, id, uv.x, uv.y, differential_zero(), differential_zero(), srgb, use_alpha, fast_lookup);
 
 	if(stack_valid(out_offset))
 		stack_store_float3(stack, out_offset, make_float3(f.x, f.y, f.z));



More information about the Bf-blender-cvs mailing list