Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2017-07-11 02:10:57 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-07-11 13:39:35 +0300
commit91d324b3dcf1e5ecff133ff3c27ba5e1f0849209 (patch)
tree033a2d0d7e04963f101ff0f8489f5720842308ec /source/blender/draw/engines/eevee/eevee_materials.c
parenta57bc75576e780797a60e2240a12f49247ca9505 (diff)
Eevee: Transparency: Add support for Clip and Stochastic shadows.
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_materials.c')
-rw-r--r--source/blender/draw/engines/eevee/eevee_materials.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index bd6c4b9ccc0..ab56b908416 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -94,9 +94,8 @@ extern char datatoc_irradiance_lib_glsl[];
extern char datatoc_octahedron_lib_glsl[];
extern char datatoc_lit_surface_frag_glsl[];
extern char datatoc_lit_surface_vert_glsl[];
-extern char datatoc_shadow_frag_glsl[];
-extern char datatoc_shadow_geom_glsl[];
extern char datatoc_shadow_vert_glsl[];
+extern char datatoc_shadow_geom_glsl[];
extern char datatoc_lightprobe_geom_glsl[];
extern char datatoc_lightprobe_vert_glsl[];
extern char datatoc_background_vert_glsl[];
@@ -203,6 +202,9 @@ static char *eevee_get_defines(int options)
if ((options & VAR_MAT_CLIP) != 0) {
BLI_dynstr_appendf(ds, "#define USE_ALPHA_CLIP\n");
}
+ if ((options & VAR_MAT_SHADOW) != 0) {
+ BLI_dynstr_appendf(ds, "#define SHADOW_SHADER\n");
+ }
if ((options & VAR_MAT_HASH) != 0) {
BLI_dynstr_appendf(ds, "#define USE_ALPHA_HASH\n");
}
@@ -503,7 +505,9 @@ struct GPUMaterial *EEVEE_material_mesh_get(
return mat;
}
-struct GPUMaterial *EEVEE_material_mesh_depth_get(struct Scene *scene, Material *ma, bool use_hashed_alpha)
+struct GPUMaterial *EEVEE_material_mesh_depth_get(
+ struct Scene *scene, Material *ma,
+ bool use_hashed_alpha, bool is_shadow)
{
const void *engine = &DRW_engine_viewport_eevee_type;
int options = VAR_MAT_MESH;
@@ -515,6 +519,9 @@ struct GPUMaterial *EEVEE_material_mesh_depth_get(struct Scene *scene, Material
options |= VAR_MAT_CLIP;
}
+ if (is_shadow)
+ options |= VAR_MAT_SHADOW;
+
GPUMaterial *mat = GPU_material_from_nodetree_find(&ma->gpumaterial, engine, options);
if (mat) {
return mat;
@@ -530,7 +537,9 @@ struct GPUMaterial *EEVEE_material_mesh_depth_get(struct Scene *scene, Material
mat = GPU_material_from_nodetree(
scene, ma->nodetree, &ma->gpumaterial, engine, options,
- datatoc_lit_surface_vert_glsl, NULL, frag_str,
+ (is_shadow) ? datatoc_shadow_vert_glsl : datatoc_lit_surface_vert_glsl,
+ (is_shadow) ? datatoc_shadow_geom_glsl : NULL,
+ frag_str,
defines);
MEM_freeN(frag_str);
@@ -758,7 +767,7 @@ static void material_opaque(
*gpumat = (use_gpumat) ? EEVEE_material_mesh_get(
scene, ma, stl->effects->use_ao, stl->effects->use_bent_normals, false, false) : NULL;
*gpumat_depth = (use_gpumat) ? EEVEE_material_mesh_depth_get(
- scene, ma, (ma->blend_method == MA_BM_HASHED)) : NULL;
+ scene, ma, (ma->blend_method == MA_BM_HASHED), false) : NULL;
return;
}
@@ -784,7 +793,7 @@ static void material_opaque(
* fail the depth test for shading. */
if (ELEM(ma->blend_method, MA_BM_CLIP, MA_BM_HASHED)) {
*gpumat_depth = EEVEE_material_mesh_depth_get(scene, ma,
- (ma->blend_method == MA_BM_HASHED));
+ (ma->blend_method == MA_BM_HASHED), false);
*shgrp_depth = DRW_shgroup_material_create(*gpumat_depth, do_cull ? psl->depth_pass_cull : psl->depth_pass);
*shgrp_depth_clip = DRW_shgroup_material_create(*gpumat_depth, do_cull ? psl->depth_pass_clip_cull : psl->depth_pass_clip);
@@ -911,6 +920,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
const DRWContextState *draw_ctx = DRW_context_state_get();
+ Scene *scene = draw_ctx->scene;
GHash *material_hash = stl->g_data->material_hash;
IDProperty *ces_mode_ob = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_OBJECT, "");
@@ -974,6 +984,11 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
struct Gwn_Batch **mat_geom = DRW_cache_object_surface_material_get(ob, gpumat_array, materials_len);
if (mat_geom) {
for (int i = 0; i < materials_len; ++i) {
+ Material *ma = give_current_material(ob, i + 1);
+
+ if (ma == NULL)
+ ma = &defmaterial;
+
/* Shading pass */
ADD_SHGROUP_CALL(shgrp_array[i], ob, mat_geom[i]);
@@ -982,7 +997,16 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
ADD_SHGROUP_CALL_SAFE(shgrp_depth_clip_array[i], ob, mat_geom[i]);
/* Shadow Pass */
- EEVEE_lights_cache_shcaster_add(sldata, psl, mat_geom[i], ob->obmat);
+ if (ma->blend_method == MA_BM_SOLID)
+ EEVEE_lights_cache_shcaster_add(sldata, psl, mat_geom[i], ob->obmat);
+ else if (ma->blend_method == MA_BM_HASHED) {
+ struct GPUMaterial *gpumat = EEVEE_material_mesh_depth_get(scene, ma, true, true);
+ EEVEE_lights_cache_shcaster_material_add(sldata, psl, gpumat, mat_geom[i], ob->obmat, NULL);
+ }
+ else if (ma->blend_method == MA_BM_CLIP) {
+ struct GPUMaterial *gpumat = EEVEE_material_mesh_depth_get(scene, ma, false, true);
+ EEVEE_lights_cache_shcaster_material_add(sldata, psl, gpumat, mat_geom[i], ob->obmat, &ma->alpha_threshold);
+ }
}
}
}
@@ -1026,7 +1050,6 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
}
else {
if (ma->use_nodes && ma->nodetree) {
- Scene *scene = draw_ctx->scene;
struct GPUMaterial *gpumat = EEVEE_material_hair_get(scene, ma,
stl->effects->use_ao, stl->effects->use_bent_normals);