From a65a9f8249978223736206f93944ea2009ffb613 Mon Sep 17 00:00:00 2001 From: Miguel Pozo Date: Thu, 16 Nov 2023 21:21:45 +0100 Subject: [PATCH] Sanitize closure inputs --- .../material/gpu_shader_material_eevee_specular.glsl | 8 ++++++++ .../material/gpu_shader_material_emission.glsl | 3 +++ .../shaders/material/gpu_shader_material_glass.glsl | 4 ++++ .../shaders/material/gpu_shader_material_glossy.glsl | 3 +++ .../shaders/material/gpu_shader_material_hair.glsl | 2 ++ .../material/gpu_shader_material_refraction.glsl | 3 +++ .../shaders/material/gpu_shader_material_sheen.glsl | 2 ++ .../gpu_shader_material_subsurface_scattering.glsl | 4 ++++ .../shaders/material/gpu_shader_material_toon.glsl | 1 + .../material/gpu_shader_material_translucent.glsl | 1 + .../material/gpu_shader_material_transparent.glsl | 2 ++ .../gpu_shader_material_volume_absorption.glsl | 3 +++ .../gpu_shader_material_volume_principled.glsl | 11 +++++++++-- .../material/gpu_shader_material_volume_scatter.glsl | 3 +++ 14 files changed, 48 insertions(+), 2 deletions(-) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl index fc131847db7..bfe19dac0b0 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl @@ -16,8 +16,16 @@ void node_eevee_specular(vec4 diffuse, const float use_clearcoat, out Closure result) { + diffuse = max(diffuse, vec4(0)); + specular = max(specular, vec4(0)); + roughness = saturate(roughness); + emissive = max(emissive, vec4(0)); N = safe_normalize(N); + clearcoat = saturate(clearcoat); + clearcoat_roughness = saturate(clearcoat_roughness); CN = safe_normalize(CN); + occlusion = saturate(occlusion); + vec3 V = coordinate_incoming(g_data.P); ClosureEmission emission_data; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl index 453b1842ef3..4ebab287f25 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl @@ -4,6 +4,9 @@ void node_emission(vec4 color, float strength, float weight, out Closure result) { + color = max(color, vec4(0)); + strength = max(strength, 0); + ClosureEmission emission_data; emission_data.weight = weight; emission_data.emission = color.rgb * strength; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl index fe08957caf6..4dc2a146f80 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl @@ -10,7 +10,11 @@ void node_bsdf_glass(vec4 color, const float do_multiscatter, out Closure result) { + color = max(color, vec4(0)); + roughness = saturate(roughness); + ior = max(ior, 1e-5); N = safe_normalize(N); + vec3 V = coordinate_incoming(g_data.P); float NV = dot(N, V); 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 100731b0b83..379f9e88aae 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl @@ -12,7 +12,10 @@ void node_bsdf_glossy(vec4 color, const float do_multiscatter, out Closure result) { + color = max(color, vec4(0)); + roughness = saturate(roughness); N = safe_normalize(N); + vec3 V = coordinate_incoming(g_data.P); float NV = dot(N, V); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_hair.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_hair.glsl index 18094588ead..d25583779b8 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_hair.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_hair.glsl @@ -10,6 +10,8 @@ void node_bsdf_hair(vec4 color, float weight, out Closure result) { + color = max(color, vec4(0)); + #if 0 /* NOTE(fclem): This is the way it should be. But we don't have proper implementation of the hair * closure yet. For now fall back to a simpler diffuse surface so that we have at least a color diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl index 938800d58f3..162b3119279 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl @@ -5,6 +5,9 @@ void node_bsdf_refraction( vec4 color, float roughness, float ior, vec3 N, float weight, out Closure result) { + color = max(color, vec4(0)); + roughness = saturate(roughness); + ior = max(ior, 1e-5); N = safe_normalize(N); ClosureRefraction refraction_data; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_sheen.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_sheen.glsl index 91d9630e8d6..20898252173 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_sheen.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_sheen.glsl @@ -4,6 +4,8 @@ void node_bsdf_sheen(vec4 color, float roughness, vec3 N, float weight, out Closure result) { + color = max(color, vec4(0)); + roughness = saturate(roughness); N = safe_normalize(N); /* Fallback to diffuse. */ 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 280dca5921c..166f442c368 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 @@ -12,6 +12,10 @@ void node_subsurface_scattering(vec4 color, float do_sss, out Closure result) { + color = max(color, vec4(0)); + scale = max(scale, 0); + radius = max(radius, vec3(0)); + ior = max(ior, 1e-5); N = safe_normalize(N); ClosureDiffuse diffuse_data; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_toon.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_toon.glsl index 7d559cdb43e..0e4ac7d4c9f 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_toon.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_toon.glsl @@ -5,6 +5,7 @@ void node_bsdf_toon( vec4 color, float size, float tsmooth, vec3 N, float weight, out Closure result) { + color = max(color, vec4(0)); N = safe_normalize(N); /* Fallback to diffuse. */ diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl index 9d5128df924..037fe2678f0 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl @@ -4,6 +4,7 @@ void node_bsdf_translucent(vec4 color, vec3 N, float weight, out Closure result) { + color = max(color, vec4(0)); N = safe_normalize(N); ClosureTranslucent translucent_data; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_transparent.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_transparent.glsl index cad274d0ad2..aea1c6a4139 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_transparent.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_transparent.glsl @@ -4,6 +4,8 @@ void node_bsdf_transparent(vec4 color, float weight, out Closure result) { + color = max(color, vec4(0)); + ClosureTransparency transparency_data; transparency_data.weight = weight; transparency_data.transmittance = color.rgb; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_volume_absorption.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_volume_absorption.glsl index e3f35c5f14b..d7259f1a78d 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_volume_absorption.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_volume_absorption.glsl @@ -4,6 +4,9 @@ void node_volume_absorption(vec4 color, float density, float weight, out Closure result) { + color = max(color, vec4(0)); + density = max(density, 0); + ClosureVolumeAbsorption volume_absorption_data; volume_absorption_data.weight = weight; volume_absorption_data.absorption = (1.0 - color.rgb) * density; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_volume_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_volume_principled.glsl index 288c3434b09..db9fa23cd21 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_volume_principled.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_volume_principled.glsl @@ -21,13 +21,20 @@ void node_volume_principled(vec4 color, float layer, out Closure result) { + color = max(color, vec4(0)); + density = max(density, 0); + absorption_color = max(absorption_color, vec4(0)); + emission_strength = max(emission_strength, 0); + emission_color = max(emission_color, vec4(0)); + blackbody_intensity = max(blackbody_intensity, 0); + blackbody_tint = max(blackbody_tint, vec4(0)); + temperature = max(temperature, 0); + vec3 absorption_coeff = vec3(0.0); vec3 scatter_coeff = vec3(0.0); vec3 emission_coeff = vec3(0.0); /* Compute density. */ - density = max(density, 0.0); - if (density > 1e-5) { density = max(density * density_attribute.x, 0.0); } diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_volume_scatter.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_volume_scatter.glsl index 21f46a307af..afc4d35a15c 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_volume_scatter.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_volume_scatter.glsl @@ -5,6 +5,9 @@ void node_volume_scatter( vec4 color, float density, float anisotropy, float weight, out Closure result) { + color = max(color, vec4(0)); + density = max(density, 0); + ClosureVolumeScatter volume_scatter_data; volume_scatter_data.weight = weight; volume_scatter_data.scattering = color.rgb * density; -- 2.30.2