[Bf-blender-cvs] [bbc5d9d] cycles_disney_brdf: Switched from uniform to cosine hemisphere sampling for the diffuse and the sheen part.

Pascal Schoen noreply at git.blender.org
Wed Oct 26 09:07:50 CEST 2016


Commit: bbc5d9d4527346a74155cf17be21fb02ee3e0779
Author: Pascal Schoen
Date:   Tue Oct 25 11:09:36 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rBbbc5d9d4527346a74155cf17be21fb02ee3e0779

Switched from uniform to cosine hemisphere sampling for the diffuse and
the sheen part.

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

M	intern/cycles/kernel/closure/bsdf_disney_diffuse.h
M	intern/cycles/kernel/closure/bsdf_disney_sheen.h

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

diff --git a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
index 9262203..222dec4 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
@@ -50,8 +50,6 @@ ccl_device float3 calculate_disney_diffuse_brdf(const DisneyDiffuseBsdf *bsdf,
 
 	float value = M_1_PI_F * Fd;
 
-	*pdf = M_1_PI_F * 0.5f;
-
 	value *= NdotL;
 
 	return make_float3(value, value, value);
@@ -73,10 +71,10 @@ ccl_device float3 bsdf_disney_diffuse_eval_reflect(const ShaderClosure *sc, cons
 	float3 L = omega_in; // incoming
 	float3 H = normalize(L + V);
 
-    if(dot(bsdf->N, omega_in) > 0.0f) {
-        float3 value = calculate_disney_diffuse_brdf(bsdf, N, V, L, H, pdf);
-
-		return value;
+    if(dot(N, omega_in) > 0.0f) {
+        float cos_pi = fmaxf(dot(N, omega_in), 0.0f) * M_1_PI_F;
+        *pdf = cos_pi;
+        return calculate_disney_diffuse_brdf(bsdf, N, V, L, H, pdf);
     }
     else {
         *pdf = 0.0f;
@@ -99,7 +97,7 @@ ccl_device int bsdf_disney_diffuse_sample(const ShaderClosure *sc,
 
 	float3 N = bsdf->N;
 
-	sample_uniform_hemisphere(N, randu, randv, omega_in, pdf);
+	sample_cos_hemisphere(N, randu, randv, omega_in, pdf);
 
 	if(dot(Ng, *omega_in) > 0) {
 		float3 H = normalize(I + *omega_in);
diff --git a/intern/cycles/kernel/closure/bsdf_disney_sheen.h b/intern/cycles/kernel/closure/bsdf_disney_sheen.h
index 7d3b438..1e274b9 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_sheen.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_sheen.h
@@ -42,8 +42,6 @@ ccl_device float3 calculate_disney_sheen_brdf(const DisneySheenBsdf *bsdf,
 
 	float LdotH = dot(L, H);
 
-	*pdf = M_1_PI_F * 0.5f;
-
 	float FH = schlick_fresnel(LdotH);
 
 	float value = FH;
@@ -69,10 +67,10 @@ ccl_device float3 bsdf_disney_sheen_eval_reflect(const ShaderClosure *sc, const
 	float3 L = omega_in; // incoming
 	float3 H = normalize(L + V);
 
-    if(dot(bsdf->N, omega_in) > 0.0f) {
-        float3 value = calculate_disney_sheen_brdf(bsdf, N, V, L, H, pdf);
-
-		return value;
+    if(dot(N, omega_in) > 0.0f) {
+        float cos_pi = fmaxf(dot(N, omega_in), 0.0f) * M_1_PI_F;
+        *pdf = cos_pi;
+        return calculate_disney_sheen_brdf(bsdf, N, V, L, H, pdf);
     }
     else {
         *pdf = 0.0f;
@@ -95,7 +93,7 @@ ccl_device int bsdf_disney_sheen_sample(const ShaderClosure *sc,
 
 	float3 N = bsdf->N;
 
-	sample_uniform_hemisphere(N, randu, randv, omega_in, pdf);
+	sample_cos_hemisphere(N, randu, randv, omega_in, pdf);
 
 	if(dot(Ng, *omega_in) > 0) {
 		float3 H = normalize(I + *omega_in);




More information about the Bf-blender-cvs mailing list