[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