[Bf-blender-cvs] [e8ff620325e] strand_editmode: Moved the hair fiber shader from strand edit mode into Eevee.

Lukas Tönne noreply at git.blender.org
Wed Aug 2 22:41:19 CEST 2017


Commit: e8ff620325eb1399cd30f9c3a8d07e8fe8b56811
Author: Lukas Tönne
Date:   Tue Aug 1 22:07:18 2017 +0100
Branches: strand_editmode
https://developer.blender.org/rBe8ff620325eb1399cd30f9c3a8d07e8fe8b56811

Moved the hair fiber shader from strand edit mode into Eevee.

This allows the shader to use proper lighting from the standard Eevee shaders.

The code for interpolating hair strands is in a glsl library file to facilitate
use in other engines later.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/eevee/eevee_private.h
A	source/blender/draw/engines/eevee/shaders/hair_lib.glsl
M	source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
M	source/blender/draw/engines/eevee/shaders/prepass_vert.glsl
M	source/blender/draw/modes/edit_strands_mode.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 7a96752a5a3..b4527361615 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -122,6 +122,7 @@ data_to_c_simple(engines/eevee/shaders/default_world_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/background_vert.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/ambient_occlusion_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/effect_minmaxz_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/hair_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lamps_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lightprobe_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 2f01a5fd966..1c937cac92e 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -33,11 +33,13 @@
 #include "BLI_ghash.h"
 #include "BLI_alloca.h"
 
+#include "BKE_editstrands.h"
 #include "BKE_particle.h"
 #include "BKE_paint.h"
 #include "BKE_pbvh.h"
 
 #include "GPU_material.h"
+#include "GPU_texture.h"
 
 #include "eevee_engine.h"
 #include "eevee_lut.h"
@@ -70,6 +72,8 @@ static struct {
 
 	struct GPUShader *default_prepass_sh;
 	struct GPUShader *default_prepass_clip_sh;
+	struct GPUShader *default_prepass_hair_fiber_sh;
+	struct GPUShader *default_prepass_hair_fiber_clip_sh;
 	struct GPUShader *default_lit[VAR_MAT_MAX];
 
 	struct GPUShader *default_background;
@@ -103,6 +107,7 @@ extern char datatoc_lightprobe_geom_glsl[];
 extern char datatoc_lightprobe_vert_glsl[];
 extern char datatoc_background_vert_glsl[];
 extern char datatoc_volumetric_frag_glsl[];
+extern char datatoc_hair_lib_glsl[];
 
 extern Material defmaterial;
 extern GlobalsUboStorage ts;
@@ -190,6 +195,9 @@ static char *eevee_get_defines(int options)
 	if ((options & VAR_MAT_HAIR) != 0) {
 		BLI_dynstr_appendf(ds, "#define HAIR_SHADER\n");
 	}
+	if ((options & VAR_MAT_HAIR_FIBERS) != 0) {
+		BLI_dynstr_appendf(ds, "#define HAIR_SHADER_FIBERS\n");
+	}
 	if ((options & VAR_MAT_PROBE) != 0) {
 		BLI_dynstr_appendf(ds, "#define PROBE_CAPTURE\n");
 	}
@@ -282,57 +290,84 @@ static void add_standard_uniforms(DRWShadingGroup *shgrp, EEVEE_SceneLayerData *
 
 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 *vert_str = NULL;
+	{
+		DynStr *ds_vert = BLI_dynstr_new();
+		BLI_dynstr_append(ds_vert, datatoc_hair_lib_glsl);
+		BLI_dynstr_append(ds_vert, datatoc_lit_surface_vert_glsl);
+		vert_str = BLI_dynstr_get_cstring(ds_vert);
+		BLI_dynstr_free(ds_vert);
+	}
+
+	char *frag_str = NULL;
+	{
+		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);
+		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);
+	e_data.default_lit[options] = DRW_shader_create(vert_str, NULL, frag_str, defines);
 
 	MEM_freeN(defines);
+	MEM_freeN(vert_str);
 	MEM_freeN(frag_str);
 }
 
 void EEVEE_materials_init(EEVEE_StorageList *stl)
 {
 	if (!e_data.frag_shader_lib) {
-		char *frag_str = NULL;
-
 		/* Shaders */
-		DynStr *ds_frag = BLI_dynstr_new();
-		BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_ambient_occlusion_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_octahedron_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_irradiance_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_lightprobe_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_lamps_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_lit_surface_frag_glsl);
-		e_data.frag_shader_lib = BLI_dynstr_get_cstring(ds_frag);
-		BLI_dynstr_free(ds_frag);
+		{
+			DynStr *ds_frag = BLI_dynstr_new();
+			BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
+			BLI_dynstr_append(ds_frag, datatoc_ambient_occlusion_lib_glsl);
+			BLI_dynstr_append(ds_frag, datatoc_octahedron_lib_glsl);
+			BLI_dynstr_append(ds_frag, datatoc_irradiance_lib_glsl);
+			BLI_dynstr_append(ds_frag, datatoc_lightprobe_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_lamps_lib_glsl);
+			BLI_dynstr_append(ds_frag, datatoc_lit_surface_frag_glsl);
+			e_data.frag_shader_lib = BLI_dynstr_get_cstring(ds_frag);
+			BLI_dynstr_free(ds_frag);
+		}
+		
+		{
+			DynStr *ds_frag = BLI_dynstr_new();
+			BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
+			BLI_dynstr_append(ds_frag, datatoc_ambient_occlusion_lib_glsl);
+			BLI_dynstr_append(ds_frag, datatoc_octahedron_lib_glsl);
+			BLI_dynstr_append(ds_frag, datatoc_irradiance_lib_glsl);
+			BLI_dynstr_append(ds_frag, datatoc_lightprobe_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_lamps_lib_glsl);
+			BLI_dynstr_append(ds_frag, datatoc_volumetric_frag_glsl);
+			e_data.volume_shader_lib = BLI_dynstr_get_cstring(ds_frag);
+			BLI_dynstr_free(ds_frag);
+		}
 
-		ds_frag = BLI_dynstr_new();
-		BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_ambient_occlusion_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_octahedron_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_irradiance_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_lightprobe_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_lamps_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_volumetric_frag_glsl);
-		e_data.volume_shader_lib = BLI_dynstr_get_cstring(ds_frag);
-		BLI_dynstr_free(ds_frag);
+		char *hair_fiber_vert_str = NULL;
+		{
+			DynStr *ds_vert = BLI_dynstr_new();
+			BLI_dynstr_append(ds_vert, datatoc_hair_lib_glsl);
+			BLI_dynstr_append(ds_vert, datatoc_prepass_vert_glsl);
+			hair_fiber_vert_str = BLI_dynstr_get_cstring(ds_vert);
+			BLI_dynstr_free(ds_vert);
+		}
 
-		ds_frag = BLI_dynstr_new();
-		BLI_dynstr_append(ds_frag, e_data.frag_shader_lib);
-		BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl);
-		frag_str = BLI_dynstr_get_cstring(ds_frag);
-		BLI_dynstr_free(ds_frag);
+		char *frag_str = NULL;
+		{
+			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);
+			frag_str = BLI_dynstr_get_cstring(ds_frag);
+			BLI_dynstr_free(ds_frag);
+		}
 
 		e_data.default_background = DRW_shader_create_fullscreen(
 		        datatoc_default_world_frag_glsl, NULL);
