diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-06-14 23:45:20 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-06-15 01:55:45 +0300 |
commit | 9c82203e8282551838898061e30422fb4a1a89c8 (patch) | |
tree | 63b6015b4c9bd8d679ca1a34379ec5dced0bf6ab /source/blender/draw/engines/eevee | |
parent | 99ff1bb21aaf3be13d08badf4e253efd1d0ae407 (diff) |
Eevee: Probes: Change falloff of irradiance grid.
Diffstat (limited to 'source/blender/draw/engines/eevee')
4 files changed, 22 insertions, 28 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index cc37fb24dfc..0a368229c83 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -378,27 +378,14 @@ static void EEVEE_lightprobes_updates(EEVEE_SceneLayerData *sldata, EEVEE_PassLi EEVEE_LightProbeEngineData *ped = EEVEE_lightprobe_data_get(ob); egrid->offset = offset; + float fac = 1.0f / max_ff(1e-8f, probe->falloff); + egrid->attenuation_scale = fac / max_ff(1e-8f, probe->distinf); + egrid->attenuation_bias = fac; /* Set offset for the next grid */ offset += ped->num_cell; /* Update transforms */ - float tmp[4][4] = { - {2.0f, 0.0f, 0.0f, 0.0f}, - {0.0f, 2.0f, 0.0f, 0.0f}, - {0.0f, 0.0f, 2.0f, 0.0f}, - {-1.0f, -1.0f, -1.0f, 1.0f} - }; - float tmp_grid_mat[4][4] = { - {1.0f / (float)(probe->grid_resolution_x), 0.0f, 0.0f, 0.0f}, - {0.0f, 1.0f / (float)(probe->grid_resolution_y), 0.0f, 0.0f}, - {0.0f, 0.0f, 1.0f / (float)(probe->grid_resolution_z), 0.0f}, - {0.0f, 0.0f, 0.0f, 1.0f} - }; - mul_m4_m4m4(tmp, tmp, tmp_grid_mat); - mul_m4_m4m4(egrid->mat, ob->obmat, tmp); - invert_m4(egrid->mat); - float cell_dim[3], half_cell_dim[3]; cell_dim[0] = 2.0f / (float)(probe->grid_resolution_x); cell_dim[1] = 2.0f / (float)(probe->grid_resolution_y); @@ -406,6 +393,9 @@ static void EEVEE_lightprobes_updates(EEVEE_SceneLayerData *sldata, EEVEE_PassLi mul_v3_v3fl(half_cell_dim, cell_dim, 0.5f); + /* Matrix converting world space to cell ranges. */ + invert_m4_m4(egrid->mat, ob->obmat); + /* First cell. */ copy_v3_fl(egrid->corner, -1.0f); add_v3_v3(egrid->corner, half_cell_dim); diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index d4194e95584..0a64c9baf6d 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -185,8 +185,8 @@ typedef struct EEVEE_LightProbe { typedef struct EEVEE_LightGrid { float mat[4][4]; int resolution[3], offset; - float corner[3], pad1; - float increment_x[3], pad2; /* world space vector between 2 opposite cells */ + float corner[3], attenuation_scale; + float increment_x[3], attenuation_bias; /* world space vector between 2 opposite cells */ float increment_y[3], pad3; float increment_z[3], pad4; } EEVEE_LightGrid; diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl index ece4250741c..16168320453 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl @@ -27,14 +27,16 @@ struct ProbeData { struct GridData { mat4 localmat; ivec4 resolution_offset; - vec4 ws_corner; /* world space position */ - vec4 ws_increment_x; /* world space vector between 2 opposite cells */ + vec4 ws_corner_atten_scale; /* world space corner position */ + vec4 ws_increment_x_atten_bias; /* world space vector between 2 opposite cells */ vec4 ws_increment_y; vec4 ws_increment_z; }; -#define g_corner ws_corner.xyz -#define g_increment_x ws_increment_x.xyz +#define g_corner ws_corner_atten_scale.xyz +#define g_atten_scale ws_corner_atten_scale.w +#define g_atten_bias ws_increment_x_atten_bias.w +#define g_increment_x ws_increment_x_atten_bias.xyz #define g_increment_y ws_increment_y.xyz #define g_increment_z ws_increment_z.xyz #define g_resolution resolution_offset.xyz 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 f539327abc4..ebba5f3c742 100644 --- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl @@ -364,7 +364,7 @@ vec3 eevee_surface_lit(vec3 world_normal, vec3 albedo, vec3 f0, float roughness, /* Specular probes */ /* Start at 1 because 0 is world probe */ - for (int i = 1; i < MAX_PROBE && i < probe_count; ++i) { + for (int i = 1; i < MAX_PROBE && i < probe_count && spec_accum.a < 0.999; ++i) { ProbeData pd = probes_data[i]; float dist_attenuation = probe_attenuation(sd.W, pd); @@ -383,18 +383,20 @@ vec3 eevee_surface_lit(vec3 world_normal, vec3 albedo, vec3 f0, float roughness, } /* Start at 1 because 0 is world irradiance */ - for (int i = 1; i < MAX_GRID && i < grid_count; ++i) { + for (int i = 1; i < MAX_GRID && i < grid_count && diff_accum.a < 0.999; ++i) { GridData gd = grids_data[i]; vec3 localpos = (gd.localmat * vec4(sd.W, 1.0)).xyz; - vec3 localpos_max = vec3(gd.g_resolution + ivec3(1)) - localpos; - float fade = min(1.0, min_v3(min(localpos_max, localpos))); + float fade = min(1.0, min_v3(1.0 - abs(localpos))); + fade = saturate(fade * gd.g_atten_scale + gd.g_atten_bias); if (fade > 0.0) { - localpos -= 1.0; + localpos = localpos * 0.5 + 0.5; + localpos = localpos * vec3(gd.g_resolution) - 0.5; + vec3 localpos_floored = floor(localpos); - vec3 trilinear_weight = fract(localpos); /* fract(-localpos) */ + vec3 trilinear_weight = fract(localpos); float weight_accum = 0.0; vec3 irradiance_accum = vec3(0.0); |