[Bf-blender-cvs] [041a50291b7] blender2.8: Eevee: Make default shaders works.

Clément Foucault noreply at git.blender.org
Tue Apr 25 19:00:28 CEST 2017


Commit: 041a50291b73b727fdf8bc3192de2917e8563ce0
Author: Clément Foucault
Date:   Tue Apr 25 18:46:59 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB041a50291b73b727fdf8bc3192de2917e8563ce0

Eevee: Make default shaders works.

- Added New Batch cache routine to get the split mesh for each material. (optimization needed)
- Did some shader modifications to create default_frag and support a somwhat correct fresnel for lamps (to finish)

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

M	release/scripts/startup/bl_ui/properties_material.py
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
A	source/blender/draw/engines/eevee/shaders/default_frag.glsl
M	source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl.h
M	source/blender/draw/intern/draw_cache_impl_mesh.c
M	source/blender/draw/intern/draw_manager.c

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

diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py
index 06ae1847d06..0e8acf6e6c5 100644
--- a/release/scripts/startup/bl_ui/properties_material.py
+++ b/release/scripts/startup/bl_ui/properties_material.py
@@ -1054,6 +1054,88 @@ class MATERIAL_PT_custom_props(MaterialButtonsPanel, PropertyPanel, Panel):
     _property_type = bpy.types.Material
 
 
