[Bf-blender-cvs] [8dd41674b5f] principled-v2: Replace clearcoat in v2 with regular dielectric GGX closure instead of GTR1
Lukas Stockner
noreply at git.blender.org
Mon Jul 4 23:56:15 CEST 2022
Commit: 8dd41674b5fac47cfc3c2dbd0f89815fa01e11c5
Author: Lukas Stockner
Date: Mon Jul 4 23:31:48 2022 +0200
Branches: principled-v2
https://developer.blender.org/rB8dd41674b5fac47cfc3c2dbd0f89815fa01e11c5
Replace clearcoat in v2 with regular dielectric GGX closure instead of GTR1
===================================================================
M intern/cycles/kernel/closure/bsdf.h
M intern/cycles/kernel/closure/bsdf_microfacet.h
M intern/cycles/kernel/svm/closure_principled.h
M intern/cycles/kernel/svm/types.h
===================================================================
diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h
index e8fb95ab557..88196fc4192 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -234,6 +234,7 @@ 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,
@@ -485,6 +486,7 @@ ccl_device_inline
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_reflect(sc, sd->I, omega_in, pdf);
break;
@@ -567,6 +569,7 @@ ccl_device_inline
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_transmit(sc, sd->I, omega_in, pdf);
break;
@@ -634,6 +637,7 @@ 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 6b9309c0fa6..6168eab8f98 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -56,6 +56,10 @@ ccl_device_forceinline float3 reflection_color(ccl_private const MicrofacetBsdf
else if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
return interpolate_fresnel_color(L, H, bsdf->ior, make_float3(0.04f, 0.04f, 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_float3(f, f, f);
+ }
else if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_V2_ID) {
MicrofacetExtrav2 *extra = (MicrofacetExtrav2*) bsdf->extra;
float cosHL = dot(H, L);
@@ -220,6 +224,22 @@ ccl_device int bsdf_microfacet_ggx_clearcoat_setup(ccl_private MicrofacetBsdf *b
return SD_BSDF | SD_BSDF_HAS_EVAL;
}
+ccl_device int bsdf_microfacet_ggx_clearcoat_v2_setup(ccl_private MicrofacetBsdf *bsdf,
+ ccl_private const ShaderData *sd)
+{
+ bsdf->alpha_x = saturatef(bsdf->alpha_x);
+ bsdf->alpha_y = bsdf->alpha_x;
+
+ bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_V2_ID;
+
+ float Fss = dielectric_fresnel_Fss(bsdf->ior);
+ bsdf->weight *= microfacet_ggx_albedo_scaling_float(bsdf, sd, Fss);
+
+ bsdf_microfacet_fresnel_color(sd, bsdf);
+
+ return SD_BSDF | SD_BSDF_HAS_EVAL;
+}
+
ccl_device int bsdf_microfacet_ggx_refraction_setup(ccl_private MicrofacetBsdf *bsdf)
{
bsdf->extra = NULL;
diff --git a/intern/cycles/kernel/svm/closure_principled.h b/intern/cycles/kernel/svm/closure_principled.h
index 8074646386d..0d50f396e80 100644
--- a/intern/cycles/kernel/svm/closure_principled.h
+++ b/intern/cycles/kernel/svm/closure_principled.h
@@ -506,7 +506,7 @@ ccl_device_inline float principled_v2_clearcoat(KernelGlobals kg,
bsdf->alpha_x = bsdf->alpha_y = sqr(roughness);
/* setup bsdf */
- sd->flag |= bsdf_microfacet_ggx_clearcoat_setup(bsdf, sd);
+ sd->flag |= bsdf_microfacet_ggx_clearcoat_v2_setup(bsdf, sd);
return 0.04f * clearcoat; // TODO better approx
}
diff --git a/intern/cycles/kernel/svm/types.h b/intern/cycles/kernel/svm/types.h
index d87e4d35572..755f36f8ffd 100644
--- a/intern/cycles/kernel/svm/types.h
+++ b/intern/cycles/kernel/svm/types.h
@@ -523,6 +523,8 @@ typedef enum ClosureType {
CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_V2_ID,
/* GTR1 for Clearcoat (TODO: Rename, is 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