Commit: 5f569378d2d8c3a9f923afb5b94e68862926922d Author: Clément Foucault Date: Tue Jan 16 14:03:31 2018 +0100 Branches: blender2.8 https://developer.blender.org/rB5f569378d2d8c3a9f923afb5b94e68862926922d
Eevee: SSR: Derive the brdf bias from the trace quality. Also change the range of the trace quality so that the trace actually covers the screen most of the time. =================================================================== M source/blender/draw/engines/eevee/eevee_private.h M source/blender/draw/engines/eevee/eevee_screen_raytrace.c M source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl =================================================================== diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index e0468687c6e..85878a6acc3 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -499,6 +499,7 @@ typedef struct EEVEE_EffectsInfo { bool ssr_use_normalization; int ssr_neighbor_ofs; int ssr_halfres_ofs[2]; + float ssr_brdf_bias; float ssr_firefly_fac; float ssr_border_fac; float ssr_max_roughness; diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c index d704668ea79..62f75800e14 100644 --- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c +++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c @@ -126,11 +126,12 @@ int EEVEE_screen_raytrace_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data * bool prev_trace_full = effects->reflection_trace_full; effects->reflection_trace_full = !BKE_collection_engine_property_value_get_bool(props, "ssr_halfres"); effects->ssr_use_normalization = BKE_collection_engine_property_value_get_bool(props, "ssr_normalize_weight"); - effects->ssr_quality = 1.0f - BKE_collection_engine_property_value_get_float(props, "ssr_quality"); + effects->ssr_quality = 1.0f - 0.95f * BKE_collection_engine_property_value_get_float(props, "ssr_quality"); effects->ssr_thickness = BKE_collection_engine_property_value_get_float(props, "ssr_thickness"); effects->ssr_border_fac = BKE_collection_engine_property_value_get_float(props, "ssr_border_fade"); effects->ssr_firefly_fac = BKE_collection_engine_property_value_get_float(props, "ssr_firefly_fac"); effects->ssr_max_roughness = BKE_collection_engine_property_value_get_float(props, "ssr_max_roughness"); + effects->ssr_brdf_bias = 0.1f + effects->ssr_quality * 0.6f; /* Range [0.1, 0.7]. */ if (effects->ssr_firefly_fac < 1e-8f) { effects->ssr_firefly_fac = FLT_MAX; @@ -221,6 +222,7 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v DRW_shgroup_uniform_vec4(grp, "ssrParameters", &effects->ssr_quality, 1); DRW_shgroup_uniform_int(grp, "planar_count", &sldata->probes->num_planar, 1); DRW_shgroup_uniform_float(grp, "maxRoughness", &effects->ssr_max_roughness, 1); + DRW_shgroup_uniform_float(grp, "brdfBias", &effects->ssr_brdf_bias, 1); DRW_shgroup_uniform_buffer(grp, "planarDepth", &vedata->txl->planar_depth); DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo); if (!effects->reflection_trace_full) { @@ -245,6 +247,7 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v DRW_shgroup_uniform_float(grp, "lodCubeMax", &sldata->probes->lod_cube_max, 1); DRW_shgroup_uniform_float(grp, "lodPlanarMax", &sldata->probes->lod_planar_max, 1); DRW_shgroup_uniform_float(grp, "fireflyFactor", &effects->ssr_firefly_fac, 1); + DRW_shgroup_uniform_float(grp, "brdfBias", &effects->ssr_brdf_bias, 1); DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo); DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo); DRW_shgroup_uniform_buffer(grp, "probeCubes", &sldata->probe_pool); 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 d615baba161..02911c5793c 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl @@ -7,9 +7,9 @@ uniform sampler2DArray utilTex; #endif /* UTIL_TEX */ -#define BRDF_BIAS 0.7 #define MAX_MIP 9.0 +uniform float brdfBias; uniform float fireflyFactor; uniform float maxRoughness; uniform ivec2 halfresOffset; @@ -42,13 +42,9 @@ layout(location = 1) out float pdfData; void do_planar_ssr(int index, vec3 V, vec3 N, vec3 T, vec3 B, vec3 planeNormal, vec3 viewPosition, float a2, vec4 rand) { - float pdf, NH; - - /* Importance sampling bias */ - rand.x = mix(rand.x, 0.0, BRDF_BIAS); - + float NH; vec3 H = sample_ggx(rand.xzw, a2, N, T, B, NH); /* Microfacet normal */ - pdf = pdf_ggx_reflect(NH, a2); + float pdf = pdf_ggx_reflect(NH, a2); vec3 R = reflect(-V, H); R = reflect(R, planeNormal); @@ -76,13 +72,9 @@ void do_planar_ssr(int index, vec3 V, vec3 N, vec3 T, vec3 B, vec3 planeNormal, void do_ssr(vec3 V, vec3 N, vec3 T, vec3 B, vec3 viewPosition, float a2, vec4 rand) { - float pdf, NH; - - /* Importance sampling bias */ - rand.x = mix(rand.x, 0.0, BRDF_BIAS); - + float NH; vec3 H = sample_ggx(rand.xzw, a2, N, T, B, NH); /* Microfacet normal */ - pdf = pdf_ggx_reflect(NH, a2); + float pdf = pdf_ggx_reflect(NH, a2); vec3 R = reflect(-V, H); pdfData = min(1024e32, pdf); /* Theoretical limit of 16bit float */ @@ -138,6 +130,8 @@ void main() if (roughness < 0.04) { rand.xzw *= 0.0; } + /* Importance sampling bias */ + rand.x = mix(rand.x, 0.0, brdfBias); vec3 worldPosition = transform_point(ViewMatrixInverse, viewPosition); vec3 wN = transform_direction(ViewMatrixInverse, N); @@ -363,7 +357,7 @@ vec4 get_ssr_samples( /* Compute cone footprint in screen space. */ vec4 cone_footprint = hit_dist * cone_tan; - cone_footprint = BRDF_BIAS * 0.5 * cone_footprint * max(ProjectionMatrix[0][0], ProjectionMatrix[1][1]) / homcoord; + cone_footprint = brdfBias * 0.5 * cone_footprint * max(ProjectionMatrix[0][0], ProjectionMatrix[1][1]) / homcoord; /* Estimate a cone footprint to sample a corresponding mipmap level. */ vec4 mip = log2(cone_footprint * max_v2(vec2(textureSize(depthBuffer, 0)))); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs