[Bf-blender-cvs] [e034ad0174b] principled-v2: Remove multiscattering GGX closures, replace with singlescattering equivalents

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


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

Remove multiscattering GGX closures, replace with singlescattering equivalents

This commit does not include the albedo-scaling yet.

To preserve the overall shape/look of the multiscattering glass, we use the microfacet-Fresnel-based GGX glass as a replacement.

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

M	intern/cycles/kernel/CMakeLists.txt
M	intern/cycles/kernel/closure/bsdf.h
M	intern/cycles/kernel/closure/bsdf_microfacet.h
D	intern/cycles/kernel/closure/bsdf_microfacet_multi.h
D	intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h
M	intern/cycles/kernel/svm/closure.h
M	intern/cycles/kernel/svm/types.h
M	intern/cycles/scene/shader_graph.cpp

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

diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index face2b80f44..1e2158ba2ee 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -101,8 +101,6 @@ set(SRC_KERNEL_CLOSURE_HEADERS
   closure/bsdf_diffuse_ramp.h
   closure/bsdf_microfacet.h
   closure/bsdf_microfacet_beckmann.h
-  closure/bsdf_microfacet_multi.h
-  closure/bsdf_microfacet_multi_impl.h
   closure/bsdf_microfacet_glass.h
   closure/bsdf_microfacet_util.h
   closure/bsdf_oren_nayar.h
diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h
index 90e39e28334..3a578b9f06e 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -11,7 +11,6 @@
 #include "kernel/closure/bsdf_diffuse_ramp.h"
 #include "kernel/closure/bsdf_microfacet.h"
 #include "kernel/closure/bsdf_microfacet_beckmann.h"
-#include "kernel/closure/bsdf_microfacet_multi.h"
 #include "kernel/closure/bsdf_microfacet_glass.h"
 #include "kernel/closure/bsdf_reflection.h"
 #include "kernel/closure/bsdf_refraction.h"
@@ -248,10 +247,9 @@ ccl_device_inline int bsdf_sample(KernelGlobals kg,
                                          &domega_in->dy,
                                          pdf);
       break;
-    case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
-    case CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID:
-      label = bsdf_microfacet_multi_ggx_sample(kg,
-                                               sc,
+    case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
+    case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
+      label = bsdf_microfacet_ggx_glass_sample(sc,
                                                Ng,
                                                sd->I,
                                                sd->dI.dx,
@@ -265,23 +263,6 @@ ccl_device_inline int bsdf_sample(KernelGlobals kg,
                                                pdf,
                                                &sd->lcg_state);
       break;
-    case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
-    case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
-      label = bsdf_microfacet_multi_ggx_glass_sample(kg,
-                                                     sc,
-                                                     Ng,
-                                                     sd->I,
-                                                     sd->dI.dx,
-                                                     sd->dI.dy,
-                                                     randu,
-                                                     randv,
-                                                     eval,
-                                                     omega_in,
-                                                     &domega_in->dx,
-                                                     &domega_in->dy,
-                                                     pdf,
-                                                     &sd->lcg_state);
-      break;
     case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
     case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
       label = bsdf_microfacet_beckmann_sample(kg,
@@ -504,14 +485,9 @@ ccl_device_inline
       case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
         eval = bsdf_microfacet_ggx_eval_reflect(sc, sd->I, omega_in, pdf);
         break;
-      case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
-      case CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID:
-        eval = bsdf_microfacet_multi_ggx_eval_reflect(sc, sd->I, omega_in, pdf, &sd->lcg_state);
-        break;
       case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
       case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
-        eval = bsdf_microfacet_multi_ggx_glass_eval_reflect(
-            sc, sd->I, omega_in, pdf, &sd->lcg_state);
+        eval = bsdf_microfacet_ggx_glass_eval_reflect(sc, sd->I, omega_in, pdf);
         break;
       case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
       case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
@@ -589,14 +565,9 @@ ccl_device_inline
       case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
         eval = bsdf_microfacet_ggx_eval_transmit(sc, sd->I, omega_in, pdf);
         break;
-      case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
-      case CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID:
-        eval = bsdf_microfacet_multi_ggx_eval_transmit(sc, sd->I, omega_in, pdf, &sd->lcg_state);
-        break;
       case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
       case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
-        eval = bsdf_microfacet_multi_ggx_glass_eval_transmit(
-            sc, sd->I, omega_in, pdf, &sd->lcg_state);
+        eval = bsdf_microfacet_ggx_glass_eval_transmit(sc, sd->I, omega_in, pdf);
         break;
       case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
       case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
@@ -653,16 +624,12 @@ ccl_device void bsdf_blur(KernelGlobals kg, ccl_private ShaderClosure *sc, float
   /* TODO: do we want to blur volume closures? */
 #ifdef __SVM__
   switch (sc->type) {
-    case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
-    case CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID:
-    case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
-    case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
-      bsdf_microfacet_multi_ggx_blur(sc, roughness);
-      break;
     case CLOSURE_BSDF_MICROFACET_GGX_ID:
     case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID:
     case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_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:
       bsdf_microfacet_ggx_blur(sc, roughness);
       break;
     case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h
index 000bde9e5d5..4a4c01b8117 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -87,6 +87,13 @@ ccl_device int bsdf_microfacet_ggx_isotropic_setup(ccl_private MicrofacetBsdf *b
   return bsdf_microfacet_ggx_setup(bsdf);
 }
 
+ccl_device int bsdf_microfacet_multi_ggx_setup(ccl_private MicrofacetBsdf *bsdf,
+                                               ccl_private const ShaderData *sd,
+                                               const float3 color)
+{
+  return bsdf_microfacet_ggx_setup(bsdf);
+}
+
 ccl_device int bsdf_microfacet_ggx_fresnel_setup(ccl_private MicrofacetBsdf *bsdf,
                                                  ccl_private const ShaderData *sd)
 {
@@ -102,6 +109,12 @@ ccl_device int bsdf_microfacet_ggx_fresnel_setup(ccl_private MicrofacetBsdf *bsd
   return SD_BSDF | SD_BSDF_HAS_EVAL;
 }
 
+ccl_device int bsdf_microfacet_multi_ggx_fresnel_setup(ccl_private MicrofacetBsdf *bsdf,
+                                                       ccl_private const ShaderData *sd)
+{
+  return bsdf_microfacet_ggx_fresnel_setup(bsdf, sd);
+}
+
 ccl_device int bsdf_microfacet_ggx_clearcoat_setup(ccl_private MicrofacetBsdf *bsdf,
                                                    ccl_private const ShaderData *sd)
 {
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
deleted file mode 100644
index b2e068daf17..00000000000
--- a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
+++ /dev/null
@@ -1,762 +0,0 @@
-/* SPDX-License-Identifier: Apache-2.0
- * Copyright 2011-2022 Blender Foundation */
-
-#pragma once
-
-#include "kernel/sample/lcg.h"
-#include "kernel/sample/mapping.h"
-
-CCL_NAMESPACE_BEGIN
-
-/* Most of the code is based on the supplemental implementations from
- * https://eheitzresearch.wordpress.com/240-2/. */
-
-/* === GGX Microfacet distribution functions === */
-
-/* Isotropic GGX microfacet distribution */
-ccl_device_forceinline float D_ggx(float3 wm, float alpha)
-{
-  wm.z *= wm.z;
-  alpha *= alpha;
-  float tmp = (1.0f - wm.z) + alpha * wm.z;
-  return alpha / max(M_PI_F * tmp * tmp, 1e-7f);
-}
-
-/* Anisotropic GGX microfacet distribution */
-ccl_device_forceinline float D_ggx_aniso(const float3 wm, const float2 alpha)
-{
-  float slope_x = -wm.x / alpha.x;
-  float slope_y = -wm.y / alpha.y;
-  float tmp = wm.z * wm.z + slope_x * slope_x + slope_y * slope_y;
-
-  return 1.0f / max(M_PI_F * tmp * tmp * alpha.x * alpha.y, 1e-7f);
-}
-
-/* Sample slope distribution (based on page 14 of the supplemental implementation). */
-ccl_device_forceinline float2 mf_sampleP22_11(const float cosI,
-                                              const float randx,
-                                              const float randy)
-{
-  if (cosI > 0.9999f || fabsf(cosI) < 1e-6f) {
-    const float r = sqrtf(randx / max(1.0f - randx, 1e-7f));
-    const float phi = M_2PI_F * randy;
-    return make_float2(r * cosf(phi), r * sinf(phi));
-  }
-
-  const float sinI = safe_sqrtf(1.0f - cosI * cosI);
-  const float tanI = sinI / cosI;
-  const float projA = 0.5f * (cosI + 1.0f);
-  if (projA < 0.0001f)
-    return make_float2(0.0f, 0.0f);
-  const float A = 2.0f * randx * projA / cosI - 1.0f;
-  float tmp = A * A - 1.0f;
-  if (fabsf(tmp) < 1e-7f)
-    return make_float2(0.0f, 0.0f);
-  tmp = 1.0f / tmp;
-  const float D = safe_sqrtf(tanI * tanI * tmp * tmp - (A * A - tanI * tanI) * tmp);
-
-  const float slopeX2 = tanI * tmp + D;
-  const float slopeX = (A < 0.0f || slopeX2 > 1.0f / tanI) ? (tanI * tmp - D) : slopeX2;
-
-  float U2;
-  if (randy >= 0.5f)
-    U2 = 2.0f * (randy - 0.5f);
-  else
-    U2 = 2.0f * (0.5f - randy);
-  const float z = (U2 * (U2 * (U2 * 0.27385f - 0.73369f) + 0.46341f)) /
-                  (U2 * (U2 * (U2 * 0.093073f + 0.309420f) - 1.0f) + 0.597999f);
-  const float slopeY = z * sqrtf(1.0f + slopeX * slopeX);
-
-  if (randy >= 0.5f)
-    return make_float2(slopeX, slopeY);
-  else
-    return make_float2(slopeX, -slopeY);
-}
-
-/* Visible normal sampling for the GGX distribution
- * (based on page 7 of the supplemental implementation). */
-ccl_device_forceinline float3 mf_sample_vndf(const float3 wi,
-                                             const float2 alpha,
-

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list