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-05-20 16:15:22 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-05-20 20:14:22 +0300
commit7a28dea1e173aefd08ef2130a9efc401d049e150 (patch)
tree78601d8fde64a0dce5bc37dc8f250efecb4b09f3 /source/blender/draw/engines/workbench/shaders/workbench_shadow_caps_geom.glsl
parent2c6106247bfde4d649fc788a6b933d48221dc7b3 (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.glsl82
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
+ }
+}