[Bf-blender-cvs] [34e9898c1e4] principled-v2: Avoid MicrofacetExtra allocation for clearcoat lobe

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


Commit: 34e9898c1e492a448e3fc8a40eed1911033cfc2a
Author: Lukas Stockner
Date:   Mon Jul 4 23:31:47 2022 +0200
Branches: principled-v2
https://developer.blender.org/rB34e9898c1e492a448e3fc8a40eed1911033cfc2a

Avoid MicrofacetExtra allocation for clearcoat lobe

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

M	intern/cycles/kernel/closure/bsdf_microfacet.h
M	intern/cycles/kernel/osl/closures.cpp
M	intern/cycles/kernel/svm/closure_principled.h
M	intern/cycles/kernel/svm/types.h

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

diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h
index 780041c2a52..2a37bb52a25 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -44,8 +44,7 @@ ccl_device_forceinline float3 reflection_color(ccl_private const MicrofacetBsdf
     return interpolate_fresnel_color(L, H, bsdf->ior, bsdf->extra->cspec0);
   }
   else if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
-    return 0.25f * interpolate_fresnel_color(L, H, bsdf->ior, bsdf->extra->cspec0) *
-           bsdf->extra->clearcoat;
+    return interpolate_fresnel_color(L, H, bsdf->ior, make_float3(0.04f, 0.04f, 0.04f));
   }
   else {
     return one_float3();
@@ -55,16 +54,12 @@ ccl_device_forceinline float3 reflection_color(ccl_private const MicrofacetBsdf
 ccl_device_forceinline void bsdf_microfacet_fresnel_color(ccl_private const ShaderData *sd,
                                                           ccl_private MicrofacetBsdf *bsdf)
 {
-  kernel_assert(CLOSURE_IS_BSDF_MICROFACET_FRESNEL(bsdf->type));
+  float3 average_fresnel = reflection_color(bsdf, sd->I, bsdf->N);
+  bsdf->sample_weight *= average(average_fresnel);
 
-  bsdf->extra->fresnel_color = interpolate_fresnel_color(
-      sd->I, bsdf->N, bsdf->ior, bsdf->extra->cspec0);
-
-  if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
-    bsdf->extra->fresnel_color *= 0.25f * bsdf->extra->clearcoat;
+  if (bsdf->extra) {
+    bsdf->extra->fresnel_color = average_fresnel;
   }
-
-  bsdf->sample_weight *= average(bsdf->extra->fresnel_color);
 }
 
 ccl_device_inline float3 microfacet_ggx_albedo_scaling(ccl_private const MicrofacetBsdf *bsdf,
diff --git a/intern/cycles/kernel/osl/closures.cpp b/intern/cycles/kernel/osl/closures.cpp
index f0660473650..80e0ac37c0f 100644
--- a/intern/cycles/kernel/osl/closures.cpp
+++ b/intern/cycles/kernel/osl/closures.cpp
@@ -264,24 +264,16 @@ class PrincipledClearcoatClosure : public CBSDFClosure {
   MicrofacetBsdf *alloc(ShaderData *sd, uint32_t path_flag, float3 weight)
   {
     MicrofacetBsdf *bsdf = (MicrofacetBsdf *)bsdf_alloc_osl(
-        sd, sizeof(MicrofacetBsdf), weight, &params);
+        sd, sizeof(MicrofacetBsdf), 0.25f * clearcoat * weight, &params);
     if (!bsdf) {
       return NULL;
     }
 
-    MicrofacetExtra *extra = (MicrofacetExtra *)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
-    if (!extra) {
-      return NULL;
-    }
-
     bsdf->T = make_float3(0.0f, 0.0f, 0.0f);
-    bsdf->extra = extra;
+    bsdf->extra = NULL;
     bsdf->ior = 1.5f;
     bsdf->alpha_x = clearcoat_roughness;
     bsdf->alpha_y = clearcoat_roughness;
-    bsdf->extra->color = make_float3(0.0f, 0.0f, 0.0f);
-    bsdf->extra->cspec0 = make_float3(0.04f, 0.04f, 0.04f);
-    bsdf->extra->clearcoat = clearcoat;
     return bsdf;
   }
 
diff --git a/intern/cycles/kernel/svm/closure_principled.h b/intern/cycles/kernel/svm/closure_principled.h
index abd4342b2fe..627f1b9bac6 100644
--- a/intern/cycles/kernel/svm/closure_principled.h
+++ b/intern/cycles/kernel/svm/closure_principled.h
@@ -360,24 +360,15 @@ ccl_device void svm_node_closure_principled(KernelGlobals kg,
 #endif
     if (clearcoat > CLOSURE_WEIGHT_CUTOFF) {
       ccl_private MicrofacetBsdf *bsdf = (ccl_private MicrofacetBsdf *)bsdf_alloc(
-          sd, sizeof(MicrofacetBsdf), weight);
-      ccl_private MicrofacetExtra *extra = (bsdf != NULL) ?
-                                               (ccl_private MicrofacetExtra *)closure_alloc_extra(
-                                                   sd, sizeof(MicrofacetExtra)) :
-                                               NULL;
+          sd, sizeof(MicrofacetBsdf), 0.25f * clearcoat * weight);
 
-      if (bsdf && extra) {
+      if (bsdf) {
         bsdf->N = clearcoat_normal;
         bsdf->T = make_float3(0.0f, 0.0f, 0.0f);
         bsdf->ior = 1.5f;
-        bsdf->extra = extra;
-
-        bsdf->alpha_x = clearcoat_roughness * clearcoat_roughness;
-        bsdf->alpha_y = clearcoat_roughness * clearcoat_roughness;
+        bsdf->extra = NULL;
 
-        bsdf->extra->color = make_float3(0.0f, 0.0f, 0.0f);
-        bsdf->extra->cspec0 = make_float3(0.04f, 0.04f, 0.04f);
-        bsdf->extra->clearcoat = clearcoat;
+        bsdf->alpha_x = bsdf->alpha_y = sqr(clearcoat_roughness);
 
         /* setup bsdf */
         sd->flag |= bsdf_microfacet_ggx_clearcoat_setup(bsdf, sd);
diff --git a/intern/cycles/kernel/svm/types.h b/intern/cycles/kernel/svm/types.h
index d31e90a0541..b3a9eb64922 100644
--- a/intern/cycles/kernel/svm/types.h
+++ b/intern/cycles/kernel/svm/types.h
@@ -585,7 +585,6 @@ typedef enum ClosureType {
     type <= CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID))
 #define CLOSURE_IS_BSDF_MICROFACET_FRESNEL(type) \
   (type == CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID || \
-   type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID || \
    type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID)
 #define CLOSURE_IS_BSDF_OR_BSSRDF(type) (type <= CLOSURE_BSSRDF_RANDOM_WALK_FIXED_RADIUS_ID)
 #define CLOSURE_IS_BSSRDF(type) \



More information about the Bf-blender-cvs mailing list