From 03218b88ed5e2826ffb49c23eb524d23e43ffd22 Mon Sep 17 00:00:00 2001 From: Alaska Date: Mon, 28 Aug 2023 01:45:01 +1200 Subject: [PATCH] Cycles: Speed up principled BSDF when IOR = 1.0 Skip the specular layer of the principled BSDF when IOR=1.0 since it has visual impact on the material --- .../osl/shaders/node_principled_bsdf.osl | 25 ++++++++++--------- intern/cycles/kernel/svm/closure.h | 2 +- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/intern/cycles/kernel/osl/shaders/node_principled_bsdf.osl b/intern/cycles/kernel/osl/shaders/node_principled_bsdf.osl index ae8e485d6fd..dead4d0b435 100644 --- a/intern/cycles/kernel/osl/shaders/node_principled_bsdf.osl +++ b/intern/cycles/kernel/osl/shaders/node_principled_bsdf.osl @@ -61,20 +61,21 @@ shader node_principled_bsdf(string distribution = "multi_ggx", else { BSDF = diffuse_color * diffuse(Normal); } + if (IOR != 1.0) { + color f0 = color(F0_from_ior(IOR)); + color f90 = color(1.0); - color f0 = color(F0_from_ior(IOR)); - color f90 = color(1.0); + /* Apply specular tint */ + float m_cdlum = luminance(BaseColor); + color m_ctint = m_cdlum > 0.0 ? BaseColor / m_cdlum : color(1.0); + color specTint = mix(color(1.0), m_ctint, SpecularTint); + f0 *= (specTint * 2.0 * Specular); - /* Apply specular tint */ - float m_cdlum = luminance(BaseColor); - color m_ctint = m_cdlum > 0.0 ? BaseColor / m_cdlum : color(1.0); - color specTint = mix(color(1.0), m_ctint, SpecularTint); - f0 *= (specTint * 2.0 * Specular); - - BSDF = layer( - generalized_schlick_bsdf( - Normal, T, color(1.0), color(0.0), alpha_x, alpha_y, f0, f90, -IOR, distribution), - BSDF); + BSDF = layer( + generalized_schlick_bsdf( + Normal, T, color(1.0), color(0.0), alpha_x, alpha_y, f0, f90, -IOR, distribution), + BSDF); + } } closure color TransmissionBSDF = 0; diff --git a/intern/cycles/kernel/svm/closure.h b/intern/cycles/kernel/svm/closure.h index 6ba19575ea8..e23c34d2e46 100644 --- a/intern/cycles/kernel/svm/closure.h +++ b/intern/cycles/kernel/svm/closure.h @@ -263,7 +263,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg, } /* Specular component */ - if (reflective_caustics) { + if (reflective_caustics && eta != 1.0f) { ccl_private MicrofacetBsdf *bsdf = (ccl_private MicrofacetBsdf *)bsdf_alloc( sd, sizeof(MicrofacetBsdf), weight); ccl_private FresnelGeneralizedSchlick *fresnel = -- 2.30.2