Commit: 5f7192018eb81af1cf406999d8d7871b4f47cd31
Author: Clément Foucault
Date:   Mon Oct 2 19:44:44 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB5f7192018eb81af1cf406999d8d7871b4f47cd31

Eevee : SSR : Make sure to not apply Specular Occlusion to SSR.

This makes the metals shine more.

Previous behaviour was not correct.

===================================================================

M       source/blender/draw/engines/eevee/eevee_effects.c
M       source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
M       source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
M       source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl

===================================================================

diff --git a/source/blender/draw/engines/eevee/eevee_effects.c 
b/source/blender/draw/engines/eevee/eevee_effects.c
index 4eead8d98f1..aa843e6e4c1 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -201,6 +201,7 @@ static struct GPUShader *eevee_effects_ssr_shader_get(int 
options)
                BLI_dynstr_append(ds_frag, datatoc_bsdf_sampling_lib_glsl);
                BLI_dynstr_append(ds_frag, datatoc_octahedron_lib_glsl);
                BLI_dynstr_append(ds_frag, datatoc_lightprobe_lib_glsl);
+               BLI_dynstr_append(ds_frag, datatoc_ambient_occlusion_lib_glsl);
                BLI_dynstr_append(ds_frag, datatoc_raytrace_lib_glsl);
                BLI_dynstr_append(ds_frag, datatoc_effect_ssr_frag_glsl);
                char *ssr_shader_str = BLI_dynstr_get_cstring(ds_frag);
@@ -997,6 +998,17 @@ void EEVEE_effects_cache_init(EEVEE_SceneLayerData 
*sldata, EEVEE_Data *vedata)
                if (effects->ssr_ray_count > 3) {
                        DRW_shgroup_uniform_buffer(grp, "hitBuffer3", 
&stl->g_data->ssr_hit_output[3]);
                }
+
+               DRW_shgroup_uniform_vec4(grp, "aoParameters[0]", 
&effects->ao_dist, 2);
+               if (effects->use_ao) {
+                       DRW_shgroup_uniform_buffer(grp, "horizonBuffer", 
&vedata->txl->gtao_horizons);
+                       DRW_shgroup_uniform_ivec2(grp, "aoHorizonTexSize", (int 
*)vedata->stl->effects->ao_texsize, 1);
+               }
+               else {
+                       /* Use shadow_pool as fallback to avoid sampling 
problem on certain platform, see: T52593 */
+                       DRW_shgroup_uniform_buffer(grp, "horizonBuffer", 
&sldata->shadow_pool);
+               }
+
                DRW_shgroup_call_add(grp, quad, NULL);
        }
 
diff --git 
a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl 
b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
index 2202ee605fc..476de25fb54 100644
--- a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
@@ -327,7 +327,13 @@ float occlusion_compute(vec3 N, vec3 vpos, float 
user_occlusion, vec2 randuv, ou
                float visibility;
                vec3 vnor = mat3(ViewMatrix) * N;
 
-#if defined(MESH_SHADER) && !defined(USE_ALPHA_HASH) && 
!defined(USE_ALPHA_CLIP) && !defined(SHADOW_SHADER) && !defined(USE_MULTIPLY) 
&& !defined(USE_ALPHA_BLEND)
+#if (defined(MESH_SHADER) && \
+        !defined(USE_ALPHA_HASH) && \
+        !defined(USE_ALPHA_CLIP) && \
+        !defined(SHADOW_SHADER) && \
+        !defined(USE_MULTIPLY) && \
+        !defined(USE_ALPHA_BLEND)) \
+       || defined(STEP_RESOLVE)
                gtao_deferred(vnor, vpos, gl_FragCoord.z, visibility, 
bent_normal);
 #else
                gtao(vnor, vpos, randuv, visibility, bent_normal);
diff --git a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl 
b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
index 520dc7b9624..7d142e50013 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
@@ -186,11 +186,16 @@ uniform mat4 PastViewProjectionMatrix;
 
 out vec4 fragColor;
 
