[Bf-blender-cvs] [5ccc02277d7] blender2.8: Eevee: Improve material variation managment.

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


Commit: 5ccc02277d7cee7affa5d3b49a8b9e6e4368b201
Author: Clément Foucault
Date:   Thu Jun 22 02:41:17 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB5ccc02277d7cee7affa5d3b49a8b9e6e4368b201

Eevee: Improve material variation managment.

- Unify variations between default shaders and material shader.
- Only create default shader passes if needed.

Downside is that we have a big array of passes and shading grp in the vedata ... And it will double in size each time a new variation flag is added.

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

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_materials.c
M	source/blender/draw/engines/eevee/eevee_private.h

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

diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 8d3cf5ea077..62edfa642eb 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -157,9 +157,7 @@ static void EEVEE_draw_scene(void *vedata)
 
 	/* Shading pass */
 	DRW_draw_pass(psl->probe_display);
-	DRW_draw_pass(psl->default_pass);
-	DRW_draw_pass(psl->default_flat_pass);
-	DRW_draw_pass(psl->default_hair_pass);
+	EEVEE_draw_default_passes(psl);
 	DRW_draw_pass(psl->material_pass);
 
 	/* Post Process */
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 15a4b86129d..0d6f589f8a5 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -922,8 +922,7 @@ static void render_scene_to_probe(
 		DRW_draw_pass(psl->depth_pass_cull);
 
 		/* Shading pass */
-		DRW_draw_pass(psl->default_pass);
-		DRW_draw_pass(psl->default_flat_pass);
+		EEVEE_draw_default_passes(psl);
 		DRW_draw_pass(psl->material_pass);
 
 		DRW_framebuffer_texture_detach(sldata->probe_rt);
@@ -985,8 +984,7 @@ static void render_scene_to_planar(
 	DRW_draw_pass(psl->depth_pass_clip_cull);
 
 	/* Shading pass */
-	DRW_draw_pass(psl->default_pass);
-	DRW_draw_pass(psl->default_flat_pass);
+	EEVEE_draw_default_passes(psl);
 	DRW_draw_pass(psl->material_pass);
 
 	DRW_state_invert_facing();
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 75eec99b1a1..09c30ff5a69 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -38,6 +38,14 @@
 #include "eevee_lut.h"
 #include "eevee_private.h"
 
+#if defined(IRRADIANCE_SH_L2)
+#define SHADER_IRRADIANCE "#define IRRADIANCE_SH_L2\n"
+#elif defined(IRRADIANCE_CUBEMAP)
+#define SHADER_IRRADIANCE "#define IRRADIANCE_CUBEMAP\n"
+#elif defined(IRRADIANCE_HL2)
+#define SHADER_IRRADIANCE "#define IRRADIANCE_HL2\n"
+#endif
+
 #define SHADER_DEFINES \
 	"#define EEVEE_ENGINE\n" \
 	"#define MAX_PROBE " STRINGIFY(MAX_PROBE) "\n" \
@@ -47,20 +55,8 @@
 	"#define MAX_SHADOW_CUBE " STRINGIFY(MAX_SHADOW_CUBE) "\n" \
 	"#define MAX_SHADOW_MAP " STRINGIFY(MAX_SHADOW_MAP) "\n" \
 	"#define MAX_SHADOW_CASCADE " STRINGIFY(MAX_SHADOW_CASCADE) "\n" \
-	"#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n"
-
-/* World shader variations */
-enum {
-	VAR_WORLD_BACKGROUND,
-	VAR_WORLD_PROBE,
-};
-
-/* Material shader variations */
-enum {
-	VAR_MAT_MESH     = (1 << 0),
-	VAR_MAT_PROBE    = (1 << 1),
-	VAR_MAT_HAIR     = (1 << 2),
-};
+	"#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n" \
+	SHADER_IRRADIANCE
 
 /* *********** STATIC *********** */
 static struct {
@@ -68,15 +64,15 @@ static struct {
 
 	struct GPUShader *default_prepass_sh;
 	struct GPUShader *default_prepass_clip_sh;
-	struct GPUShader *default_lit;
-	struct GPUShader *default_lit_flat;
-	struct GPUShader *default_lit_hair;
+	struct GPUShader *default_lit[VAR_MAT_MAX];
 
 	struct GPUShader *default_background;
 
 	/* 64*64 array texture containing all LUTs and other utilitarian arrays.
 	 * Packing enables us to same precious textures slots. */
 	struct GPUTexture *util_tex;
+
+	float viewvecs[2][4];
 } e_data = {NULL}; /* Engine data */
 
 extern char datatoc_prepass_frag_glsl[];
@@ -166,6 +162,76 @@ static struct GPUTexture *create_ggx_lut_texture(int UNUSED(w), int UNUSED(h))
 }
 #endif
 
+static char *eevee_get_defines(int options)
+{
+	char *str = NULL;
+
+	BLI_assert(options < VAR_MAT_MAX);
+
+	DynStr *ds = BLI_dynstr_new();
+	BLI_dynstr_appendf(ds, SHADER_DEFINES);
+
+	if ((options & VAR_MAT_MESH) != 0) {
+		BLI_dynstr_appendf(ds, "#define MESH_SHADER\n");
+	}
+	if ((options & VAR_MAT_HAIR) != 0) {
+		BLI_dynstr_appendf(ds, "#define HAIR_SHADER\n");
+	}
+	if ((options & VAR_MAT_PROBE) != 0) {
+		BLI_dynstr_appendf(ds, "#define PROBE_CAPTURE\n");
+	}
+	if ((options & VAR_MAT_AO) != 0) {
+		BLI_dynstr_appendf(ds, "#define USE_AO\n");
+	}
+	if ((options & VAR_MAT_FLAT) != 0) {
+		BLI_dynstr_appendf(ds, "#define USE_FLAT_NORMAL\n");
+	}
+	if ((options & VAR_MAT_BENT) != 0) {
+		BLI_dynstr_appendf(ds, "#define USE_BENT_NORMAL\n");
+	}
+
+	str = BLI_dynstr_get_cstring(ds);
+	BLI_dynstr_free(ds);
+
+	return str;
+}
+
+static void add_standard_uniforms(DRWShadingGroup *shgrp, EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
+{
+	DRW_shgroup_uniform_block(shgrp, "probe_block", sldata->probe_ubo);
+	DRW_shgroup_uniform_block(shgrp, "grid_block", sldata->grid_ubo);
+	DRW_shgroup_uniform_block(shgrp, "planar_block", sldata->planar_ubo);
+	DRW_shgroup_uniform_block(shgrp, "light_block", sldata->light_ubo);
+	DRW_shgroup_uniform_block(shgrp, "shadow_block", sldata->shadow_ubo);
+	DRW_shgroup_uniform_int(shgrp, "light_count", &sldata->lamps->num_light, 1);
+	DRW_shgroup_uniform_int(shgrp, "probe_count", &sldata->probes->num_render_cube, 1);
+	DRW_shgroup_uniform_int(shgrp, "grid_count", &sldata->probes->num_render_grid, 1);
+	DRW_shgroup_uniform_int(shgrp, "planar_count", &sldata->probes->num_planar, 1);
+	DRW_shgroup_uniform_bool(shgrp, "specToggle", &sldata->probes->specular_toggle, 1);
+	DRW_shgroup_uniform_float(shgrp, "lodMax", &sldata->probes->lodmax, 1);
+	DRW_shgroup_uniform_texture(shgrp, "utilTex", e_data.util_tex);
+	DRW_shgroup_uniform_buffer(shgrp, "probeCubes", &sldata->probe_pool);
+	DRW_shgroup_uniform_buffer(shgrp, "probePlanars", &vedata->txl->planar_pool);
+	DRW_shgroup_uniform_buffer(shgrp, "irradianceGrid", &sldata->irradiance_pool);
+	DRW_shgroup_uniform_buffer(shgrp, "shadowCubes", &sldata->shadow_depth_cube_pool);
+	DRW_shgroup_uniform_buffer(shgrp, "shadowCascades", &sldata->shadow_depth_cascade_pool);
+}
+
+static void create_default_shader(int options)
+{
+	DynStr *ds_frag = BLI_dynstr_new();
+	BLI_dynstr_append(ds_frag, e_data.frag_shader_lib);
+	BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl);
+	char *frag_str = BLI_dynstr_get_cstring(ds_frag);
+	BLI_dynstr_free(ds_frag);
+
+	char *defines = eevee_get_defines(options);
+
+	e_data.default_lit[options] = DRW_shader_create(datatoc_lit_surface_vert_glsl, NULL, frag_str, defines);
+
+	MEM_freeN(defines);
+	MEM_freeN(frag_str);
+}
 void EEVEE_materials_init(void)
 {
 	if (!e_data.frag_shader_lib) {
@@ -191,37 +257,6 @@ void EEVEE_materials_init(void)
 		e_data.default_background = DRW_shader_create_fullscreen(
 		        datatoc_default_world_frag_glsl, NULL);
 
-		e_data.default_lit = DRW_shader_create(
-		        datatoc_lit_surface_vert_glsl, NULL, frag_str,
-		        SHADER_DEFINES
-#if defined(IRRADIANCE_SH_L2)
-		        "#define IRRADIANCE_SH_L2\n"
-#elif defined(IRRADIANCE_CUBEMAP)
-		        "#define IRRADIANCE_CUBEMAP\n"
-#elif defined(IRRADIANCE_HL2)
-		        "#define IRRADIANCE_HL2\n"
-#endif
-		        "#define MESH_SHADER\n");
-
-		e_data.default_lit_flat = DRW_shader_create(
-		        datatoc_lit_surface_vert_glsl, NULL, frag_str,
-		        SHADER_DEFINES
-#if defined(IRRADIANCE_SH_L2)
-		        "#define IRRADIANCE_SH_L2\n"
-#elif defined(IRRADIANCE_CUBEMAP)
-		        "#define IRRADIANCE_CUBEMAP\n"
-#elif defined(IRRADIANCE_HL2)
-		        "#define IRRADIANCE_HL2\n"
-#endif
-		        "#define MESH_SHADER\n"
-		        "#define USE_FLAT_NORMAL\n");
-
-		e_data.default_lit_hair = DRW_shader_create(
-		        datatoc_lit_surface_vert_glsl, NULL, frag_str,
-		        SHADER_DEFINES
-		        "#define MESH_SHADER\n"
-		        "#define HAIR_SHADER\n");
-
 		e_data.default_prepass_sh = DRW_shader_create(
 		        datatoc_prepass_vert_glsl, NULL, datatoc_prepass_frag_glsl,
 		        NULL);
@@ -280,58 +315,93 @@ struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, Wor
 	    SHADER_DEFINES "#define WORLD_BACKGROUND\n");
 }
 
-struct GPUMaterial *EEVEE_material_mesh_get(struct Scene *scene, Material *ma)
+struct GPUMaterial *EEVEE_material_mesh_get(
+        struct Scene *scene, Material *ma,
+        bool use_ao, bool use_bent_normals)
 {
-	return GPU_material_from_nodetree(
+	struct GPUMaterial *mat;
+
+	int options = VAR_MAT_MESH;
+
+	if (use_ao) options |= VAR_MAT_AO;
+	if (use_bent_normals) options |= VAR_MAT_BENT;
+
+	char *defines = eevee_get_defines(options);
+
+	mat = GPU_material_from_nodetree(
 	    scene, ma->nodetree, &ma->gpumaterial, &DRW_engine_viewport_eevee_type,
-	    VAR_MAT_MESH,
+	    options,
 	    datatoc_lit_surface_vert_glsl, NULL, e_data.frag_shader_lib,
-	    SHADER_DEFINES
-#if defined(IRRADIANCE_SH_L2)
-	    "#define IRRADIANCE_SH_L2\n"
-#elif defined(IRRADIANCE_CUBEMAP)
-	    "#define IRRADIANCE_CUBEMAP\n"
-#elif defined(IRRADIANCE_HL2)
-	    "#define IRRADIANCE_HL2\n"
-#endif
-	    "#define MESH_SHADER\n");
+	    defines);
+
+	MEM_freeN(defines);
+
+	return mat;
 }
 
-struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma)
+struct GPUMaterial *EEVEE_material_hair_get(
+        struct Scene *scene, Material *ma,
+        bool use_ao, bool use_bent_normals)
 {
-	return GPU_material_from_nodetree(
+	struct GPUMaterial *mat;
+
+	int options = VAR_MAT_MESH | VAR_MAT_HAIR;
+
+	if (use_ao) options |= VAR_MAT_AO;
+	if (use_bent_normals) options |= VAR_MAT_BENT;
+
+	char *defines = eevee_get_defines(options);
+
+	mat = GPU_material_from_nodetree(
 	    scene, ma->nodetree, &ma->gpumaterial, &DRW_engine_viewport_eevee_type,
-	    VAR_MAT_HAIR,
+	    options,
 	    datatoc_lit_surface_vert_glsl, NULL, e_data.frag_shader_lib,
-	    SHADER_DEFINES "#define MESH_SHADER\n" "#define HAIR_SHADER\n");
+	    defines);
+
+	MEM_freeN(defines);
+
+	return mat;
 }
 
-static void add_standard_uniforms(DRWShadingGroup *shgrp, EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
+static struct DRWShadingGroup *EEVEE_default_shading_group_get(
+        EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata,
+        bool is_hair, bool is_flat_normal, bool use_ao, bool use_bent_normals)
 {
-	DRW_shgroup_uniform_block(shgrp, "probe_block", sldata->probe_ubo);
-	DRW_shgroup_uniform_block(shgrp, "grid_block", sldata->grid_ubo);
-	DRW_shgroup_uniform_block(shgrp, "planar_block", sldata->plana

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list