diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-05-20 16:15:22 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-05-20 20:14:22 +0300 |
commit | 7a28dea1e173aefd08ef2130a9efc401d049e150 (patch) | |
tree | 78601d8fde64a0dce5bc37dc8f250efecb4b09f3 /source/blender/draw/engines/workbench/shaders/workbench_shadow_caps_geom.glsl | |
parent | 2c6106247bfde4d649fc788a6b933d48221dc7b3 (diff) |
Workbench: Shadow: Add Depth Fail method
Also add new debug visualisation.
Depth fail method is not used for the moment but has nice benefits. It will
be used efficiently in the future.
Diffstat (limited to 'source/blender/draw/engines/workbench/shaders/workbench_shadow_caps_geom.glsl')
-rw-r--r-- | source/blender/draw/engines/workbench/shaders/workbench_shadow_caps_geom.glsl | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_caps_geom.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_caps_geom.glsl new file mode 100644 index 00000000000..5d286bd1090 --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_caps_geom.glsl @@ -0,0 +1,82 @@ +#extension GL_ARB_gpu_shader5 : enable + +#ifdef GL_ARB_gpu_shader5 +#define USE_INVOC_EXT +#endif + +#define DOUBLE_MANIFOLD + +#ifdef DOUBLE_MANIFOLD +# ifdef USE_INVOC_EXT +# define invoc_ct 4 +# else +# define vert_ct 12 +# endif +#else +# ifdef USE_INVOC_EXT +# define invoc_ct 2 +# else +# define vert_ct 6 +# endif +#endif + +#ifdef USE_INVOC_EXT +layout(triangles, invocations = invoc_ct) in; +layout(triangle_strip, max_vertices = 3) out; +#else +layout(triangles) in; +layout(triangle_strip, max_vertices = vert_ct) out; +#endif + +uniform vec3 lightDirection = vec3(0.57, 0.57, -0.57); + +in VertexData { + vec3 pos; /* local position */ + vec4 frontPosition; /* final ndc position */ + vec4 backPosition; +} vData[]; + +vec4 get_pos(int v, bool backface) +{ + return (backface) ? vData[v].backPosition : vData[v].frontPosition; +} + +void emit_cap(const bool front) +{ + if (front) { + gl_Position = vData[0].frontPosition; EmitVertex(); + gl_Position = vData[1].frontPosition; EmitVertex(); + gl_Position = vData[2].frontPosition; EmitVertex(); + } + else { + gl_Position = vData[0].backPosition; EmitVertex(); + gl_Position = vData[2].backPosition; EmitVertex(); + gl_Position = vData[1].backPosition; EmitVertex(); + } + EndPrimitive(); +} + +void main() +{ + vec3 v10 = vData[0].pos - vData[1].pos; + vec3 v12 = vData[2].pos - vData[1].pos; + + vec3 n = cross(v12, v10); + float facing = dot(n, lightDirection); + + bool backface = facing > 0.0; + + if (!backface) { +#ifdef USE_INVOC_EXT + bool do_front = (gl_InvocationID & 1) == 0; + emit_cap(do_front); +#else + emit_cap(true); + emit_cap(false); +# ifdef DOUBLE_MANIFOLD + emit_cap(true); + emit_cap(false); +# endif +#endif + } +} |