@@ -345,7 +380,16 @@ void EEVEE_materials_init(EEVEE_StorageList *stl)
 		        datatoc_prepass_vert_glsl, NULL, datatoc_prepass_frag_glsl,
 		        "#define CLIP_PLANES\n");
 
+		e_data.default_prepass_hair_fiber_sh = DRW_shader_create(
+		        hair_fiber_vert_str, NULL, datatoc_prepass_frag_glsl,
+		        "#define HAIR_SHADER\n#define HAIR_SHADER_FIBERS\n");
+
+		e_data.default_prepass_hair_fiber_clip_sh = DRW_shader_create(
+		        hair_fiber_vert_str, NULL, datatoc_prepass_frag_glsl,
+		        "#define HAIR_SHADER\n#define HAIR_SHADER_FIBERS\n#define CLIP_PLANES\n");
+
 		MEM_freeN(frag_str);
+		MEM_freeN(hair_fiber_vert_str);
 
 		/* Textures */
 		const int layers = 3;
@@ -553,11 +597,13 @@ struct GPUMaterial *EEVEE_material_mesh_depth_get(
 
 struct GPUMaterial *EEVEE_material_hair_get(
         struct Scene *scene, Material *ma,
-        bool use_ao, bool use_bent_normals)
+        bool use_fibers, bool use_ao, bool use_bent_normals)
 {
 	const void *engine = &DRW_engine_viewport_eevee_type;
-	int options = VAR_MAT_MESH | VAR_MAT_HAIR;
-
+	int options = VAR_MAT_HAIR | VAR_MAT_MESH;
+	if (use_fibers) {
+		options |= VAR_MAT_HAIR_FIBERS;
+	}
 	if (use_ao) options |= VAR_MAT_AO;
 	if (use_bent_normals) options |= VAR_MAT_BENT;
 
@@ -566,13 +612,23 @@ struct GPUMaterial *EEVEE_material_hair_get(
 		return mat;
 	}
 
+	char *vert_str = NULL;
+	{
+		DynStr *ds_vert = BLI_dynstr_new();
+		BLI_dynstr_append(ds_vert, datatoc_hair_lib_glsl);
+		BLI_dynstr_append(ds_vert, datatoc_lit_surface_vert_glsl);
+		vert_str = BLI_dynstr_get_cstring(ds_vert);
+		BLI_dynstr_free(ds_vert);
+	}
+
 	char *defines = eevee_get_defines(options);
 
 	mat = GPU_material_from_nodetree(
 	        scene, ma->nodetree, &ma->gpumaterial, engine, options,
-	        datatoc_lit_surface_vert_glsl, NULL, e_data.frag_shader_lib,
+	        vert_str, NULL, e_data.frag_shader_lib,
 	        defines);
 
+	MEM_freeN(vert_str);
 	MEM_freeN(defines);
 
 	return mat;
@@ -583,11 +639,12 @@ struct GPUMaterial *EEVEE_material_hair_get(
  **/
 static struct DRWShadingGroup *EEVEE_default_shading_group_create(
         EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata, DRWPass *pass,
-        bool is_hair, bool is_flat_normal, bool use_ao, bool use_bent_normals, bool use_blend)
+        bool is_hair, bool is_hair_fibers, bool is_flat_normal, bool use_ao, bool use_bent_normals, bool use_blend)
 {
 	int options = VAR_MAT_MESH;
 
 	if (is_hair) options |= VAR_MAT_HAIR;
+	if (is_hair_fibers) options |= VAR_MAT_HAIR_FIBERS;
 	if (use_ao) options |= VAR_MAT_AO;
 	if (use_bent_normals) options |= VAR_MAT_BENT;
 	if (is_flat_normal) options |= VAR_MAT_FLAT;
@@ -608,11 +665,12 @@ static struct DRWShadingGroup *EEVEE_default_shading_group_create(
  **/
 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)
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list