[Bf-blender-cvs] [8dd41674b5f] principled-v2: Replace clearcoat in v2 with regular dielectric GGX closure instead of GTR1

Lukas Stockner noreply at git.blender.org
Mon Jul 4 23:56:15 CEST 2022


Commit: 8dd41674b5fac47cfc3c2dbd0f89815fa01e11c5
Author: Lukas Stockner
Date:   Mon Jul 4 23:31:48 2022 +0200
Branches: principled-v2
https://developer.blender.org/rB8dd41674b5fac47cfc3c2dbd0f89815fa01e11c5

Replace clearcoat in v2 with regular dielectric GGX closure instead of GTR1

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

M	intern/cycles/kernel/closure/bsdf.h
M	intern/cycles/kernel/closure/bsdf_microfacet.h
M	intern/cycles/kernel/svm/closure_principled.h
M	intern/cycles/kernel/svm/types.h

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

diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h
index e8fb95ab557..88196fc4192 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -234,6 +234,7 @@ ccl_device_inline int bsdf_sample(KernelGlobals kg,
     case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID:
     case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_V2_ID:
     case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID:
+    case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_V2_ID:
     case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
       label = bsdf_microfacet_ggx_sample(sc,
                                          Ng,
@@ -485,6 +486,7 @@ ccl_device_inline
       case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID:
       case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_V2_ID:
       case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID:
+      case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_V2_ID:
       case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
         eval = bsdf_microfacet_ggx_eval_reflect(sc, sd->I, omega_in, pdf);
         break;
@@ -567,6 +569,7 @@ ccl_device_inline
       case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID:
       case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_V2_ID:
       case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID:
+      case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_V2_ID:
       case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
         eval = bsdf_microfacet_ggx_eval_transmit(sc, sd->I, omega_in, pdf);
         break;
@@ -634,6 +637,7 @@ ccl_device void bsdf_blur(KernelGlobals kg, ccl_private ShaderClosure *sc, float
     case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID:
     case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_V2_ID:
     case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID:
+    case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_V2_ID:
     case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
     case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
     case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h
index 6b9309c0fa6..6168eab8f98 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -56,6 +56,10 @@ ccl_device_forceinline float3 reflection_color(ccl_private const MicrofacetBsdf
   else if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
     return interpolate_fresnel_color(L, H, bsdf->ior, make_float3(0.04f, 0.04f, 0.04f));
   }
+  else if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_V2_ID) {
+    float f = fresnel_dielectric_cos(dot(H, L), bsdf->ior);
+    return make_float3(f, f, f);
+  }
   else if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_V2_ID) {
     MicrofacetExtrav2 *extra = (MicrofacetExtrav2*) bsdf->extra;
     float cosHL = dot(H, L);
@@ -220,6 +224,22 @@ ccl_device int bsdf_microfacet_ggx_clearcoat_setup(ccl_private MicrofacetBsdf *b
   return SD_BSDF | SD_BSDF_HAS_EVAL;
 }
 
+ccl_device int bsdf_microfacet_ggx_clearcoat_v2_setup(ccl_private MicrofacetBsdf *bsdf,
+                                                      ccl_private const ShaderData *sd)
+{
+  bsdf->alpha_x = saturatef(bsdf->alpha_x);
+  bsdf->alpha_y = bsdf->alpha_x;
+
+  bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_V2_ID;
+
+  float Fss = dielectric_fresnel_Fss(bsdf->ior);
+  bsdf->weight *= microfacet_ggx_albedo_scaling_float(bsdf, sd, Fss);
+
+  bsdf_microfacet_fresnel_color(sd, bsdf);
+
+  return SD_BSDF | SD_BSDF_HAS_EVAL;
+}
+
 ccl_device int bsdf_microfacet_ggx_refraction_setup(ccl_private MicrofacetBsdf *bsdf)
 {
   bsdf->extra = NULL;
diff --git a/intern/cycles/kernel/svm/closure_principled.h b/intern/cycles/kernel/svm/closure_principled.h
index 8074646386d..0d50f396e80 100644
--- a/intern/cycles/kernel/svm/closure_principled.h
+++ b/intern/cycles/kernel/svm/closure_principled.h
@@ -506,7 +506,7 @@ ccl_device_inline float principled_v2_clearcoat(KernelGlobals kg,
   bsdf->alpha_x = bsdf->alpha_y = sqr(roughness);
 
   /* setup bsdf */
-  sd->flag |= bsdf_microfacet_ggx_clearcoat_setup(bsdf, sd);
+  sd->flag |= bsdf_microfacet_ggx_clearcoat_v2_setup(bsdf, sd);
 
   return 0.04f * clearcoat;  // TODO better approx
 }
diff --git a/intern/cycles/kernel/svm/types.h b/intern/cycles/kernel/svm/types.h
index d87e4d35572..755f36f8ffd 100644
--- a/intern/cycles/kernel/svm/types.h
+++ b/intern/cycles/kernel/svm/types.h
@@ -523,6 +523,8 @@ typedef enum ClosureType {
   CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_V2_ID,
   /* GTR1 for Clearcoat (TODO: Rename, is not really GGX) */
   CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID,
+  /* GGX with dielectric Fresnel term (used for Clearcoat for v2) */
+  CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_V2_ID,
   /* Virtual closure, gets turned into regular GGX with adjusted weight */
   CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID,
   CLOSURE_BSDF_MICROFACET_BECKMANN_ID,



More information about the Bf-blender-cvs mailing list