[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