-void fallback_cubemap(vec3 N, vec3 V, vec3 W, float roughness, float 
roughnessSquared, inout vec4 spec_accum)
+void fallback_cubemap(vec3 N, vec3 V, vec3 W, vec3 viewPosition, float 
roughness, float roughnessSquared, inout vec4 spec_accum)
 {
        /* Specular probes */
        vec3 spec_dir = get_specular_reflection_dominant_dir(N, V, 
roughnessSquared);
 
+       vec4 rand = texture(utilTex, vec3(gl_FragCoord.xy / LUT_SIZE, 2.0));
+       vec3 bent_normal;
+       float final_ao = occlusion_compute(N, viewPosition, 1.0, rand.rg, 
bent_normal);
+       final_ao = specular_occlusion(dot(N, V), final_ao, roughness);
+
        /* Starts at 1 because 0 is world probe */
        for (int i = 1; i < MAX_PROBE && i < probe_count && spec_accum.a < 
0.999; ++i) {
                CubeData cd = probes_data[i];
@@ -198,14 +203,14 @@ void fallback_cubemap(vec3 N, vec3 V, vec3 W, float 
roughness, float roughnessSq
                float fade = probe_attenuation_cube(cd, W);
 
                if (fade > 0.0) {
-                       vec3 spec = probe_evaluate_cube(float(i), cd, W, 
spec_dir, roughness);
+                       vec3 spec = final_ao * probe_evaluate_cube(float(i), 
cd, W, spec_dir, roughness);
                        accumulate_light(spec, fade, spec_accum);
                }
        }
 
        /* World Specular */
        if (spec_accum.a < 0.999) {
-               vec3 spec = probe_evaluate_world_spec(spec_dir, roughness);
+               vec3 spec = final_ao * probe_evaluate_world_spec(spec_dir, 
roughness);
                accumulate_light(spec, 1.0, spec_accum);
        }
 }
@@ -436,7 +441,7 @@ void main()
 
        /* If SSR contribution is not 1.0, blend with cubemaps */
        if (spec_accum.a < 1.0) {
-               fallback_cubemap(N, V, worldPosition, roughness, 
roughnessSquared, spec_accum);
+               fallback_cubemap(N, V, worldPosition, viewPosition, roughness, 
roughnessSquared, spec_accum);
        }
 
        fragColor = vec4(spec_accum.rgb * speccol_roughness.rgb, 1.0);
diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl 
b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
index 16b3283b624..e23effb854c 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
@@ -136,7 +136,10 @@ vec3 eevee_surface_lit(vec3 N, vec3 albedo, vec3 f0, float 
roughness, float ao,
        vec2 uv = lut_coords(dot(N, V), roughness);
        vec2 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rg;
 
-       ssr_spec = F_ibl(f0, brdf_lut) * specular_occlusion(dot(N, V), 
final_ao, roughness);
+       ssr_spec = F_ibl(f0, brdf_lut);
+       if (!(ssrToggle && ssr_id == outputSsrId)) {
+               ssr_spec *= specular_occlusion(dot(N, V), final_ao, roughness);
+       }
        out_light += spec_accum.rgb * ssr_spec * float(specToggle);
 
        /* ---------------- DIFFUSE ENVIRONMENT LIGHTING ----------------- */
@@ -308,7 +311,10 @@ vec3 eevee_surface_clearcoat_lit(
        vec2 uv = lut_coords(dot(N, V), roughness);
        vec2 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rg;
 
-       ssr_spec = F_ibl(f0, brdf_lut) * specular_occlusion(dot(N, V), 
final_ao, roughness);
+       ssr_spec = F_ibl(f0, brdf_lut);
+       if (!(ssrToggle && ssr_id == outputSsrId)) {
+               ssr_spec *= specular_occlusion(dot(N, V), final_ao, roughness);
+       }
        out_light += spec_accum.rgb * ssr_spec * float(specToggle);
 
        uv = lut_coords(dot(C_N, V), C_roughness);
@@ -533,15 +539,18 @@ vec3 eevee_surface_glossy_lit(vec3 N, vec3 f0, float 
roughness, float ao, int ss
 
        vec4 rand = texture(utilTex, vec3(gl_FragCoord.xy / LUT_SIZE, 2.0));
 
-       /* Ambient Occlusion */
-       vec3 bent_normal;
-       float final_ao = occlusion_compute(N, viewPosition, ao, rand.rg, 
bent_normal);
-
        /* Get Brdf intensity */
        vec2 uv = lut_coords(dot(N, V), roughness);
        vec2 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rg;
 
-       ssr_spec = F_ibl(f0, brdf_lut) * specular_occlusion(dot(N, V), 
final_ao, roughness);
+       ssr_spec = F_ibl(f0, brdf_lut);
+       if (!(ssrToggle && ssr_id == outputSsrId)) {
+               /* Ambient Occlusion */
+               vec3 bent_normal;
+               float final_ao = occlusion_compute(N, viewPosition, ao, 
rand.rg, bent_normal);
+
+               ssr_spec *= specular_occlusion(dot(N, V), final_ao, roughness);
+       }
        out_light += spec_accum.rgb * ssr_spec * float(specToggle);
 
        return out_light;
@@ -785,7 +794,10 @@ vec3 eevee_surface_glass(vec3 N, vec3 transmission_col, 
float roughness, float i
        /* Apply fresnel on lamps. */
        out_light *= vec3(fresnel);
 
-       ssr_spec = vec3(fresnel) * F_ibl(vec3(1.0), brdf_lut) * 
specular_occlusion(NV, final_ao, roughness);
+       ssr_spec = vec3(fresnel) * F_ibl(vec3(1.0), brdf_lut);
+       if (!(ssrToggle && ssr_id == outputSsrId)) {
+               ssr_spec *= specular_occlusion(dot(N, V), final_ao, roughness);
+       }
        out_light += spec_accum.rgb * ssr_spec;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to