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.
This commit is contained in:
Clément Foucault 2018-01-16 14:03:31 +01:00
parent 9afeba330f
commit 5f569378d2
3 changed files with 13 additions and 15 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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))));