[Bf-blender-cvs] [cacd74fb3f5] principled-v2: Merge v1 and v2 clearcoat closures

Lukas Stockner noreply at git.blender.org
Sun Oct 30 00:17:16 CEST 2022


Commit: cacd74fb3f545cfac183995a73ad5bee49d4e706
Author: Lukas Stockner
Date:   Sun Oct 30 00:14:03 2022 +0200
Branches: principled-v2
https://developer.blender.org/rBcacd74fb3f545cfac183995a73ad5bee49d4e706

Merge v1 and v2 clearcoat closures

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

M	intern/cycles/app/cycles_precompute.cpp
M	intern/cycles/kernel/closure/bsdf.h
M	intern/cycles/kernel/closure/bsdf_microfacet.h
M	intern/cycles/kernel/svm/types.h

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

diff --git a/intern/cycles/app/cycles_precompute.cpp b/intern/cycles/app/cycles_precompute.cpp
index b55246e9e91..322a9631491 100644
--- a/intern/cycles/app/cycles_precompute.cpp
+++ b/intern/cycles/app/cycles_precompute.cpp
@@ -71,7 +71,7 @@ static float precompute_clearcoat_E(float rough, float mu, float u1, float u2)
 {
   MicrofacetBsdf bsdf;
   bsdf.weight = one_float3();
-  bsdf.type = CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_V2_ID;
+  bsdf.type = CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID;
   bsdf.sample_weight = 1.0f;
   bsdf.N = make_float3(0.0f, 0.0f, 1.0f);
   bsdf.alpha_x = bsdf.alpha_y = sqr(rough);
diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h
index fbda52d74c4..b0be0c80ee7 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -171,7 +171,6 @@ 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, sd->I, randu, randv, eval, omega_in, pdf, sampled_roughness, eta);
@@ -324,7 +323,6 @@ ccl_device_inline void bsdf_roughness_eta(const 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: {
       ccl_private const MicrofacetBsdf *bsdf = (ccl_private const MicrofacetBsdf *)sc;
       *roughness = make_float2(bsdf->alpha_x, bsdf->alpha_y);
@@ -439,7 +437,6 @@ ccl_device_inline int bsdf_label(const 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_BECKMANN_ID: {
       ccl_private const MicrofacetBsdf *bsdf = (ccl_private const MicrofacetBsdf *)sc;
       label = (bsdf->alpha_x * bsdf->alpha_y <= 1e-7f) ? LABEL_REFLECT | LABEL_SINGULAR :
@@ -552,9 +549,7 @@ ccl_device_inline
       break;
     case CLOSURE_BSDF_MICROFACET_GGX_ID:
     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(sc, sd->I, omega_in, pdf);
       break;
@@ -631,7 +626,6 @@ 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 e0b513b69f1..64e3ce7ba50 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -54,24 +54,25 @@ ccl_device_forceinline Spectrum reflection_color(ccl_private const MicrofacetBsd
     return interpolate_fresnel_color(L, H, bsdf->ior, bsdf->extra->cspec0);
   }
   else if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
-    return interpolate_fresnel_color(L, H, bsdf->ior, make_spectrum(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_spectrum(f);
   }
   else if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_V2_ID) {
     MicrofacetExtrav2 *extra = (MicrofacetExtrav2 *)bsdf->extra;
+    Spectrum F = zero_spectrum();
     float cosHL = dot(H, L);
-    /* Metallic Fresnel: Kinda Schlick-Fresnel-like with configurable F0 and F90
-     * as well as falloff control. F90=white and falloff=0.2 gives classic Schlick Fresnel.
-     * Metallic factor and albedo scaling is baked into the F0 and F90 parameters. */
-    Spectrum metallic = extra->metallic *
-                        fresnel_metallic(extra->metal_base, extra->metal_edge_factor, cosHL);
-    /* Dielectric Fresnel, just basic IOR control. */
-    float dielectric = extra->dielectric * fresnel_dielectric_cos(cosHL, bsdf->ior);
-
-    return metallic + make_spectrum(dielectric);
+
+    if (extra->dielectric > 0.0f) {
+      /* Dielectric Fresnel, just basic IOR control. */
+      F += make_spectrum(extra->dielectric * fresnel_dielectric_cos(cosHL, bsdf->ior));
+    }
+
+    if (extra->metallic != zero_spectrum()) {
+      /* Fresnel term with edge color control, see fresnel_metallic for details. */
+      F += extra->metallic * fresnel_metallic(extra->metal_base, extra->metal_edge_factor, cosHL);
+    }
+
+    return F;
   }
   else {
     return one_spectrum();
@@ -204,6 +205,7 @@ ccl_device int bsdf_microfacet_ggx_fresnel_v2_setup(KernelGlobals kg,
   return SD_BSDF | SD_BSDF_HAS_EVAL;
 }
 
+/* Legacy clearcoat model, doesn't use energy conservation. */
 ccl_device int bsdf_microfacet_ggx_clearcoat_setup(ccl_private MicrofacetBsdf *bsdf,
                                                    ccl_private const ShaderData *sd)
 {
@@ -211,6 +213,7 @@ ccl_device int bsdf_microfacet_ggx_clearcoat_setup(ccl_private MicrofacetBsdf *b
   bsdf->alpha_y = bsdf->alpha_x;
 
   bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID;
+  bsdf->ior = 1.5f;
 
   bsdf_microfacet_fresnel_color(sd, bsdf);
 
@@ -224,7 +227,7 @@ ccl_device int bsdf_microfacet_ggx_clearcoat_v2_setup(KernelGlobals kg,
   bsdf->alpha_x = saturatef(bsdf->alpha_x);
   bsdf->alpha_y = bsdf->alpha_x;
 
-  bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_V2_ID;
+  bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID;
 
   float Fss = dielectric_fresnel_Fss(bsdf->ior);
   bsdf->weight *= microfacet_ggx_albedo_scaling_float(kg, bsdf, sd, Fss);
@@ -283,6 +286,7 @@ ccl_device Spectrum bsdf_microfacet_ggx_eval_reflect(ccl_private const Microface
   if (alpha_x == alpha_y) {
     /* Isotropic case */
 
+    /* TODO: Should we just use regular GGX for clearcoat as well? */
     if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
       /* use GTR1 for clearcoat */
       D = microfacet_GTR1_D(dot(N, m), alpha2);
@@ -467,6 +471,7 @@ ccl_device int bsdf_microfacet_ggx_sample(ccl_private const ShaderClosure *sc,
     if (alpha_x == alpha_y) {
       /* Isotropic case */
 
+      /* TODO: Should we just use regular GGX for clearcoat as well? */
       if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
         /* use GTR1 for clearcoat */
         D = microfacet_GTR1_D(cosThetaM, alpha2);
diff --git a/intern/cycles/kernel/svm/types.h b/intern/cycles/kernel/svm/types.h
index bce403a2df5..d324b75fce0 100644
--- a/intern/cycles/kernel/svm/types.h
+++ b/intern/cycles/kernel/svm/types.h
@@ -426,10 +426,8 @@ typedef enum ClosureType {
   CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID,
   /* GGX with v2 Principled Fresnel term */
   CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_V2_ID,
-  /* GTR1 for Clearcoat (TODO: Rename, is not really GGX) */
+  /* GTR1 with dielectric Fresnel term, for clearcoat (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