[Bf-blender-cvs] [a2d3380] soc-2016-cycles_denoising: Cycles: Add a roughness variable to ShaderClosures to be used for the denoise feature heuristic

Lukas Stockner noreply at git.blender.org
Sat Jun 4 22:03:13 CEST 2016


Commit: a2d338091b727f48f8bbc8fb5b65434da09a7e2f
Author: Lukas Stockner
Date:   Sat Jun 4 21:37:30 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBa2d338091b727f48f8bbc8fb5b65434da09a7e2f

Cycles: Add a roughness variable to ShaderClosures to be used for the denoise feature heuristic

To produce better results for sharp reflections/refractions, the denoise features are only written at the first
rough/diffuse bounce. To determine whether the current bounce is rough/diffuse or not, the roughness of the individual
closures will be used.
Also, the PathState tracks the total length of the path, for the same reason (it might not be written at the first bounce).

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

M	intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
M	intern/cycles/kernel/closure/bsdf_hair.h
M	intern/cycles/kernel/closure/bsdf_microfacet.h
M	intern/cycles/kernel/closure/bsdf_reflection.h
M	intern/cycles/kernel/closure/bsdf_refraction.h
M	intern/cycles/kernel/closure/bsdf_transparent.h
M	intern/cycles/kernel/kernel_path_state.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/kernel/svm/svm_closure.h

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

