[Bf-blender-cvs] [683e31fd80d] blender2.8: Eevee: SSR: Rewrote the raytracing algorithm.

Clément Foucault noreply at git.blender.org
Mon Jul 31 18:26:58 CEST 2017


Commit: 683e31fd80d36cffe4c65cfc0e973bb191889eee
Author: Clément Foucault
Date:   Sun Jul 30 17:11:05 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB683e31fd80d36cffe4c65cfc0e973bb191889eee

Eevee: SSR: Rewrote the raytracing algorithm.

It now uses a quality slider instead of stride.
Lower quality takes larger strides between samples and use lower mips when tracing rough rays.

Now raytracing is done entierly in homogeneous coordinate space. This run much faster.
Should be fairly optimized. We are still Bandwidth bound.

Add a line-line intersection refine.
Add a ray jitter between the multiple ray per pixel to fill some undersampling in mirror reflections.

The tracing now stops if it goes behind an object. This needs some work to allow it to continue even if behind objects.

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

M	release/scripts/startup/bl_ui/properties_render.py
M	release/scripts/startup/bl_ui/properties_render_layer.py
M	source/blender/draw/engines/eevee/eevee_effects.c
M	source/blender/draw/engines/eevee/eevee_engine.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/effect_ssr_frag.glsl
M	source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
M	source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index f35b3a5f47d..f4f5019a4f2 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -732,7 +732,7 @@ class RENDER_PT_eevee_screen_space_reflections(RenderButtonsPanel, Panel):
         col = layout.column()
         col.prop(props, "ssr_halfres")
         col.prop(props, "ssr_ray_count")
-        col.prop(props, "ssr_stride")
+        col.prop(props, "ssr_quality")
         col.prop(props, "ssr_thickness")
         col.prop(props, "ssr_border_fade")
         col.prop(props, "ssr_firefly_fac")
diff --git a/release/scripts/startup/bl_ui/properties_render_layer.py b/release/scripts/startup/bl_ui/properties_render_layer.py
index 5aeb117c071..09458579fd7 100644
--- a/release/scripts/startup/bl_ui/properties_render_layer.py
+++ b/release/scripts/startup/bl_ui/properties_render_layer.py
@@ -277,7 +277,7 @@ class RENDERLAYER_PT_eevee_screen_space_reflections(RenderLayerButtonsPanel, Pan
         col = layout.column()
         col.template_override_property(layer_props, scene_props, "ssr_halfres")
         col.template_override_property(layer_props, scene_props, "ssr_ray_count")
-        col.template_override_property(layer_props, scene_props, "ssr_stride")
+        col.template_override_property(layer_props, scene_props, "ssr_quality")
         col.template_override_property(layer_props, scene_props, "ssr_thickness")
         col.template_override_property(layer_props, scene_props, "ssr_border_fade")
         col.template_override_property(layer_props, scene_props, "ssr_firefly_fac")
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 4de887f14fd..6d1dadf06b5 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -102,8 +102,6 @@ static struct {
 	struct GPUTexture *depth_src;
 	struct GPUTexture *color_src;
 	int depth_src_layer;
-
-	float pixelprojmat[4][4];
 } e_data = {NULL}; /* Engine data */
 
 extern char datatoc_bsdf_common_lib_glsl[];
@@ -581,7 +579,7 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 		effects->ssr_ray_count = BKE_collection_engine_property_value_get_int(props, "ssr_ray_count");
 		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_stride = (float)BKE_collection_engine_property_value_get_int(props, "ssr_stride");
+		effects->ssr_quality = 1.0f - 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");
@@ -621,23 +619,9 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 
 		DRW_framebuffer_init(&fbl->screen_tracing_fb, &draw_engine_eevee_type, tracing_res[0], tracing_res[1], tex_output, effects->ssr_ray_count);
 
-		/* Compute pixel projection matrix */
-		{
-			float uvpix[4][4], ndcuv[4][4], tmp[4][4], winmat[4][4];
-			DRW_viewport_matrix_get(winmat, DRW_MAT_WIN);
-
-			/* NDC to UVs */
-			unit_m4(ndcuv);
-			ndcuv[0][0] = ndcuv[1][1] = ndcuv[3][0] = ndcuv[3][1] = 0.5f;
-
-			/* UVs to pixels */
-			unit_m4(uvpix);
-			uvpix[0][0] = viewport_size[0];
-			uvpix[1][1] = viewport_size[1];
-
-			mul_m4_m4m4(tmp, uvpix, ndcuv);
-			mul_m4_m4m4(e_data.pixelprojmat, tmp, winmat);
-		}
+		/* Compute pixel size */
+		copy_v2_v2(effects->ssr_pixelsize, viewport_size);
+		invert_v2(effects->ssr_pixelsize);
 	}
 	else {
 		/* Cleanup to release memory */
@@ -762,9 +746,10 @@ void EEVEE_effects_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 		DRW_shgroup_uniform_buffer(grp, "normalBuffer", &txl->ssr_normal_input);
 		DRW_shgroup_uniform_buffer(grp, "specroughBuffer", &txl->ssr_specrough_input);
 		DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
+		DRW_shgroup_uniform_buffer(grp, "maxzBuffer", &txl->maxzbuffer);
+		DRW_shgroup_uniform_buffer(grp, "minzBuffer", &stl->g_data->minzbuffer);
 		DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)stl->g_data->viewvecs, 2);
-		DRW_shgroup_uniform_vec2(grp, "ssrParameters", &effects->ssr_stride, 1);
-		DRW_shgroup_uniform_mat4(grp, "PixelProjMatrix", (float *)&e_data.pixelprojmat);
+		DRW_shgroup_uniform_vec4(grp, "ssrParameters", &effects->ssr_quality, 1);
 		DRW_shgroup_uniform_int(grp, "rayCount", &effects->ssr_ray_count, 1);
 		DRW_shgroup_uniform_int(grp, "planar_count", &sldata->probes->num_planar, 1);
 		DRW_shgroup_uniform_buffer(grp, "planarDepth", &vedata->txl->planar_depth);
