[Bf-blender-cvs] [678c5e37524] temp-ssr: Eevee: SSR: Refactor multiple rays. Plus other changes...

Clément Foucault noreply at git.blender.org
Mon Jul 24 15:25:55 CEST 2017


Commit: 678c5e37524a7862167646cd1bc8685b99bf6185
Author: Clément Foucault
Date:   Mon Jul 24 11:18:11 2017 +0200
Branches: temp-ssr
https://developer.blender.org/rB678c5e37524a7862167646cd1bc8685b99bf6185

Eevee: SSR: Refactor multiple rays. Plus other changes...

-Allow a maximum of 4 rays per trace pixel.
-Removes parameter Normalize: use normalization all the time now.
-Add firefly clamp slider.

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

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_lightprobes.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/shaders/effect_ssr_frag.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 136ee3732ff..f35b3a5f47d 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -710,8 +710,8 @@ class RENDER_PT_eevee_volumetric(RenderButtonsPanel, Panel):
         col.prop(props, "volumetric_colored_transmittance")
 
 
-class RENDER_PT_eevee_shading(RenderButtonsPanel, Panel):
-    bl_label = "Shading"
+class RENDER_PT_eevee_screen_space_reflections(RenderButtonsPanel, Panel):
+    bl_label = "Screen Space Reflections"
     COMPAT_ENGINES = {'BLENDER_EEVEE'}
 
     @classmethod
@@ -719,19 +719,23 @@ class RENDER_PT_eevee_shading(RenderButtonsPanel, Panel):
         scene = context.scene
         return scene and (scene.render.engine in cls.COMPAT_ENGINES)
 
+    def draw_header(self, context):
+        scene = context.scene
+        props = scene.layer_properties['BLENDER_EEVEE']
+        self.layout.prop(props, "ssr_enable", text="")
+
     def draw(self, context):
         layout = self.layout
         scene = context.scene
         props = scene.layer_properties['BLENDER_EEVEE']
 
         col = layout.column()
-        col.prop(props, "ssr_enable")
         col.prop(props, "ssr_halfres")
-        col.prop(props, "ssr_two_rays")
-        col.prop(props, "ssr_normalize_weight")
+        col.prop(props, "ssr_ray_count")
         col.prop(props, "ssr_stride")
         col.prop(props, "ssr_thickness")
         col.prop(props, "ssr_border_fade")
