[Bf-blender-cvs] [9c82203e828] blender2.8: Eevee: Probes: Change falloff of irradiance grid.

Clément Foucault noreply at git.blender.org
Thu Jun 15 01:16:22 CEST 2017


Commit: 9c82203e8282551838898061e30422fb4a1a89c8
Author: Clément Foucault
Date:   Wed Jun 14 22:45:20 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB9c82203e8282551838898061e30422fb4a1a89c8

Eevee: Probes: Change falloff of irradiance grid.

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

M	release/scripts/startup/bl_ui/properties_data_lightprobe.py
M	source/blender/draw/engines/eevee/eevee_lightprobes.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
M	source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl

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

diff --git a/release/scripts/startup/bl_ui/properties_data_lightprobe.py b/release/scripts/startup/bl_ui/properties_data_lightprobe.py
index 854807c6124..1733506ee93 100644
--- a/release/scripts/startup/bl_ui/properties_data_lightprobe.py
+++ b/release/scripts/startup/bl_ui/properties_data_lightprobe.py
@@ -70,6 +70,12 @@ class DATA_PT_lightprobe(DataButtonsPanel, Panel):
             col.prop(probe, "grid_resolution_x", text="X")
             col.prop(probe, "grid_resolution_y", text="Y")
             col.prop(probe, "grid_resolution_z", text="Z")
+
+            col.separator()
+
+            col.label("Influence:")
+            col.prop(probe, "influence_distance", "Distance")
+            col.prop(probe, "falloff")
         else:
             col = split.column(align=True)
             col.label("Influence:")
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);




More information about the Bf-blender-cvs mailing list