From d8aaf25c23fa10ee121dc4fdd1cafe544bcca355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Thu, 22 Aug 2019 16:04:25 +0200 Subject: Eevee: Shadow map refactor Reviewed By: brecht Differential Revision: http://developer.blender.org/D5659 --- source/blender/gpu/intern/gpu_framebuffer.c | 4 +- .../material/gpu_shader_material_diffuse.glsl | 2 +- .../gpu_shader_material_eevee_specular.glsl | 1 + .../material/gpu_shader_material_glass.glsl | 13 ++++- .../material/gpu_shader_material_glossy.glsl | 3 +- .../material/gpu_shader_material_principled.glsl | 67 ++++++++-------------- .../material/gpu_shader_material_refraction.glsl | 2 +- .../gpu_shader_material_shader_to_rgba.glsl | 6 +- .../gpu_shader_material_subsurface_scattering.glsl | 23 ++------ .../material/gpu_shader_material_translucent.glsl | 6 +- 10 files changed, 52 insertions(+), 75 deletions(-) (limited to 'source/blender/gpu') diff --git a/source/blender/gpu/intern/gpu_framebuffer.c b/source/blender/gpu/intern/gpu_framebuffer.c index 7d096058e4c..2930b6d13cc 100644 --- a/source/blender/gpu/intern/gpu_framebuffer.c +++ b/source/blender/gpu/intern/gpu_framebuffer.c @@ -46,8 +46,9 @@ typedef enum { GPU_FB_COLOR_ATTACHMENT2, GPU_FB_COLOR_ATTACHMENT3, GPU_FB_COLOR_ATTACHMENT4, + GPU_FB_COLOR_ATTACHMENT5, /* Number of maximum output slots. - * We support 5 outputs for now (usually we wouldn't need more to preserve fill rate). */ + * We support 6 outputs for now (usually we wouldn't need more to preserve fill rate). */ /* Keep in mind that GL max is GL_MAX_DRAW_BUFFERS and is at least 8, corresponding to * the maximum number of COLOR attachments specified by glDrawBuffers. */ GPU_FB_MAX_ATTACHEMENT, @@ -82,6 +83,7 @@ static GLenum convert_attachment_type_to_gl(GPUAttachmentType type) [GPU_FB_COLOR_ATTACHMENT2] = GL_COLOR_ATTACHMENT2, [GPU_FB_COLOR_ATTACHMENT3] = GL_COLOR_ATTACHMENT3, [GPU_FB_COLOR_ATTACHMENT4] = GL_COLOR_ATTACHMENT4, + [GPU_FB_COLOR_ATTACHMENT5] = GL_COLOR_ATTACHMENT5, }; return table[type]; } diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl index 14acf9925a2..e029905a908 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl @@ -3,7 +3,7 @@ void node_bsdf_diffuse(vec4 color, float roughness, vec3 N, out Closure result) { N = normalize(N); result = CLOSURE_DEFAULT; - eevee_closure_diffuse(N, color.rgb, 1.0, result.radiance); + eevee_closure_diffuse(N, color.rgb, 1.0, true, result.radiance); closure_load_ssr_data(vec3(0.0), 0.0, N, viewCameraVec, -1, result); result.radiance *= color.rgb; } 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 e69a53b6596..34062cc8d02 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 @@ -25,6 +25,7 @@ void node_eevee_specular(vec4 diffuse, clearcoat * 0.25, clearcoat_roughness, occlusion, + true, out_diff, out_spec, ssr_spec); 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 8cc8ba2dd15..5038cb3892f 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl @@ -6,8 +6,17 @@ void node_bsdf_glass( vec3 out_spec, out_refr, ssr_spec; vec3 refr_color = (refractionDepth > 0.0) ? color.rgb * color.rgb : color.rgb; /* Simulate 2 transmission event */ - eevee_closure_glass( - N, vec3(1.0), vec3(1.0), int(ssr_id), roughness, 1.0, ior, out_spec, out_refr, ssr_spec); + eevee_closure_glass(N, + vec3(1.0), + vec3(1.0), + int(ssr_id), + roughness, + 1.0, + ior, + true, + out_spec, + out_refr, + ssr_spec); out_refr *= refr_color; out_spec *= color.rgb; float fresnel = F_eta(ior, dot(N, cameraVec)); 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 4d582e63725..75cc2e770c5 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl @@ -3,7 +3,8 @@ void node_bsdf_glossy(vec4 color, float roughness, vec3 N, float ssr_id, out Clo { N = normalize(N); vec3 out_spec, ssr_spec; - eevee_closure_glossy(N, vec3(1.0), vec3(1.0), int(ssr_id), roughness, 1.0, out_spec, ssr_spec); + eevee_closure_glossy( + N, vec3(1.0), vec3(1.0), int(ssr_id), roughness, 1.0, true, out_spec, ssr_spec); vec3 vN = mat3(ViewMatrix) * N; result = CLOSURE_DEFAULT; result.radiance = out_spec * color.rgb; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl index c6b640c572d..140213a9ed9 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl @@ -66,7 +66,7 @@ void node_bsdf_principled(vec4 base_color, sheen *= dielectric; subsurface_color *= dielectric; - vec3 diffuse, f0, out_diff, out_spec, out_trans, out_refr, ssr_spec; + vec3 diffuse, f0, out_diff, out_spec, out_refr, ssr_spec; vec3 ctint = tint_from_color(base_color.rgb); convert_metallic_to_specular_tinted( base_color.rgb, ctint, metallic, specular, specular_tint, diffuse, f0); @@ -99,8 +99,8 @@ void node_bsdf_principled(vec4 base_color, 1.0, sss_scalef, ior, + true, out_diff, - out_trans, out_spec, out_refr, ssr_spec); @@ -116,24 +116,8 @@ void node_bsdf_principled(vec4 base_color, closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); - vec3 sss_radiance = (out_diff + out_trans) * alpha; -# ifndef USE_SSS - result.radiance += sss_radiance * mixed_ss_base_color * (1.0 - transmission); -# else -# ifdef USE_SSS_ALBEDO - vec3 sss_albedo = mixed_ss_base_color; -# else - sss_radiance *= mixed_ss_base_color; -# endif - sss_radiance *= (1.0 - transmission); - closure_load_sss_data(sss_scalef, - sss_radiance, -# ifdef USE_SSS_ALBEDO - sss_albedo, -# endif - int(sss_id), - result); -# endif /* USE_SSS */ + mixed_ss_base_color *= alpha * (1.0 - transmission); + closure_load_sss_data(sss_scalef, out_diff, mixed_ss_base_color, int(sss_id), result); result.radiance += emission.rgb; result.radiance *= alpha; @@ -181,7 +165,7 @@ void node_bsdf_principled_dielectric(vec4 base_color, vec3 out_sheen = sheen * principled_sheen(NV, ctint, sheen_tint); eevee_closure_default( - N, diffuse, f0, vec3(1.0), int(ssr_id), roughness, 1.0, out_diff, out_spec, ssr_spec); + N, diffuse, f0, vec3(1.0), int(ssr_id), roughness, 1.0, true, out_diff, out_spec, ssr_spec); result = CLOSURE_DEFAULT; result.radiance = out_spec + out_diff * (diffuse + out_sheen); @@ -224,7 +208,8 @@ void node_bsdf_principled_metallic(vec4 base_color, vec3 f90 = mix(vec3(1.0), base_color.rgb, (1.0 - specular) * metallic); - eevee_closure_glossy(N, base_color.rgb, f90, int(ssr_id), roughness, 1.0, out_spec, ssr_spec); + eevee_closure_glossy( + N, base_color.rgb, f90, int(ssr_id), roughness, 1.0, true, out_spec, ssr_spec); result = CLOSURE_DEFAULT; result.radiance = out_spec; @@ -276,6 +261,7 @@ void node_bsdf_principled_clearcoat(vec4 base_color, clearcoat * 0.25, clearcoat_roughness, 1.0, + true, out_spec, ssr_spec); @@ -318,7 +304,7 @@ void node_bsdf_principled_subsurface(vec4 base_color, metallic = saturate(metallic); N = normalize(N); - vec3 diffuse, f0, out_diff, out_spec, out_trans, ssr_spec; + vec3 diffuse, f0, out_diff, out_spec, ssr_spec; vec3 ctint = tint_from_color(base_color.rgb); convert_metallic_to_specular_tinted( base_color.rgb, ctint, metallic, specular, specular_tint, diffuse, f0); @@ -340,8 +326,8 @@ void node_bsdf_principled_subsurface(vec4 base_color, roughness, 1.0, sss_scalef, + true, out_diff, - out_trans, out_spec, ssr_spec); @@ -349,24 +335,8 @@ void node_bsdf_principled_subsurface(vec4 base_color, result.radiance = out_spec; closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); - vec3 sss_radiance = (out_diff + out_trans) * alpha; -# ifndef USE_SSS - result.radiance += sss_radiance * mixed_ss_base_color * (1.0 - transmission); -# else -# ifdef USE_SSS_ALBEDO - vec3 sss_albedo = mixed_ss_base_color; -# else - sss_radiance *= mixed_ss_base_color; -# endif - sss_radiance *= (1.0 - transmission); - closure_load_sss_data(sss_scalef, - sss_radiance, -# ifdef USE_SSS_ALBEDO - sss_albedo, -# endif - int(sss_id), - result); -# endif /* USE_SSS */ + mixed_ss_base_color *= alpha * (1.0 - transmission); + closure_load_sss_data(sss_scalef, out_diff, mixed_ss_base_color, int(sss_id), result); result.radiance += out_diff * out_sheen; result.radiance += emission.rgb; @@ -408,8 +378,17 @@ void node_bsdf_principled_glass(vec4 base_color, vec3 f0, out_spec, out_refr, ssr_spec; f0 = mix(vec3(1.0), base_color.rgb, specular_tint); - eevee_closure_glass( - N, vec3(1.0), vec3(1.0), int(ssr_id), roughness, 1.0, ior, out_spec, out_refr, ssr_spec); + eevee_closure_glass(N, + vec3(1.0), + vec3(1.0), + int(ssr_id), + roughness, + 1.0, + ior, + true, + out_spec, + out_refr, + ssr_spec); vec3 refr_color = base_color.rgb; refr_color *= (refractionDepth > 0.0) ? refr_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 04394a9420b..906964e1539 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl @@ -4,7 +4,7 @@ void node_bsdf_refraction(vec4 color, float roughness, float ior, vec3 N, out Cl N = normalize(N); vec3 out_refr; color.rgb *= (refractionDepth > 0.0) ? color.rgb : vec3(1.0); /* Simulate 2 absorption event. */ - eevee_closure_refraction(N, roughness, ior, out_refr); + eevee_closure_refraction(N, roughness, ior, true, out_refr); vec3 vN = mat3(ViewMatrix) * N; result = CLOSURE_DEFAULT; result.ssr_normal = normal_encode(vN, viewCameraVec); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl index 0a587c7e471..4f6df238789 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl @@ -15,11 +15,7 @@ void node_shader_to_rgba(Closure cl, out vec4 outcol, out float outalpha) outcol = vec4((spec_accum.rgb * cl.ssr_data.rgb) + cl.radiance, 1.0); # ifdef USE_SSS -# ifdef USE_SSS_ALBEDO - outcol.rgb += cl.sss_data.rgb * cl.sss_albedo; -# else - outcol.rgb += cl.sss_data.rgb; -# endif + outcol.rgb += cl.sss_irradiance.rgb * cl.sss_albedo; # endif } #endif /* VOLUMETRICS */ 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 fc81f3c4674..241228c0d4c 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 @@ -8,33 +8,18 @@ void node_subsurface_scattering(vec4 color, float sss_id, out Closure result) { -# if defined(USE_SSS) N = normalize(N); - vec3 out_diff, out_trans; + vec3 out_diff; vec3 vN = mat3(ViewMatrix) * N; result = CLOSURE_DEFAULT; closure_load_ssr_data(vec3(0.0), 0.0, N, viewCameraVec, -1, result); - eevee_closure_subsurface(N, color.rgb, 1.0, scale, out_diff, out_trans); + eevee_closure_subsurface(N, color.rgb, 1.0, scale, true, out_diff); - vec3 sss_radiance = out_diff + out_trans; -# ifdef USE_SSS_ALBEDO /* Not perfect for texture_blur not exactly equal to 0.0 or 1.0. */ vec3 sss_albedo = mix(color.rgb, vec3(1.0), texture_blur); - sss_radiance *= mix(vec3(1.0), color.rgb, texture_blur); -# else - sss_radiance *= color.rgb; -# endif - closure_load_sss_data(scale, - sss_radiance, -# ifdef USE_SSS_ALBEDO - sss_albedo, -# endif - int(sss_id), - result); -# else - node_bsdf_diffuse(color, 0.0, N, result); -# endif + out_diff *= mix(vec3(1.0), color.rgb, texture_blur); + closure_load_sss_data(scale, out_diff, sss_albedo, int(sss_id), result); } #else /* Stub subsurface scattering because it is not compatible with volumetrics. */ 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 ea41790e6aa..749b3a4c11f 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl @@ -1,7 +1,11 @@ #ifndef VOLUMETRICS void node_bsdf_translucent(vec4 color, vec3 N, out Closure result) { - node_bsdf_diffuse(color, 0.0, -N, result); + N = normalize(N); + result = CLOSURE_DEFAULT; + eevee_closure_diffuse(-N, color.rgb, 1.0, false, result.radiance); + closure_load_ssr_data(vec3(0.0), 0.0, N, viewCameraVec, -1, result); + result.radiance *= color.rgb; } #else /* Stub translucent because it is not compatible with volumetrics. */ -- cgit v1.2.3