+        col.prop(props, "ssr_firefly_fac")
 
 
 classes = (
@@ -751,10 +755,10 @@ classes = (
     RENDER_PT_bake,
     RENDER_PT_clay_layer_settings,
     RENDER_PT_clay_collection_settings,
+    RENDER_PT_eevee_volumetric,
+    RENDER_PT_eevee_screen_space_reflections,
     RENDER_PT_eevee_poststack_settings,
     RENDER_PT_eevee_postprocess_settings,
-    RENDER_PT_eevee_volumetric,
-    RENDER_PT_eevee_shading,
 )
 
 if __name__ == "__main__":  # only for live edit.
diff --git a/release/scripts/startup/bl_ui/properties_render_layer.py b/release/scripts/startup/bl_ui/properties_render_layer.py
index d5a56fbf84e..5aeb117c071 100644
--- a/release/scripts/startup/bl_ui/properties_render_layer.py
+++ b/release/scripts/startup/bl_ui/properties_render_layer.py
@@ -250,8 +250,8 @@ class RENDERLAYER_PT_eevee_volumetric(RenderLayerButtonsPanel, Panel):
         col.template_override_property(layer_props, scene_props, "volumetric_colored_transmittance")
 
 
-class RENDERLAYER_PT_eevee_shading(RenderLayerButtonsPanel, Panel):
-    bl_label = "Shading"
+class RENDERLAYER_PT_eevee_screen_space_reflections(RenderLayerButtonsPanel, Panel):
+    bl_label = "Screen Space Reflections"
     COMPAT_ENGINES = {'BLENDER_EEVEE'}
 
     @classmethod
@@ -259,6 +259,14 @@ class RENDERLAYER_PT_eevee_shading(RenderLayerButtonsPanel, Panel):
         scene = context.scene
         return scene and (scene.render.engine in cls.COMPAT_ENGINES)
 
+    def draw_header(self, context):
+        scene = context.scene
+        scene_props = scene.layer_properties['BLENDER_EEVEE']
+        layer = bpy.context.render_layer
+        layer_props = layer.engine_overrides['BLENDER_EEVEE']
+
+        self.layout.template_override_property(layer_props, scene_props, "ssr_enable", text="")
+
     def draw(self, context):
         layout = self.layout
         scene = context.scene
@@ -267,13 +275,12 @@ class RENDERLAYER_PT_eevee_shading(RenderLayerButtonsPanel, Panel):
         layer_props = layer.engine_overrides['BLENDER_EEVEE']
 
         col = layout.column()
-        col.template_override_property(layer_props, scene_props, "ssr_enable")
         col.template_override_property(layer_props, scene_props, "ssr_halfres")
-        col.template_override_property(layer_props, scene_props, "ssr_two_rays")
-        col.template_override_property(layer_props, scene_props, "ssr_normalize_weight")
+        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_thickness")
         col.template_override_property(layer_props, scene_props, "ssr_border_fade")
+        col.template_override_property(layer_props, scene_props, "ssr_firefly_fac")
 
 
 classes = (
@@ -284,7 +291,7 @@ classes = (
     RENDERLAYER_PT_clay_settings,
     RENDERLAYER_PT_eevee_poststack_settings,
     RENDERLAYER_PT_eevee_postprocess_settings,
-    RENDERLAYER_PT_eevee_shading,
+    RENDERLAYER_PT_eevee_screen_space_reflections,
     RENDERLAYER_PT_eevee_volumetric,
 )
 
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 34b33598a56..6a7983b71a6 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -59,10 +59,8 @@ typedef struct EEVEE_LightProbeData {
 /* SSR shader variations */
 enum {
 	SSR_RESOLVE      = (1 << 0),
-	SSR_TWO_HIT      = (1 << 1),
-	SSR_FULL_TRACE   = (1 << 2),
-	SSR_NORMALIZE    = (1 << 3),
-	SSR_MAX_SHADER   = (1 << 4),
+	SSR_FULL_TRACE   = (1 << 1),
+	SSR_MAX_SHADER   = (1 << 2),
 };
 
 static struct {
@@ -194,15 +192,9 @@ static struct GPUShader *eevee_effects_ssr_shader_get(int options)
 		else {
 			BLI_dynstr_appendf(ds_defines, "#define STEP_RAYTRACE\n");
 		}
-		if (options & SSR_TWO_HIT) {
-			BLI_dynstr_appendf(ds_defines, "#define TWO_HIT\n");
-		}
 		if (options & SSR_FULL_TRACE) {
 			BLI_dynstr_appendf(ds_defines, "#define FULLRES\n");
 		}
-		if (options & SSR_NORMALIZE) {
-			BLI_dynstr_appendf(ds_defines, "#define USE_NORMALIZATION\n");
-		}
 		char *ssr_define_str = BLI_dynstr_get_cstring(ds_defines);
 		BLI_dynstr_free(ds_defines);
 
@@ -581,12 +573,16 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 		/* Enable double buffering to be able to read previous frame color */
 		effects->enabled_effects |= EFFECT_DOUBLE_BUFFER;
 
-		effects->ssr_use_two_hit = BKE_collection_engine_property_value_get_bool(props, "ssr_two_rays");
+		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_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");
+
+		/* Important, can lead to breakage otherwise. */
+		CLAMP(effects->ssr_ray_count, 1, 4);
 
 		const int divisor = (effects->reflection_trace_full) ? 1 : 2;
 		int tracing_res[2] = {(int)viewport_size[0] / divisor, (int)viewport_size[1] / divisor};
@@ -613,10 +609,12 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 
 		/* Raytracing output */
 		/* TODO try integer format for hit coord to increase precision */
-		DRWFboTexture tex_output[2] = {{&stl->g_data->ssr_hit_output, (effects->ssr_use_two_hit) ? DRW_TEX_RGBA_16 : DRW_TEX_RG_16, DRW_TEX_TEMP},
-		                               {&stl->g_data->ssr_pdf_output, (effects->ssr_use_two_hit) ? DRW_TEX_RG_16 : DRW_TEX_R_16, DRW_TEX_TEMP}};
+		DRWFboTexture tex_output[4] = {{&stl->g_data->ssr_hit_output[0], DRW_TEX_RGBA_16, DRW_TEX_TEMP},
+		                               {&stl->g_data->ssr_hit_output[1], DRW_TEX_RGBA_16, DRW_TEX_TEMP},
+		                               {&stl->g_data->ssr_hit_output[2], DRW_TEX_RGBA_16, DRW_TEX_TEMP},
+		                               {&stl->g_data->ssr_hit_output[3], DRW_TEX_RGBA_16, DRW_TEX_TEMP}};
 
-		DRW_framebuffer_init(&fbl->screen_tracing_fb, &draw_engine_eevee_type, tracing_res[0], tracing_res[1], tex_output, 2);
+		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 */
 		{
@@ -641,8 +639,9 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 		DRW_TEXTURE_FREE_SAFE(txl->ssr_normal_input);
 		DRW_TEXTURE_FREE_SAFE(txl->ssr_specrough_input);
 		DRW_FRAMEBUFFER_FREE_SAFE(fbl->screen_tracing_fb);
-		stl->g_data->ssr_hit_output = NULL;
-		stl->g_data->ssr_pdf_output = NULL;
+		for (int i = 0; i < 4; ++i) {
+			stl->g_data->ssr_hit_output[i] = NULL;
+		}
 	}
 
 	/* Setup double buffer so we can access last frame as it was before post processes */
@@ -747,10 +746,7 @@ void EEVEE_effects_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 	}
 
 	if ((effects->enabled_effects & EFFECT_SSR) != 0) {
-		int options = 0;
-		options |= (effects->ssr_use_two_hit) ? SSR_TWO_HIT : 0;
-		options |= (effects->reflection_trace_full) ? SSR_FULL_TRACE : 0;
-		options |= (effects->ssr_use_normalization) ? SSR_NORMALIZE : 0;
+		int options = (effects->reflection_trace_full) ? SSR_FULL_TRACE : 0;
 
 		struct GPUShader *trace_shader = eevee_effects_ssr_shader_get(options);
 		struct GPUShader *resolve_shader = eevee_effects_ssr_shader_get(SSR_RESOLVE | options);
@@ -764,6 +760,7 @@ void EEVEE_effects_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 		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_int(grp, "rayCount", &effects->ssr_ray_count, 1);
 		DRW_shgroup_call_add(grp, quad, NULL);
 
 		psl->ssr_resolve = DRW_pass_create("SSR Resolve", DRW_STATE_WRITE_COLOR | DRW_STATE_ADDITIVE);
@@ -773,18 +770,22 @@ void EEVEE_effects_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 		DRW_shgroup_uniform_buffer(grp, "specroughBuffer", &txl->ssr_specrough_input);
 		DRW_shgroup_uniform_texture(grp, "utilTex", EEVE

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list