[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