[Bf-blender-cvs] [197af58baab] blender2.8: Workbench: Cleaner Shadow edges own shadow
Jeroen Bakker
noreply at git.blender.org
Tue May 15 15:43:26 CEST 2018
Commit: 197af58baab1c1be7e6f371a829b31f5c1098a73
Author: Jeroen Bakker
Date: Tue May 15 15:19:57 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB197af58baab1c1be7e6f371a829b31f5c1098a73
Workbench: Cleaner Shadow edges own shadow
===================================================================
M release/scripts/startup/bl_ui/properties_scene.py
M source/blender/blenkernel/intern/scene.c
M source/blender/blenloader/intern/versioning_280.c
M source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
M source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
M source/blender/draw/engines/workbench/workbench_materials.c
M source/blender/draw/engines/workbench/workbench_private.h
M source/blender/draw/engines/workbench/workbench_studiolight.c
M source/blender/gpu/intern/gpu_texture.c
M source/blender/makesdna/DNA_scene_types.h
M source/blender/makesrna/intern/rna_scene.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index cf17adfe5c1..545d0d696dc 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -441,6 +441,7 @@ class SCENE_PT_viewport_display(SceneButtonsPanel, Panel):
layout = self.layout
scene = context.scene
layout.prop(scene.display, "light_direction", text="")
+ layout.prop(scene.display, "shadow_shift")
class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel):
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index f95da4f723f..5fde2db0d15 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -824,6 +824,7 @@ void BKE_scene_init(Scene *sce)
/* SceneDisplay */
copy_v3_v3(sce->display.light_direction, (float[3]){-M_SQRT1_3, -M_SQRT1_3, M_SQRT1_3});
+ sce->display.shadow_shift = 0.1;
}
Scene *BKE_scene_add(Main *bmain, const char *name)
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 08cb81bb357..2af10d3faf6 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -1085,6 +1085,11 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
copy_v3_v3(scene->display.light_direction, (float[3]){-M_SQRT1_3, -M_SQRT1_3, M_SQRT1_3});
}
}
+ if (!DNA_struct_elem_find(fd->filesdna, "SceneDisplay", "float", "shadow_shift")) {
+ for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
+ scene->display.shadow_shift = 0.1;
+ }
+ }
if (!DNA_struct_elem_find(fd->filesdna, "Object", "ObjectDisplay", "display")) {
/* Initialize new object.ObjectDisplay */
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
index 7f7e8f9c69c..09bdffe3299 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -7,6 +7,10 @@ uniform sampler2D normalBuffer;
uniform vec2 invertedViewportSize;
uniform vec3 objectOverlapColor = vec3(0.0);
uniform float shadowMultiplier;
+uniform float lightMultiplier;
+uniform float shadowShift = 0.1;
+
+uniform vec3 lightDirection; /* light direction in view space */
layout(std140) uniform world_block {
WorldData world_data;
@@ -38,29 +42,42 @@ void main()
}
#endif /* !V3D_SHADING_OBJECT_OVERLAP */
-
-#ifdef V3D_LIGHTING_STUDIO
vec4 diffuse_color = texelFetch(colorBuffer, texel, 0);
+/* Do we need normals */
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
#ifdef WORKBENCH_ENCODE_NORMALS
vec3 normal_viewport = normal_decode(texelFetch(normalBuffer, texel, 0).rg);
if (diffuse_color.a == 1.0) {
- normal_viewport = - normal_viewport;
+ normal_viewport = -normal_viewport;
}
#else /* WORKBENCH_ENCODE_NORMALS */
vec3 normal_viewport = texelFetch(normalBuffer, texel, 0).rgb;
#endif /* WORKBENCH_ENCODE_NORMALS */
+#endif
+
+
+#ifdef V3D_LIGHTING_STUDIO
vec3 diffuse_light = get_world_diffuse_light(world_data, normal_viewport);
- vec3 shaded_color = diffuse_light * diffuse_color.rgb * (1.0 - shadowMultiplier);
+ vec3 shaded_color = diffuse_light * diffuse_color.rgb;
#else /* V3D_LIGHTING_STUDIO */
- vec3 diffuse_color = texelFetch(colorBuffer, texel, 0).rgb;
- vec3 shaded_color = diffuse_color * (1.0 - shadowMultiplier);
+ vec3 shaded_color = diffuse_color.rgb;
+
#endif /* V3D_LIGHTING_STUDIO */
+#ifdef V3D_SHADING_SHADOW
+ float shadow_mix = step(-shadowShift, dot(normal_viewport, lightDirection));
+ float light_multiplier;
+ light_multiplier = mix(lightMultiplier, shadowMultiplier, shadow_mix);
+
+#else /* V3D_SHADING_SHADOW */
+ float light_multiplier = 1.0;
+#endif /* V3D_SHADING_SHADOW */
+
+ shaded_color *= light_multiplier;
#ifdef V3D_SHADING_OBJECT_OVERLAP
shaded_color = mix(objectOverlapColor, shaded_color, object_overlap);
#endif /* V3D_SHADING_OBJECT_OVERLAP */
-
fragColor = vec4(shaded_color, 1.0);
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index 54c5bce4271..2cc0ff3723d 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -4,22 +4,22 @@ uniform vec3 object_color = vec3(1.0, 0.0, 1.0);
uniform sampler2D image;
#endif
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
in vec3 normal_viewport;
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
#ifdef OB_TEXTURE
in vec2 uv_interp;
#endif /* OB_TEXTURE */
layout(location=0) out uint objectId;
layout(location=1) out vec4 diffuseColor;
-#ifdef V3D_LIGHTING_STUDIO
-#ifdef WORKBENCH_ENCODE_NORMALS
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
+ #ifdef WORKBENCH_ENCODE_NORMALS
layout(location=2) out vec2 normalViewport;
-#else /* WORKBENCH_ENCODE_NORMALS */
+ #else /* WORKBENCH_ENCODE_NORMALS */
layout(location=2) out vec3 normalViewport;
-#endif /* WORKBENCH_ENCODE_NORMALS */
-#endif /* V3D_LIGHTING_STUDIO */
+ #endif /* WORKBENCH_ENCODE_NORMALS */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
void main()
{
@@ -31,18 +31,18 @@ void main()
diffuseColor = texture(image, uv_interp);
#endif /* OB_TEXTURE */
-#ifdef V3D_LIGHTING_STUDIO
-#ifdef WORKBENCH_ENCODE_NORMALS
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
+ #ifdef WORKBENCH_ENCODE_NORMALS
if (!gl_FrontFacing) {
- normalViewport = normal_encode(-normal_viewport);
+ normalViewport = normal_encode(normalize(-normal_viewport));
diffuseColor.a = 1.0;
}
else {
- normalViewport = normal_encode(normal_viewport);
+ normalViewport = normal_encode(normalize(normal_viewport));
diffuseColor.a = 0.0;
}
-#else /* WORKBENCH_ENCODE_NORMALS */
+ #else /* WORKBENCH_ENCODE_NORMALS */
normalViewport = normal_viewport;
-#endif /* WORKBENCH_ENCODE_NORMALS */
-#endif /* V3D_LIGHTING_STUDIO */
+ #endif /* WORKBENCH_ENCODE_NORMALS */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
index 22b16bf1d6a..f2df117d897 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -1,19 +1,19 @@
uniform mat4 ModelViewProjectionMatrix;
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
uniform mat3 NormalMatrix;
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
in vec3 pos;
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
in vec3 nor;
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
#ifdef OB_TEXTURE
in vec2 uv;
#endif
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
out vec3 normal_viewport;
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
#ifdef OB_TEXTURE
out vec2 uv_interp;
#endif
@@ -23,8 +23,8 @@ void main()
#ifdef OB_TEXTURE
uv_interp = uv;
#endif
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
normal_viewport = normalize(NormalMatrix * nor);
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
index 7322266a956..8ef1a8b589b 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
@@ -1,4 +1,4 @@
-#define EPSILON 0.000001
+#define EPSILON 0.0001
#define INFINITE 100.0
uniform mat4 ModelMatrixInverse;
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index f4b9a0a3e53..0f21b76b4d2 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -61,7 +61,8 @@ static struct {
struct GPUTexture *normal_buffer_tx; /* ref only, not alloced */
struct GPUTexture *composite_buffer_tx; /* ref only, not alloced */
- float light_direction[3]; /* world light direction for shadows */
+ SceneDisplay display; /* world light direction for shadows */
+ float light_direction_vs[3];
int next_object_id;
} e_data = {{NULL}};
@@ -82,8 +83,12 @@ extern char datatoc_workbench_world_light_lib_glsl[];
extern DrawEngineType draw_engine_workbench_solid;
#define OBJECT_ID_PASS_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_OBJECT_OVERLAP)
-#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (wpd->shading.light & V3D_LIGHTING_STUDIO)
+#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (wpd->shading.light & V3D_LIGHTING_STUDIO || wpd->shading.flag & V3D_SHADING_SHADOW)
#define SHADOW_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_SHADOW)
+#define NORMAL_ENCODING_ENABLED() (true)
+//(!SHADOW_ENABLED(wpd))
+
+
static char *workbench_build_defines(WORKBENCH_PrivateData *wpd, int drawtype)
{
char *str = NULL;
@@ -93,9 +98,15 @@ static char *workbench_build_defines(WORKBENCH_PrivateData *wpd, int drawtype)
if (wpd->shading.flag & V3D_SHADING_OBJECT_OVERLAP) {
BLI_dynstr_appendf(ds, "#define V3D_SHADING_OBJECT_OVERLAP\n");
}
+ if (wpd->shading.flag & V3D_SHADING_SHADOW) {
+ BLI_dynstr_appendf(ds, "#define V3D_SHADING_SHADOW\n");
+ }
if (wpd->shading.light & V3D_LIGHTING_STUDIO) {
BLI_dynstr_appendf(ds, "#define V3D_LIGHTING_STUDIO\n");
}
+ if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) {
+ BLI_dynstr_appendf(ds, "#define NORMAL_VIEWPORT_PASS_ENABLED\n");
+ }
switch (drawtype) {
case OB_SOLID:
BLI_dynstr_appendf(ds, "#define OB_SOLID\n");
@@ -105,9 +116,9 @@ static char *workbench_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list