@@ -1267,7 +1252,8 @@ void EEVEE_draw_effects(EEVEE_Data *vedata)
 				if (stl->g_data->ssr_hit_output[0]) DRW_transform_to_display(stl->g_data->ssr_hit_output[0]);
 				break;
 			case 3:
-				if (txl->ssr_normal_input) DRW_transform_to_display(txl->ssr_normal_input);
+				if (stl->g_data->ssr_hit_output[1]) DRW_transform_to_display(stl->g_data->ssr_hit_output[1]);
+				// if (txl->ssr_normal_input) DRW_transform_to_display(txl->ssr_normal_input);
 				break;
 			case 4:
 				if (txl->ssr_specrough_input) DRW_transform_to_display(txl->ssr_specrough_input);
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index c48edcc3a53..4272e344119 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -239,10 +239,10 @@ static void EEVEE_scene_layer_settings_create(RenderEngine *UNUSED(engine), IDPr
 	BKE_collection_engine_property_add_bool(props, "ssr_enable", false);
 	BKE_collection_engine_property_add_bool(props, "ssr_halfres", true);
 	BKE_collection_engine_property_add_int(props, "ssr_ray_count", 1);
-	BKE_collection_engine_property_add_int(props, "ssr_stride", 16);
+	BKE_collection_engine_property_add_float(props, "ssr_quality", 0.25);
 	BKE_collection_engine_property_add_float(props, "ssr_thickness", 0.2f);
 	BKE_collection_engine_property_add_float(props, "ssr_border_fade", 0.075f);
-	BKE_collection_engine_property_add_float(props, "ssr_firefly_fac", 0.5f);
+	BKE_collection_engine_property_add_float(props, "ssr_firefly_fac", 0.0f);
 
 	BKE_collection_engine_property_add_bool(props, "volumetric_enable", false);
 	BKE_collection_engine_property_add_float(props, "volumetric_start", 0.1f);
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 0b1fc2f5dff..115e2a25ea4 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -327,8 +327,9 @@ typedef struct EEVEE_EffectsInfo {
 	int ssr_ray_count;
 	float ssr_firefly_fac;
 	float ssr_border_fac;
-	float ssr_stride;
+	float ssr_quality;
 	float ssr_thickness;
+	float ssr_pixelsize[2];
 
 	/* Ambient Occlusion */
 	bool use_ao, use_bent_normals;
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 17430007502..e80835ee498 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
@@ -95,6 +95,7 @@ struct ShadowCascadeData {
 
 vec3 mul(mat3 m, vec3 v) { return m * v; }
 mat3 mul(mat3 m1, mat3 m2) { return m1 * m2; }
+vec3 transform_direction(mat4 m, vec3 v) { return mat3(m) * v; }
 vec3 transform_point(mat4 m, vec3 v) { return (m * vec4(v, 1.0)).xyz; }
 vec3 project_point(mat4 m, vec3 v) {
 	vec4 tmp = m * vec4(v, 1.0);
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 3a8430f14e6..673440c3d54 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
@@ -47,7 +47,7 @@ bool has_hit_backface(vec3 hit_pos, vec3 R, vec3 V)
 	return (dot(-R, hit_N) < 0.0);
 }
 
-vec4 do_planar_ssr(int index, vec3 V, vec3 N, vec3 planeNormal, vec3 viewPosition, float a2, vec3 rand)
+vec4 do_planar_ssr(int index, vec3 V, vec3 N, vec3 planeNormal, vec3 viewPosition, float a2, vec3 rand, float ray_nbr)
 {
 	float pdf;
 	vec3 R = generate_ray(V, N, a2, rand, pdf);
@@ -57,46 +57,34 @@ vec4 do_planar_ssr(int index, vec3 V, vec3 N, vec3 planeNormal, vec3 viewPositio
 
 	/* If ray is bad (i.e. going below the plane) do not trace. */
 	if (dot(R, planeNormal) > 0.0) {
-		vec3 R = generate_ray(V, N, a2, rand, pdf);
+		vec3 R = generate_ray(V, N, a2, rand * vec3(1.0, -1.0, -1.0), pdf);
 	}
 
-	float hit_dist;
+	vec3 hit_pos;
 	if (abs(dot(-R, V)) < 0.9999) {
-		hit_dist = raycast(index, viewPosition, R, rand.x);
+		/* Since viewspace hit position can land behind the camera in this case,
+		 * we save the reflected view position (visualize it as the hit position
+		 * below the reflection plane). This way it's garanted that the hit will
+		 * be in front of the camera. That let us tag the bad rays with a negative
+		 * sign in the Z component. */
+		hit_pos = raycast(index, viewPosition, R, fract(rand.x + (ray_nbr / float(rayCount))), a2);
 	}
 	else {
-		float z = get_view_z_from_depth(texelFetch(planarDepth, ivec3(project_point(PixelProjMatrix, viewPosition).xy, index), 0).r);
-		hit_dist = (z - viewPosition.z) / R.z;
-	}
-
-	/* Since viewspace hit position can land behind the camera in this case,
-	 * we save the reflected view position (visualize it as the hit position
-	 * below the reflection plane). This way it's garanted that the hit will
-	 * be in front of the camera. That let us tag the bad rays with a negative
-	 * sign in the Z component. */
-	vec3 hit_pos = viewPosition + R * abs(hit_dist);
-
-	/* Ray did not hit anything. No backface test because it's not possible
-	 * to h

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list