diff --git a/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h b/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
index 8d7d533..1ab2fbd 100644
--- a/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
+++ b/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
@@ -35,6 +35,7 @@ ccl_device int bsdf_ashikhmin_shirley_setup(ShaderClosure *sc)
 {
 	sc->data0 = clamp(sc->data0, 1e-4f, 1.0f);
 	sc->data1 = sc->data0;
+	sc->roughness = sc->data0;
 
 	sc->type = CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID;
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
@@ -44,6 +45,7 @@ ccl_device int bsdf_ashikhmin_shirley_aniso_setup(ShaderClosure *sc)
 {
 	sc->data0 = clamp(sc->data0, 1e-4f, 1.0f);
 	sc->data1 = clamp(sc->data1, 1e-4f, 1.0f);
+	sc->roughness = sqrtf(sc->data0*sc->data1);
 
 	sc->type = CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID;
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
@@ -53,6 +55,7 @@ ccl_device void bsdf_ashikhmin_shirley_blur(ShaderClosure *sc, float roughness)
 {
 	sc->data0 = fmaxf(roughness, sc->data0); /* clamp roughness */
 	sc->data1 = fmaxf(roughness, sc->data1);
+	sc->roughness = sqrtf(sc->data0*sc->data1);
 }
 
 ccl_device_inline float bsdf_ashikhmin_shirley_roughness_to_exponent(float roughness)
diff --git a/intern/cycles/kernel/closure/bsdf_hair.h b/intern/cycles/kernel/closure/bsdf_hair.h
index 1e81617..326b5e2 100644
--- a/intern/cycles/kernel/closure/bsdf_hair.h
+++ b/intern/cycles/kernel/closure/bsdf_hair.h
@@ -41,6 +41,7 @@ ccl_device int bsdf_hair_reflection_setup(ShaderClosure *sc)
 	sc->type = CLOSURE_BSDF_HAIR_REFLECTION_ID;
 	sc->data0 = clamp(sc->data0, 0.001f, 1.0f);
 	sc->data1 = clamp(sc->data1, 0.001f, 1.0f);
+	sc->roughness = sqrtf(sc->data0*sc->data1);
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
 }
 
@@ -49,6 +50,7 @@ ccl_device int bsdf_hair_transmission_setup(ShaderClosure *sc)
 	sc->type = CLOSURE_BSDF_HAIR_TRANSMISSION_ID;
 	sc->data0 = clamp(sc->data0, 0.001f, 1.0f);
 	sc->data1 = clamp(sc->data1, 0.001f, 1.0f);
+	sc->roughness = sqrtf(sc->data0*sc->data1);
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
 }
 
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h
index 2a0e8f6..19d8cdf 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -237,7 +237,8 @@ ccl_device int bsdf_microfacet_ggx_setup(ShaderClosure *sc)
 {
 	sc->data0 = saturate(sc->data0); /* alpha_x */
 	sc->data1 = sc->data0; /* alpha_y */
-	
+	sc->roughness = sc->data0;
+
 	sc->type = CLOSURE_BSDF_MICROFACET_GGX_ID;
 
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
@@ -247,7 +248,8 @@ ccl_device int bsdf_microfacet_ggx_aniso_setup(ShaderClosure *sc)
 {
 	sc->data0 = saturate(sc->data0); /* alpha_x */
 	sc->data1 = saturate(sc->data1); /* alpha_y */
-	
+	sc->roughness = sqrtf(sc->data0*sc->data1);
+
 	sc->type = CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID;
 
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
@@ -257,6 +259,7 @@ ccl_device int bsdf_microfacet_ggx_refraction_setup(ShaderClosure *sc)
 {
 	sc->data0 = saturate(sc->data0); /* alpha_x */
 	sc->data1 = sc->data0; /* alpha_y */
+	sc->roughness = sc->data0;
 
 	sc->type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
 
@@ -267,6 +270,7 @@ ccl_device void bsdf_microfacet_ggx_blur(ShaderClosure *sc, float roughness)
 {
 	sc->data0 = fmaxf(roughness, sc->data0); /* alpha_x */
 	sc->data1 = fmaxf(roughness, sc->data1); /* alpha_y */
+	sc->roughness = sqrtf(sc->data0*sc->data1);
 }
 
 ccl_device float3 bsdf_microfacet_ggx_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
@@ -586,6 +590,7 @@ ccl_device int bsdf_microfacet_beckmann_setup(ShaderClosure *sc)
 {
 	sc->data0 = saturate(sc->data0); /* alpha_x */
 	sc->data1 = sc->data0; /* alpha_y */
+	sc->roughness = sc->data0;
 
 	sc->type = CLOSURE_BSDF_MICROFACET_BECKMANN_ID;
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
@@ -595,6 +600,7 @@ ccl_device int bsdf_microfacet_beckmann_aniso_setup(ShaderClosure *sc)
 {
 	sc->data0 = saturate(sc->data0); /* alpha_x */
 	sc->data1 = saturate(sc->data1); /* alpha_y */
+	sc->roughness = sqrtf(sc->data0*sc->data1);
 
 	sc->type = CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID;
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
@@ -604,6 +610,7 @@ ccl_device int bsdf_microfacet_beckmann_refraction_setup(ShaderClosure *sc)
 {
 	sc->data0 = saturate(sc->data0); /* alpha_x */
 	sc->data1 = sc->data0; /* alpha_y */
+	sc->roughness = sc->data0;
 
 	sc->type = CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
@@ -613,6 +620,7 @@ ccl_device void bsdf_microfacet_beckmann_blur(ShaderClosure *sc, float roughness
 {
 	sc->data0 = fmaxf(roughness, sc->data0); /* alpha_x */
 	sc->data1 = fmaxf(roughness, sc->data1); /* alpha_y */
+	sc->roughness = sqrtf(sc->data0*sc->data1);
 }
 
 ccl_device float3 bsdf_microfacet_beckmann_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
diff --git a/intern/cycles/kernel/closure/bsdf_reflection.h b/intern/cycles/kernel/closure/bsdf_reflection.h
index 303f4c9..e27c11b 100644
--- a/intern/cycles/kernel/closure/bsdf_reflection.h
+++ b/intern/cycles/kernel/closure/bsdf_reflection.h
@@ -40,6 +40,7 @@ CCL_NAMESPACE_BEGIN
 ccl_device int bsdf_reflection_setup(ShaderClosure *sc)
 {
 	sc->type = CLOSURE_BSDF_REFLECTION_ID;
+	sc->roughness = 0.0f;
 	return SD_BSDF;
 }
 
diff --git a/intern/cycles/kernel/closure/bsdf_refraction.h b/intern/cycles/kernel/closure/bsdf_refraction.h
index c78a4b6..1237570 100644
--- a/intern/cycles/kernel/closure/bsdf_refraction.h
+++ b/intern/cycles/kernel/closure/bsdf_refraction.h
@@ -40,6 +40,7 @@ CCL_NAMESPACE_BEGIN
 ccl_device int bsdf_refraction_setup(ShaderClosure *sc)
 {
 	sc->type = CLOSURE_BSDF_REFRACTION_ID;
+	sc->roughness = 0.0f;
 	return SD_BSDF;
 }
 
diff --git a/intern/cycles/kernel/closure/bsdf_transparent.h b/intern/cycles/kernel/closure/bsdf_transparent.h
index 3c2fd80..66fd10c 100644
--- a/intern/cycles/kernel/closure/bsdf_transparent.h
+++ b/intern/cycles/kernel/closure/bsdf_transparent.h
@@ -38,6 +38,7 @@ CCL_NAMESPACE_BEGIN
 ccl_device int bsdf_transparent_setup(ShaderClosure *sc)
 {
 	sc->type = CLOSURE_BSDF_TRANSPARENT_ID;
+	sc->roughness = 0.0f;
 	return SD_BSDF|SD_TRANSPARENT;
 }
 
diff --git a/intern/cycles/kernel/kernel_path_state.h b/intern/cycles/kernel/kernel_path_state.h
index 540f289..3d0c988 100644
--- a/intern/cycles/kernel/kernel_path_state.h
+++ b/intern/cycles/kernel/kernel_path_state.h
@@ -30,6 +30,8 @@ ccl_device_inline void path_state_init(KernelGlobals *kg, ccl_addr_space PathSta
 	state->transmission_bounce = 0;
 	state->transparent_bounce = 0;
 
+	state->path_length = 0.0f;
+
 	state->min_ray_pdf = FLT_MAX;
 	state->ray_pdf = 0.0f;
 #ifdef __LAMP_MIS__
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 613a3db..a21f669 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -660,7 +660,9 @@ typedef ccl_addr_space struct ShaderClosure {
 	 */
 	float custom1;
 	float custom2;
-	float custom3;
+
+	/* Used for the denoising heuristics. */
+	float roughness;
 
 #ifdef __OSL__
 	void *prim, *pad4;
@@ -850,6 +852,8 @@ typedef struct PathState {
 	int transmission_bounce;
 	int transparent_bounce;
 
+	float path_length;
+
 	/* multiple importance sampling */
 	float min_ray_pdf; /* smallest bounce pdf over entire path up to now */
 	float ray_pdf;     /* last bounce pdf */
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index 8839700..50e7cda 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -66,6 +66,7 @@ ccl_device_inline ShaderClosure *svm_node_closure_get_non_bsdf(ShaderData *sd, C
 		sc->data0 = 0.0f;
 		sc->data1 = 0.0f;
 		sc->data2 = 0.0f;
+		sc->roughness = 1.0f;
 #ifdef __OSL__
 		sc->prim = NULL;
 #endif
@@ -86,6 +87,7 @@ ccl_device_inline ShaderClosure *svm_node_closure_get_bsdf(ShaderData *sd, float
 	if(sample_weight > CLOSURE_WEIGHT_CUTOFF && ccl_fetch(sd, num_closure) < MAX_CLOSURE) {
 		sc->weight = weight;
 		sc->sample_weight = sample_weight;
+		sc->roughness = 1.0f;
 		ccl_fetch(sd, num_closure)++;
 #ifdef __OSL__
 		sc->prim = NULL;




More information about the Bf-blender-cvs mailing list