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>2018-11-30 03:53:50 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-11-30 04:02:36 +0300
commit6a4f5f6eb44b3dacff51ae8c152689e8ddf6e7b2 (patch)
tree1fb36d73470fa35a7029c0bd4fe8a9cc3ca992ff /source/blender/draw/engines/workbench/shaders
parente1023014f4d28bd74dc2f44845ed04669b51caa5 (diff)
Workbench: Cleanups & Simplifications
* Move the curvature computation to the cavity pass: One can argue it's not the best performance wise (it gets a tiny perf pernalty if it is done alone without the ssao), but it make the code cleaner and reduce considerably the number of shader variation possible. * Lower shader variation to 2^8 instead of 2^12
Diffstat (limited to 'source/blender/draw/engines/workbench/shaders')
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl19
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl2
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl47
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl15
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl6
5 files changed, 49 insertions, 40 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
index fafb164a694..b52d7d31e61 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
@@ -3,6 +3,7 @@ out vec4 fragColor;
uniform sampler2D depthBuffer;
uniform sampler2D colorBuffer;
uniform sampler2D normalBuffer;
+uniform usampler2D objectId;
uniform vec2 invertedViewportSize;
uniform mat4 WinMatrix; /* inverse WinMatrix */
@@ -10,6 +11,7 @@ uniform mat4 WinMatrix; /* inverse WinMatrix */
uniform vec4 viewvecs[3];
uniform vec4 ssao_params;
uniform vec4 ssao_settings;
+uniform vec2 curvature_settings;
uniform sampler2D ssao_jitter;
layout(std140) uniform samples_block {
@@ -23,7 +25,7 @@ layout(std140) uniform samples_block {
#define ssao_distance ssao_settings.x
#define ssao_factor_cavity ssao_settings.y
#define ssao_factor_edge ssao_settings.z
-#define ssao_attenuation ssao_settings.a
+#define ssao_attenuation ssao_settings.w
vec3 get_view_space_from_depth(in vec2 uvcoords, in float depth)
{
@@ -54,6 +56,9 @@ void main()
vec2 screenco = vec2(gl_FragCoord.xy) * invertedViewportSize;
ivec2 texel = ivec2(gl_FragCoord.xy);
+ float cavity = 0.0, edges = 0.0, curvature = 0.0;
+
+#ifdef USE_CAVITY
float depth = texelFetch(depthBuffer, texel, 0).x;
vec3 position = get_view_space_from_depth(screenco, depth);
@@ -63,8 +68,16 @@ void main()
normal_viewport = -normal_viewport;
}
- float cavity = 0.0, edges = 0.0;
+
ssao_factors(depth, normal_viewport, position, screenco, cavity, edges);
+#endif
+
+#ifdef USE_CURVATURE
+ curvature = calculate_curvature(objectId, normalBuffer, texel, curvature_settings.x, curvature_settings.y);
+#endif
+
+ float final_cavity_factor = clamp((1.0 - cavity) * (1.0 + edges) * (1.0 + curvature), 0.0, 4.0);
- fragColor = vec4(cavity, edges, 0.0, 1.0);
+ /* Using UNORM render target so compress the range. */
+ fragColor = vec4(final_cavity_factor / CAVITY_BUFFER_RANGE);
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
index c56e02e72d6..982c3821030 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -2,6 +2,8 @@
#define EPSILON 0.00001
#define M_PI 3.14159265358979323846
+#define CAVITY_BUFFER_RANGE 4.0
+
/* 4x4 bayer matrix prepared for 8bit UNORM precision error. */
#define P(x) (((x + 0.5) * (1.0 / 16.0) - 0.5) * (1.0 / 255.0))
const vec4 dither_mat4x4[4] = vec4[4](
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
index 6b693675f84..53315b8c132 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
@@ -4,37 +4,40 @@
float curvature_soft_clamp(float curvature, float control)
{
- if (curvature < 0.5 / control)
- return curvature * (1.0 - curvature * control);
- return 0.25 / control;
+ if (curvature < 0.5 / control) {
+ return curvature * (1.0 - curvature * control);
+ }
+ return 0.25 / control;
}
float calculate_curvature(usampler2D objectId, sampler2D normalBuffer, ivec2 texel, float ridge, float valley)
{
- uint object_up = texelFetchOffset(objectId, texel, 0, ivec2(0, CURVATURE_OFFSET)).r;
- uint object_down = texelFetchOffset(objectId, texel, 0, ivec2(0, -CURVATURE_OFFSET)).r;
- uint object_left = texelFetchOffset(objectId, texel, 0, ivec2(-CURVATURE_OFFSET, 0)).r;
- uint object_right = texelFetchOffset(objectId, texel, 0, ivec2( CURVATURE_OFFSET, 0)).r;
+ uint object_up = texelFetchOffset(objectId, texel, 0, ivec2(0, CURVATURE_OFFSET)).r;
+ uint object_down = texelFetchOffset(objectId, texel, 0, ivec2(0, -CURVATURE_OFFSET)).r;
+ uint object_left = texelFetchOffset(objectId, texel, 0, ivec2(-CURVATURE_OFFSET, 0)).r;
+ uint object_right = texelFetchOffset(objectId, texel, 0, ivec2( CURVATURE_OFFSET, 0)).r;
- if((object_up != object_down) || (object_right != object_left)) {
- return 0.0;
- }
+ if((object_up != object_down) || (object_right != object_left)) {
+ return 0.0;
+ }
- vec2 normal_up = texelFetchOffset(normalBuffer, texel, 0, ivec2(0, CURVATURE_OFFSET)).rg;
- vec2 normal_down = texelFetchOffset(normalBuffer, texel, 0, ivec2(0, -CURVATURE_OFFSET)).rg;
- vec2 normal_left = texelFetchOffset(normalBuffer, texel, 0, ivec2(-CURVATURE_OFFSET, 0)).rg;
- vec2 normal_right = texelFetchOffset(normalBuffer, texel, 0, ivec2( CURVATURE_OFFSET, 0)).rg;
+ vec2 normal_up = texelFetchOffset(normalBuffer, texel, 0, ivec2(0, CURVATURE_OFFSET)).rg;
+ vec2 normal_down = texelFetchOffset(normalBuffer, texel, 0, ivec2(0, -CURVATURE_OFFSET)).rg;
+ vec2 normal_left = texelFetchOffset(normalBuffer, texel, 0, ivec2(-CURVATURE_OFFSET, 0)).rg;
+ vec2 normal_right = texelFetchOffset(normalBuffer, texel, 0, ivec2( CURVATURE_OFFSET, 0)).rg;
#ifdef WORKBENCH_ENCODE_NORMALS
- normal_up = normal_decode(normal_up ).rg;
- normal_down = normal_decode(normal_down ).rg;
- normal_left = normal_decode(normal_left ).rg;
- normal_right = normal_decode(normal_right).rg;
+ normal_up = normal_decode(normal_up ).rg;
+ normal_down = normal_decode(normal_down ).rg;
+ normal_left = normal_decode(normal_left ).rg;
+ normal_right = normal_decode(normal_right).rg;
#endif
- float normal_diff = ((normal_up.g - normal_down.g) + (normal_right.r - normal_left.r));
+ float normal_diff = ((normal_up.g - normal_down.g) + (normal_right.r - normal_left.r));
- if (normal_diff < 0)
- return -2.0 * curvature_soft_clamp(-normal_diff, valley);
- return 2.0 * curvature_soft_clamp(normal_diff, ridge);
+ if (normal_diff < 0) {
+ return -2.0 * curvature_soft_clamp(-normal_diff, valley);
+ }
+
+ return 2.0 * curvature_soft_clamp(normal_diff, ridge);
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
index 54475715d07..310169bdf5d 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
@@ -74,9 +74,8 @@ void main()
#elif defined(V3D_LIGHTING_MATCAP)
bool flipped = world_data.matcap_orientation != 0;
vec2 matcap_uv = matcap_uv_compute(I_vs, normal_viewport, flipped);
- vec3 object_color = texelFetch(specularBuffer, texel, 0).rgb;
vec3 matcap = textureLod(matcapImage, matcap_uv, 0.0).rgb;
- vec3 shaded_color = matcap * object_color;
+ vec3 shaded_color = matcap * diffuse_color.rgb;
#elif defined(V3D_LIGHTING_STUDIO)
@@ -91,15 +90,9 @@ void main()
#endif
/* -------- POST EFFECTS --------- */
-#ifdef V3D_SHADING_SSAO
- vec2 cavity = texelFetch(cavityBuffer, texel, 0).rg;
- shaded_color *= 1.0 - cavity.x;
- shaded_color *= 1.0 + cavity.y;
-#endif
-
-#ifdef V3D_SHADING_CURVATURE
- float curvature = calculate_curvature(objectId, normalBuffer, texel, world_data.curvature_ridge, world_data.curvature_valley);
- shaded_color *= curvature + 1.0;
+#ifdef WB_CAVITY
+ /* Using UNORM texture so decompress the range */
+ shaded_color *= texelFetch(cavityBuffer, texel, 0).r * CAVITY_BUFFER_RANGE;
#endif
#ifdef V3D_SHADING_SHADOW
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 5b4a7815dc2..5f622b00bca 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -24,7 +24,9 @@ flat in float hair_rand;
layout(location=0) out uint objectId;
layout(location=1) out vec4 diffuseColor;
+#ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
layout(location=2) out vec4 specularColor;
+#endif
#ifdef NORMAL_VIEWPORT_PASS_ENABLED
# ifdef WORKBENCH_ENCODE_NORMALS
layout(location=3) out vec2 normalViewport;
@@ -49,10 +51,6 @@ void main()
}
#else
diffuseColor = vec4(materialDiffuseColor.rgb, 0.0);
-# ifdef STUDIOLIGHT_TYPE_MATCAP
- specularColor = vec4(materialDiffuseColor.rgb, 0.0);
-
-# endif
#endif /* V3D_SHADING_TEXTURE_COLOR */
#ifdef HAIR_SHADER