diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-11-30 03:53:50 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-11-30 04:02:36 +0300 |
commit | 6a4f5f6eb44b3dacff51ae8c152689e8ddf6e7b2 (patch) | |
tree | 1fb36d73470fa35a7029c0bd4fe8a9cc3ca992ff /source/blender/draw/engines/workbench/shaders | |
parent | e1023014f4d28bd74dc2f44845ed04669b51caa5 (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')
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 |