[Bf-blender-cvs] [bb43dff9358] blender2.8: Add 3D version of dashed line shader.
Bastien Montagne
noreply at git.blender.org
Wed Apr 26 21:01:00 CEST 2017
Commit: bb43dff935889f3efa112dbe21528b709b3f434d
Author: Bastien Montagne
Date: Wed Apr 26 20:55:14 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBbb43dff935889f3efa112dbe21528b709b3f434d
Add 3D version of dashed line shader.
This is actually nearly same code as 2D version, maybe we can
deduplicate that later?
===================================================================
M source/blender/gpu/CMakeLists.txt
M source/blender/gpu/GPU_shader.h
M source/blender/gpu/intern/gpu_shader.c
A source/blender/gpu/shaders/gpu_shader_3D_line_dashed_frag.glsl
A source/blender/gpu/shaders/gpu_shader_3D_line_dashed_vert.glsl
===================================================================
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index ea142361d81..73557db147b 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -150,6 +150,8 @@ data_to_c_simple(shaders/gpu_shader_3D_image_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_normal_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_flat_color_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_3D_line_dashed_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_3D_line_dashed_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_smooth_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_normal_smooth_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_smooth_color_frag.glsl SRC)
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index 7e4524142d3..e88bffb98ed 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -143,6 +143,7 @@ typedef enum GPUBuiltinShader {
GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR,
/* lines */
GPU_SHADER_2D_LINE_DASHED_COLOR,
+ GPU_SHADER_3D_LINE_DASHED_COLOR,
/* lamp drawing */
GPU_SHADER_3D_GROUNDPOINT,
GPU_SHADER_3D_GROUNDLINE,
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 33be3b74aff..ca92175cb3d 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -109,6 +109,8 @@ extern char datatoc_gpu_shader_2D_point_uniform_size_varying_color_outline_aa_ve
extern char datatoc_gpu_shader_2D_line_dashed_vert_glsl[];
extern char datatoc_gpu_shader_2D_line_dashed_frag_glsl[];
+extern char datatoc_gpu_shader_3D_line_dashed_vert_glsl[];
+extern char datatoc_gpu_shader_3D_line_dashed_frag_glsl[];
extern char datatoc_gpu_shader_edges_front_back_persp_vert_glsl[];
extern char datatoc_gpu_shader_edges_front_back_persp_geom_glsl[];
@@ -709,6 +711,8 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
[GPU_SHADER_2D_LINE_DASHED_COLOR] = { datatoc_gpu_shader_2D_line_dashed_vert_glsl,
datatoc_gpu_shader_2D_line_dashed_frag_glsl },
+ [GPU_SHADER_3D_LINE_DASHED_COLOR] = { datatoc_gpu_shader_3D_line_dashed_vert_glsl,
+ datatoc_gpu_shader_3D_line_dashed_frag_glsl },
[GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR] =
{ datatoc_gpu_shader_instance_objectspace_variying_color_vert_glsl,
diff --git a/source/blender/gpu/shaders/gpu_shader_3D_line_dashed_frag.glsl b/source/blender/gpu/shaders/gpu_shader_3D_line_dashed_frag.glsl
new file mode 100644
index 00000000000..2c13284cf34
--- /dev/null
+++ b/source/blender/gpu/shaders/gpu_shader_3D_line_dashed_frag.glsl
@@ -0,0 +1,24 @@
+
+/* Same code as 2D version actually, maybe we should deduplicate that? */
+
+#if __VERSION__ == 120
+ noperspective varying float distance_along_line;
+ #define fragColor gl_FragColor
+#else
+ noperspective in float distance_along_line;
+ out vec4 fragColor;
+#endif
+
+uniform float dash_width;
+uniform float dash_width_on;
+uniform vec4 color1;
+uniform vec4 color2;
+
+void main()
+{
+ if (mod(distance_along_line, dash_width) <= dash_width_on) {
+ fragColor = color1;
+ } else {
+ fragColor = color2;
+ }
+}
diff --git a/source/blender/gpu/shaders/gpu_shader_3D_line_dashed_vert.glsl b/source/blender/gpu/shaders/gpu_shader_3D_line_dashed_vert.glsl
new file mode 100644
index 00000000000..f3e91b6cc03
--- /dev/null
+++ b/source/blender/gpu/shaders/gpu_shader_3D_line_dashed_vert.glsl
@@ -0,0 +1,32 @@
+
+/* Note: nearly the same code as for 2D version... Maybe we could deduplicate? */
+
+uniform mat4 ModelViewProjectionMatrix;
+uniform vec2 viewport_size;
+
+#if __VERSION__ == 120
+ attribute vec3 pos;
+ attribute vec3 line_origin; // = pos for one vertex of the line
+ noperspective varying float distance_along_line;
+#else
+ in vec3 pos;
+ in vec3 line_origin;
+ noperspective out float distance_along_line;
+#endif
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+
+ vec4 point = ModelViewProjectionMatrix * vec4(line_origin, 1.0);
+ vec2 ref_point = (point.xy / point.w) * 0.5 + 0.5; // <- device coordinates in [0..1] range.
+ ref_point = ref_point * viewport_size; // <- fragment coordinates.
+
+ vec2 curr_point = (gl_Position.xy / gl_Position.w) * 0.5 + 0.5; // <- device coordinates in [0..1] range.
+ curr_point = curr_point * viewport_size; // <- fragment coordinates.
+
+ distance_along_line = distance(ref_point, curr_point);
+
+ /* Note: we could also use similar approach as diag_stripes_frag, but this would give us dashed 'anchored'
+ * to the screen, and not to one end of the line... */
+}
More information about the Bf-blender-cvs
mailing list