+class EEVEE_MATERIAL_PT_context_material(MaterialButtonsPanel, Panel):
+    bl_label = ""
+    bl_context = "material"
+    bl_options = {'HIDE_HEADER'}
+    COMPAT_ENGINES = {'BLENDER_EEVEE'}
+
+    @classmethod
+    def poll(cls, context):
+        engine = context.scene.render.engine
+        return (context.material or context.object) and (engine in cls.COMPAT_ENGINES)
+
+    def draw(self, context):
+        layout = self.layout
+
+        mat = context.material
+        ob = context.object
+        slot = context.material_slot
+        space = context.space_data
+
+        if ob:
+            is_sortable = len(ob.material_slots) > 1
+            rows = 1
+            if (is_sortable):
+                rows = 4
+
+            row = layout.row()
+
+            row.template_list("MATERIAL_UL_matslots", "", ob, "material_slots", ob, "active_material_index", rows=rows)
+
+            col = row.column(align=True)
+            col.operator("object.material_slot_add", icon='ZOOMIN', text="")
+            col.operator("object.material_slot_remove", icon='ZOOMOUT', text="")
+
+            col.menu("MATERIAL_MT_specials", icon='DOWNARROW_HLT', text="")
+
+            if is_sortable:
+                col.separator()
+
+                col.operator("object.material_slot_move", icon='TRIA_UP', text="").direction = 'UP'
+                col.operator("object.material_slot_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
+
+            if ob.mode == 'EDIT':
+                row = layout.row(align=True)
+                row.operator("object.material_slot_assign", text="Assign")
+                row.operator("object.material_slot_select", text="Select")
+                row.operator("object.material_slot_deselect", text="Deselect")
+
+        split = layout.split(percentage=0.65)
+
+        if ob:
+            split.template_ID(ob, "active_material", new="material.new")
+            row = split.row()
+
+            if slot:
+                row.prop(slot, "link", text="")
+            else:
+                row.label()
+        elif mat:
+            split.template_ID(space, "pin_id")
+            split.separator()
+
+
+class EEVEE_MATERIAL_PT_surface(MaterialButtonsPanel, Panel):
+    bl_label = "Surface"
+    bl_context = "material"
+    COMPAT_ENGINES = {'BLENDER_EEVEE'}
+
+    @classmethod
+    def poll(cls, context):
+        engine = context.scene.render.engine
+        return context.material and (engine in cls.COMPAT_ENGINES)
+
+    def draw(self, context):
+        layout = self.layout
+
+        mat = context.material
+        if not mat.use_nodes:
+            layout.prop(mat, "diffuse_color", text="Diffuse")
+            layout.prop(mat, "specular_color", text="Specular")
+            layout.prop(mat, "specular_hardness", text="Glossiness")
+
+
 classes = (
     MATERIAL_MT_sss_presets,
     MATERIAL_MT_specials,
@@ -1082,6 +1164,8 @@ classes = (
     MATERIAL_PT_volume_integration,
     MATERIAL_PT_volume_options,
     MATERIAL_PT_custom_props,
+    EEVEE_MATERIAL_PT_context_material,
+    EEVEE_MATERIAL_PT_surface,
 )
 
 if __name__ == "__main__":  # only for live edit.
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 61f95f8a176..14dbd50c487 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -109,6 +109,7 @@ data_to_c_simple(engines/clay/shaders/clay_vert.glsl SRC)
 data_to_c_simple(engines/clay/shaders/ssao_alchemy.glsl SRC)
 data_to_c_simple(engines/clay/shaders/ssao_groundtruth.glsl SRC)
 
+data_to_c_simple(engines/eevee/shaders/default_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lit_surface_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lit_surface_vert.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/probe_filter_frag.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee.c b/source/blender/draw/engines/eevee/eevee.c
index 26e82467cd7..69d6c19b8a7 100644
--- a/source/blender/draw/engines/eevee/eevee.c
+++ b/source/blender/draw/engines/eevee/eevee.c
@@ -54,6 +54,7 @@ static struct {
 	float camera_pos[3];
 } e_data = {NULL}; /* Engine data */
 
+extern char datatoc_default_frag_glsl[];
 extern char datatoc_ltc_lib_glsl[];
 extern char datatoc_bsdf_lut_frag_glsl[];
 extern char datatoc_bsdf_common_lib_glsl[];
@@ -71,6 +72,8 @@ extern char datatoc_probe_frag_glsl[];
 extern char datatoc_probe_geom_glsl[];
 extern char datatoc_probe_vert_glsl[];
 
+extern Material defmaterial;
+
 /* Van der Corput sequence */
  /* From http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html */
 static float radical_inverse(int i) {
@@ -213,24 +216,26 @@ static void EEVEE_engine_init(void *ved)
 	}
 
 	if (!e_data.default_lit) {
-		char *lib_str = NULL;
+		char *frag_str = NULL;
 
-		DynStr *ds_vert = BLI_dynstr_new();
-		BLI_dynstr_append(ds_vert, datatoc_bsdf_common_lib_glsl);
-		BLI_dynstr_append(ds_vert, datatoc_ltc_lib_glsl);
-		BLI_dynstr_append(ds_vert, datatoc_bsdf_direct_lib_glsl);
-		lib_str = BLI_dynstr_get_cstring(ds_vert);
-		BLI_dynstr_free(ds_vert);
+		DynStr *ds_frag = BLI_dynstr_new();
+		BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_ltc_lib_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_lit_surface_frag_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl);
+		frag_str = BLI_dynstr_get_cstring(ds_frag);
+		BLI_dynstr_free(ds_frag);
 
-		e_data.default_lit = DRW_shader_create_with_lib(
-		        datatoc_lit_surface_vert_glsl, NULL, datatoc_lit_surface_frag_glsl, lib_str,
+		e_data.default_lit = DRW_shader_create(
+		        datatoc_lit_surface_vert_glsl, NULL, frag_str,
 		        "#define MAX_LIGHT 128\n"
 		        "#define MAX_SHADOW_CUBE 42\n"
 		        "#define MAX_SHADOW_MAP 64\n"
 		        "#define MAX_SHADOW_CASCADE 8\n"
 		        "#define MAX_CASCADE_NUM 4\n");
 
-		MEM_freeN(lib_str);
+		MEM_freeN(frag_str);
 	}
 
 	if (!e_data.shadow_sh) {
@@ -409,10 +414,11 @@ static void EEVEE_cache_init(void *vedata)
 	}
 
 	{
-		DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_EQUAL;
-		psl->pass = DRW_pass_create("Default Light Pass", state);
+		DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL;
+		psl->default_pass = DRW_pass_create("Default Shader Pass", state);
 
-		stl->g_data->default_lit_grp = DRW_shgroup_create(e_data.default_lit, psl->pass);
+		/* NOTE : this shading grp does not contain any geom, it's just here to setup uniforms & textures. */
+		stl->g_data->default_lit_grp = DRW_shgroup_create(e_data.default_lit, psl->default_pass);
 		DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "light_block", stl->light_ubo, 0);
 		DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "shadow_block", stl->shadow_ubo, 1);
 		DRW_shgroup_uniform_int(stl->g_data->default_lit_grp, "light_count", &stl->lamps->num_light, 1);
@@ -426,6 +432,23 @@ static void EEVEE_cache_init(void *vedata)
 	}
 
 	{
+		DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL;
+		psl->material_pass = DRW_pass_create("Material Shader Pass", state);
+
+		/* NOTE : this shading grp does not contain any geom, it's just here to setup uniforms & textures. */
+		stl->g_data->material_lit_grp = DRW_shgroup_create(e_data.default_lit, psl->material_pass);
+		DRW_shgroup_uniform_block(stl->g_data->material_lit_grp, "light_block", stl->light_ubo, 0);
+		DRW_shgroup_uniform_block(stl->g_data->material_lit_grp, "shadow_block", stl->shadow_ubo, 1);
+		DRW_shgroup_uniform_int(stl->g_data->material_lit_grp, "light_count", &stl->lamps->num_light, 1);
+		DRW_shgroup_uniform_float(stl->g_data->material_lit_grp, "lodMax", &stl->probes->lodmax, 1);
+		DRW_shgroup_uniform_vec3(stl->g_data->material_lit_grp, "shCoefs[0]", (float *)stl->probes->shcoefs, 9);
+		DRW_shgroup_uniform_vec3(stl->g_data->material_lit_grp, "cameraPos", e_data.camera_pos, 1);
+		DRW_shgroup_uniform_texture(stl->g_data->material_lit_grp, "ltcMat", e_data.ltc_mat, 0);
+		DRW_shgroup_uniform_texture(stl->g_data->material_lit_grp, "brdfLut", e_data.brdf_lut, 1);
+		DRW_shgroup_uniform_texture(stl->g_data->material_lit_grp, "probeFiltered", txl->probe_pool, 2);
+		/* NOTE : Adding Shadow Map textures uniform in EEVEE_cache_finish */
+	}
+	{
 		/* Final pass : Map HDR color to LDR color.
 		 * Write result to the default color buffer */
 		psl->tonemap = DRW_pass_create("Tone Mapping", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND);
@@ -453,7 +476,22 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
 		/* Depth Prepass */
 		DRW_shgroup_call_add((do_cull) ? stl->g_data->depth_shgrp_cull : stl->g_data->depth_shgrp, geom, ob->obmat);
 
-		DRW_shgroup_call_add(stl->g_data->default_lit_grp, geom, ob->obmat);
+		/* Get per-material split surface */
+		struct Batch **mat_geom = DRW_cache_object_surface_material_get(ob);
+		for (int i = 0; i < MAX2(1, ob->totcol); ++i) {
+			Material *ma = give_current_material(ob, i + 1);
+
+			if (ma == NULL)
+				ma = &defmaterial;
+
+			DRWShadingGroup *shgrp = DRW_shgroup_create(e_data.default_lit, psl->material_pass);
+			DRW_shgroup_uniform_vec3(shgrp, "diffuse_col", &ma->r, 1);
+			DRW_shgroup_uniform_vec3(shgrp, "specular_col", &ma->specr, 1);
+			DRW_shgroup_uniform_short(shgrp, "hardness", &ma->har, 1);
+			DRW_shgroup_call_add(shgrp, mat_geom[i], ob->obmat);
+		}
+		// GPUMaterial *gpumat = GPU_material_from_nodetree(struct bNodeTree *ntree, ListBase *gpumaterials, void *engine_type, int options)
+
 		// DRW_shgroup_call_add(stl->g_data->shadow_shgrp, geom, ob->obmat);
 		eevee_cascade_shadow_shgroup(psl, stl, geom, ob->obmat);
 		eevee_cube_shadow_shgroup(psl, stl, geom, ob->obmat);
@@ -475,6 +513,10 @@ static void EEVEE_cache_finish(void *vedata)
 	DRW_shgroup_u

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list