[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, ¶ms);
+ sd, sizeof(MicrofacetBsdf), 0.25f * clearcoat * weight, ¶ms);
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