From a0cc68a2200f5861ca9c3c1d42149c8c9c5899fd Mon Sep 17 00:00:00 2001 From: Alaska Date: Sat, 27 Apr 2024 02:47:59 +1200 Subject: [PATCH] Rebase against main --- .../kernel/osl/shaders/node_glass_bsdf.osl | 6 ++++-- .../kernel/osl/shaders/node_glossy_bsdf.osl | 9 +++++--- .../kernel/osl/shaders/node_sheen_bsdf.osl | 5 +++-- .../shaders/node_subsurface_scattering.osl | 21 ++++++++++--------- intern/cycles/kernel/svm/closure.h | 14 +++++++------ .../material/gpu_shader_material_glossy.glsl | 1 + ...shader_material_subsurface_scattering.glsl | 4 +--- 7 files changed, 34 insertions(+), 26 deletions(-) diff --git a/intern/cycles/kernel/osl/shaders/node_glass_bsdf.osl b/intern/cycles/kernel/osl/shaders/node_glass_bsdf.osl index 27d8ad2868d..d9c619e59fa 100644 --- a/intern/cycles/kernel/osl/shaders/node_glass_bsdf.osl +++ b/intern/cycles/kernel/osl/shaders/node_glass_bsdf.osl @@ -12,12 +12,14 @@ shader node_glass_bsdf(color Color = 0.8, normal Normal = N, output closure color BSDF = 0) { - float r2 = Roughness * Roughness; + color base_color = max(Color, color(0.0)); + float r2 = clamp(Roughness, 0.0, 1.0); + r2 = r2 * r2; float eta = max(IOR, 1e-5); eta = backfacing() ? 1.0 / eta : eta; color F0 = F0_from_ior(eta); color F90 = color(1.0); BSDF = generalized_schlick_bsdf( - Normal, vector(0.0), Color, Color, r2, r2, F0, F90, -eta, distribution); + Normal, vector(0.0), base_color, base_color, r2, r2, F0, F90, -eta, distribution); } diff --git a/intern/cycles/kernel/osl/shaders/node_glossy_bsdf.osl b/intern/cycles/kernel/osl/shaders/node_glossy_bsdf.osl index 29c1d50488f..94dbd6323d4 100644 --- a/intern/cycles/kernel/osl/shaders/node_glossy_bsdf.osl +++ b/intern/cycles/kernel/osl/shaders/node_glossy_bsdf.osl @@ -15,7 +15,9 @@ shader node_glossy_bsdf(color Color = 0.8, output closure color BSDF = 0) { /* compute roughness */ - float roughness = Roughness * Roughness; + color base_color = max(Color, color(0.0)); + float roughness = clamp(Roughness, 0.0, 1.0); + roughness = roughness * roughness; float roughness_u, roughness_v; float aniso = clamp(Anisotropy, -0.99, 0.99); @@ -41,7 +43,8 @@ shader node_glossy_bsdf(color Color = 0.8, } if (distribution == "Multiscatter GGX") - BSDF = Color * microfacet_multi_ggx_aniso(Normal, T, roughness_u, roughness_v, Color); + BSDF = base_color * + microfacet_multi_ggx_aniso(Normal, T, roughness_u, roughness_v, base_color); else - BSDF = Color * microfacet(distribution, Normal, T, roughness_u, roughness_v, 0.0, 0); + BSDF = base_color * microfacet(distribution, Normal, T, roughness_u, roughness_v, 0.0, 0); } diff --git a/intern/cycles/kernel/osl/shaders/node_sheen_bsdf.osl b/intern/cycles/kernel/osl/shaders/node_sheen_bsdf.osl index b134c918fd3..7902d95b1ee 100644 --- a/intern/cycles/kernel/osl/shaders/node_sheen_bsdf.osl +++ b/intern/cycles/kernel/osl/shaders/node_sheen_bsdf.osl @@ -11,10 +11,11 @@ shader node_sheen_bsdf(color Color = 0.8, normal Normal = N, output closure color BSDF = 0) { + color base_color = max(Color, color(0.0)); float roughness = clamp(Roughness, 0.0, 1.0); if (distribution == "ashikhmin") - BSDF = Color * ashikhmin_velvet(Normal, roughness); + BSDF = base_color * ashikhmin_velvet(Normal, roughness); else if (distribution == "microfiber") - BSDF = Color * sheen(Normal, roughness); + BSDF = base_color * sheen(Normal, roughness); } diff --git a/intern/cycles/kernel/osl/shaders/node_subsurface_scattering.osl b/intern/cycles/kernel/osl/shaders/node_subsurface_scattering.osl index a762ca4771a..f8d82eefb21 100644 --- a/intern/cycles/kernel/osl/shaders/node_subsurface_scattering.osl +++ b/intern/cycles/kernel/osl/shaders/node_subsurface_scattering.osl @@ -13,14 +13,15 @@ shader node_subsurface_scattering(color Color = 0.8, normal Normal = N, output closure color BSSRDF = 0) { - BSSRDF = Color * bssrdf(method, - Normal, - Scale * Radius, - Color, - "ior", - IOR, - "anisotropy", - Anisotropy, - "roughness", - 1.0); + color base_color = max(Color, color(0.0)); + BSSRDF = base_color * bssrdf(method, + Normal, + Scale * Radius, + base_color, + "ior", + IOR, + "anisotropy", + Anisotropy, + "roughness", + 1.0); } diff --git a/intern/cycles/kernel/svm/closure.h b/intern/cycles/kernel/svm/closure.h index ad158e2f1d4..e707a40cd8c 100644 --- a/intern/cycles/kernel/svm/closure.h +++ b/intern/cycles/kernel/svm/closure.h @@ -470,7 +470,7 @@ ccl_device break; } - float roughness = sqr(param1); + float roughness = sqr(saturatef(param1)); bsdf->N = maybe_ensure_valid_specular_reflection(sd, N); bsdf->ior = 1.0f; @@ -513,7 +513,8 @@ ccl_device sd->flag |= bsdf_microfacet_ggx_setup(bsdf); if (type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID) { kernel_assert(stack_valid(data_node.z)); - const Spectrum color = rgb_to_spectrum(stack_load_float3(stack, data_node.z)); + const Spectrum color = max(rgb_to_spectrum(stack_load_float3(stack, data_node.z)), + zero_spectrum()); bsdf_microfacet_setup_fresnel_constant(kg, bsdf, sd, color); } } @@ -580,12 +581,12 @@ ccl_device float ior = fmaxf(param2, 1e-5f); bsdf->ior = (sd->flag & SD_BACKFACING) ? 1.0f / ior : ior; - bsdf->alpha_x = bsdf->alpha_y = sqr(param1); + bsdf->alpha_x = bsdf->alpha_y = sqr(saturatef(param1)); fresnel->f0 = make_float3(F0_from_ior(ior)); fresnel->f90 = one_spectrum(); fresnel->exponent = -ior; - const float3 color = stack_load_float3(stack, data_node.y); + const float3 color = max(stack_load_float3(stack, data_node.y), zero_float3()); fresnel->reflection_tint = reflective_caustics ? rgb_to_spectrum(color) : zero_spectrum(); fresnel->transmission_tint = refractive_caustics ? rgb_to_spectrum(color) : zero_spectrum(); @@ -622,7 +623,7 @@ ccl_device if (bsdf) { bsdf->N = N; - bsdf->roughness = param1; + bsdf->roughness = saturatef(param1); sd->flag |= bsdf_sheen_setup(kg, sd, bsdf); } @@ -866,7 +867,8 @@ ccl_device ccl_private Bssrdf *bssrdf = bssrdf_alloc(sd, weight); if (bssrdf) { - bssrdf->radius = rgb_to_spectrum(stack_load_float3(stack, data_node.y) * param1); + bssrdf->radius = max(rgb_to_spectrum(stack_load_float3(stack, data_node.y) * param1), + zero_spectrum()); bssrdf->albedo = closure_weight; bssrdf->N = maybe_ensure_valid_specular_reflection(sd, N); bssrdf->ior = param2; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl index 7648aa645a4..f906a55df1f 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl @@ -15,6 +15,7 @@ void node_bsdf_glossy(vec4 color, color = max(color, vec4(0.0)); roughness = saturate(roughness); N = safe_normalize(N); + /* anisotropy = clamp(anisotropy, -0.99, 0.99) */ vec3 V = coordinate_incoming(g_data.P); float NV = dot(N, V); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl index c182631ed0b..db75151419b 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl @@ -13,8 +13,6 @@ void node_subsurface_scattering(vec4 color, out Closure result) { color = max(color, vec4(0.0)); - scale = max(scale, 0.0); - radius = max(radius, vec3(0)); ior = max(ior, 1e-5); N = safe_normalize(N); @@ -22,7 +20,7 @@ void node_subsurface_scattering(vec4 color, sss_data.weight = weight; sss_data.color = color.rgb; sss_data.N = N; - sss_data.sss_radius = radius * scale; + sss_data.sss_radius = max(radius * scale, vec3(0.0)); #ifdef GPU_SHADER_EEVEE_LEGACY_DEFINES if (do_sss == 0.0) { -- 2.30.2