[Bf-blender-cvs] [f52a7a0a4c1] hair_guides_grooming: Enable groom drawing in forward shading of the workbench engine.
Lukas Tönne
noreply at git.blender.org
Fri Jun 29 12:13:41 CEST 2018
Commit: f52a7a0a4c118967c09b4a034911a9d9816935b9
Author: Lukas Tönne
Date: Fri Jun 29 11:13:11 2018 +0100
Branches: hair_guides_grooming
https://developer.blender.org/rBf52a7a0a4c118967c09b4a034911a9d9816935b9
Enable groom drawing in forward shading of the workbench engine.
===================================================================
M source/blender/draw/engines/eevee/eevee_materials.c
M source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
M source/blender/draw/engines/workbench/workbench_deferred.c
M source/blender/draw/engines/workbench/workbench_forward.c
M source/blender/draw/intern/draw_hair_fibers.c
===================================================================
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index c455669d117..e76b2636a18 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -1549,10 +1549,16 @@ static void material_hair(
}
{
- /*DRWShadingGroup *shgrp =*/ DRW_shgroup_hair_fibers_create(scene, ob, hsys, scalp, draw_set, psl->depth_pass, e_data.default_prepass_hair_fiber_sh);
+ /*DRWShadingGroup *shgrp =*/ DRW_shgroup_hair_fibers_create(
+ scene, ob, hsys, scalp, draw_set,
+ psl->depth_pass,
+ e_data.default_prepass_hair_fiber_sh);
}
{
- DRWShadingGroup *shgrp = DRW_shgroup_hair_fibers_create(scene, ob, hsys, scalp, draw_set, psl->depth_pass_clip, e_data.default_prepass_hair_fiber_clip_sh);
+ DRWShadingGroup *shgrp = DRW_shgroup_hair_fibers_create(
+ scene, ob, hsys, scalp, draw_set,
+ psl->depth_pass_clip,
+ e_data.default_prepass_hair_fiber_clip_sh);
DRW_shgroup_uniform_block(shgrp, "clip_block", sldata->clip_ubo);
}
@@ -1575,9 +1581,9 @@ static void material_hair(
case GPU_MAT_SUCCESS:
{
shgrp = DRW_shgroup_material_hair_fibers_create(
- scene, ob, hsys, scalp,
- draw_set, psl->material_pass,
- gpumat);
+ scene, ob, hsys, scalp, draw_set,
+ psl->material_pass,
+ gpumat);
add_standard_uniforms(shgrp, sldata, vedata, &ssr_id, NULL, false, false);
break;
}
diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
index fbcdfd66572..03efa4507d2 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
@@ -49,6 +49,7 @@ void main()
bool is_persp = (ProjectionMatrix[3][3] == 0.0);
# ifdef HAIR_SHADER_FIBERS
+ hairStrandID = fiber_index;
vec3 pos, tang, binor;
hair_fiber_get_vertex(
fiber_index, curve_param,
@@ -60,7 +61,7 @@ void main()
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
viewPosition = (ModelViewMatrix * vec4(pos, 1.0)).xyz;
worldPosition = (ModelMatrix * vec4(pos, 1.0)).xyz;
- hairTangent = (ModelMatrix * vec4(tang, 0.0)).xyz;
+ hairTangent = normalize((ModelMatrix * vec4(tang, 0.0)).xyz);
worldNormal = (ModelMatrix * vec4(nor, 0.0)).xyz;
viewNormal = normalize(mat3(ViewMatrix) * worldNormal);
# else
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 39c7d963bf2..e26a58a7040 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -668,6 +668,7 @@ static void workbench_cache_populate_groom(WORKBENCH_Data *vedata, Object *ob)
WORKBENCH_PassList *psl = vedata->psl;
WORKBENCH_PrivateData *wpd = stl->g_data;
const DRWContextState *draw_ctx = DRW_context_state_get();
+ struct Mesh *scalp = BKE_groom_get_scalp(draw_ctx->depsgraph, groom);
Image *image = NULL;
Material *mat = give_current_material(ob, groom->material_index);
@@ -678,14 +679,10 @@ static void workbench_cache_populate_groom(WORKBENCH_Data *vedata, Object *ob)
struct GPUShader *shader = (color_type != V3D_SHADING_TEXTURE_COLOR)
? wpd->prepass_solid_hair_fibers_sh
: wpd->prepass_texture_hair_fibers_sh;
-
- struct Mesh *scalp = BKE_groom_get_scalp(draw_ctx->depsgraph, groom);
-
DRWShadingGroup *shgrp = DRW_shgroup_hair_fibers_create(
- draw_ctx->scene, ob, groom->hair_system, scalp,
- draw_set, psl->prepass_hair_pass,
+ draw_ctx->scene, ob, groom->hair_system, scalp, draw_set,
+ psl->prepass_hair_pass,
shader);
-
DRW_shgroup_stencil_mask(shgrp, 0xFF);
DRW_shgroup_uniform_int(shgrp, "object_id", &material->object_id, 1);
DRW_shgroup_uniform_block(shgrp, "material_block", material->material_ubo);
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index 776086989df..a743f697277 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -478,6 +478,7 @@ static void workbench_forward_cache_populate_groom(WORKBENCH_Data *vedata, Objec
WORKBENCH_PassList *psl = vedata->psl;
WORKBENCH_PrivateData *wpd = stl->g_data;
const DRWContextState *draw_ctx = DRW_context_state_get();
+ struct Mesh *scalp = BKE_groom_get_scalp(draw_ctx->depsgraph, groom);
Image *image = NULL;
Material *mat = give_current_material(ob, groom->material_index);
@@ -486,34 +487,35 @@ static void workbench_forward_cache_populate_groom(WORKBENCH_Data *vedata, Objec
WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, color_type);
struct GPUShader *shader = (color_type != V3D_SHADING_TEXTURE_COLOR)
- ? wpd->transparent_accum_hair_fibers_sh
- : wpd->transparent_accum_texture_hair_fibers_sh;
-
- struct Mesh *scalp = BKE_groom_get_scalp(draw_ctx->depsgraph, groom);
-
+ ? wpd->transparent_accum_hair_fibers_sh
+ : wpd->transparent_accum_texture_hair_fibers_sh;
DRWShadingGroup *shgrp = DRW_shgroup_hair_fibers_create(
- draw_ctx->scene, ob, groom->hair_system, scalp,
- draw_set, psl->transparent_accum_pass,
+ draw_ctx->scene, ob, groom->hair_system, scalp, draw_set,
+ psl->transparent_accum_pass,
shader);
workbench_material_set_normal_world_matrix(shgrp, wpd, e_data.normal_world_matrix);
DRW_shgroup_uniform_block(shgrp, "world_block", wpd->world_ubo);
DRW_shgroup_uniform_block(shgrp, "material_block", material->material_ubo);
- DRW_shgroup_uniform_float(shgrp, "alpha", &wpd->shading.xray_alpha, 1);
+ DRW_shgroup_uniform_vec4(shgrp, "viewvecs[0]", (float *)wpd->viewvecs, 3);
+ /* Hairs have lots of layer and can rapidly become the most prominent surface.
+ * So lower their alpha artificially. */
+ float hair_alpha = wpd->shading.xray_alpha * 0.33f;
+ DRW_shgroup_uniform_float_copy(shgrp, "alpha", hair_alpha);
if (image) {
GPUTexture *tex = GPU_texture_from_blender(image, NULL, GL_TEXTURE_2D, false, 0.0f);
DRW_shgroup_uniform_texture(shgrp, "image", tex);
}
-#ifdef WORKBENCH_REVEALAGE_ENABLED
- shgrp = DRW_shgroup_hair_fibers_create(
- draw_ctx->scene, ob, groom->hair_system, scalp,
- draw_set, psl->transparent_revealage_pass,
- e_data.transparent_revealage_hair_sh);
- DRW_shgroup_uniform_float(shgrp, "alpha", &wpd->shading.xray_alpha, 1);
-#endif
+ if (STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd)) {
+ BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_EQUIRECTANGULAR_RADIANCE_GPUTEXTURE);
+ DRW_shgroup_uniform_texture(shgrp, "matcapImage", wpd->studio_light->equirectangular_radiance_gputexture);
+ }
+ if (SPECULAR_HIGHLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) {
+ DRW_shgroup_uniform_vec2(shgrp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1);
+ }
shgrp = DRW_shgroup_hair_fibers_create(
draw_ctx->scene, ob, groom->hair_system, scalp,
draw_set, vedata->psl->object_outline_pass,
- e_data.object_outline_hair_sh);
+ e_data.object_outline_hair_fibers_sh);
DRW_shgroup_uniform_int(shgrp, "object_id", &material->object_id, 1);
}
@@ -537,7 +539,7 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
}
WORKBENCH_MaterialData *material;
- if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) {
+ if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL, OB_GROOM)) {
const DRWContextState *draw_ctx = DRW_context_state_get();
const bool is_active = (ob == draw_ctx->obact);
const bool is_sculpt_mode = is_active && (draw_ctx->object_mode & OB_MODE_SCULPT) != 0;
diff --git a/source/blender/draw/intern/draw_hair_fibers.c b/source/blender/draw/intern/draw_hair_fibers.c
index 622a791ead9..eccd65cd507 100644
--- a/source/blender/draw/intern/draw_hair_fibers.c
+++ b/source/blender/draw/intern/draw_hair_fibers.c
@@ -48,12 +48,13 @@ const char* DRW_hair_shader_defines(void)
}
static DRWShadingGroup *drw_shgroup_create_hair_fibers_ex(
- Scene *UNUSED(scene), Object *object, HairSystem *hsys, struct Mesh *scalp,
+ Scene *scene, Object *object, HairSystem *hsys, struct Mesh *scalp,
const HairDrawSettings *draw_set, DRWPass *hair_pass,
struct GPUMaterial *gpu_mat, GPUShader *gpu_shader)
{
/* TODO */
const int subdiv = 0;
+ int thickness_res = (scene->r.hair_type == SCE_HAIR_SHAPE_STRAND) ? 1 : 2;
HairExportCache *hair_export = BKE_hair_export_cache_new();
BKE_hair_export_cache_update(hair_export, hsys, subdiv, scalp, HAIR_EXPORT_ALL);
@@ -85,6 +86,7 @@ static DRWShadingGroup *drw_shgroup_create_hair_fibers_ex(
DRW_shgroup_uniform_int(shgrp, "strand_vertex_start", &fiber_buffer->strand_vertex_start, 1);
DRW_shgroup_uniform_int(shgrp, "fiber_start", &fiber_buffer->fiber_start, 1);
+ DRW_shgroup_uniform_int_copy(shgrp, "hairThicknessRes", thickness_res);
DRW_shgroup_uniform_float(shgrp, "hairRadShape", &draw_set->shape, 1);
DRW_shgroup_uniform_float_copy(shgrp, "hairRadRoot", draw_set->root_radius * draw_set->radius_scale* 0.5f);
DRW_shgroup_uniform_float_copy(shgrp, "hairRadTip", draw_set->tip_radius * draw_set->radius_scale * 0.5f);
More information about the Bf-blender-cvs
mailing list