Commit: 35dccf35f11fc41d226d3bc18625d037a35a76a7
Author: Antonio Vazquez
Date:   Mon Jul 3 19:36:06 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB35dccf35f11fc41d226d3bc18625d037a35a76a7

WIP: Add geometry shader for volumetrics

===================================================================

M       source/blender/draw/CMakeLists.txt
M       source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M       source/blender/draw/engines/gpencil/gpencil_engine.c
M       source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl
A       source/blender/draw/engines/gpencil/shaders/gpencil_point_geom.glsl
M       source/blender/draw/engines/gpencil/shaders/gpencil_point_vert.glsl

===================================================================

diff --git a/source/blender/draw/CMakeLists.txt 
b/source/blender/draw/CMakeLists.txt
index f5658bc1b83..8fa1019a84f 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -203,6 +203,7 @@ 
data_to_c_simple(engines/gpencil/shaders/gpencil_stroke_geom.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_stroke_frag.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_zdepth_mix_frag.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_point_vert.glsl SRC)
+data_to_c_simple(engines/gpencil/shaders/gpencil_point_geom.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_point_frag.glsl SRC)
 
 list(APPEND INC
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c 
b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index 4b11fcf14ed..0bf57951b3e 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -362,10 +362,13 @@ static DRWShadingGroup 
*DRW_gpencil_shgroup_point_create(GPENCIL_e_data *e_data,
        bGPdata *gpd, int id)
 {
        GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+       const float *viewport_size = DRW_viewport_size_get();
+
 
        /* e_data.gpencil_stroke_sh */
        DRWShadingGroup *grp = DRW_shgroup_create(shader, pass);
 
+       DRW_shgroup_uniform_vec2(grp, "Viewport", viewport_size, 1);
        DRW_shgroup_uniform_float(grp, "pixsize", DRW_viewport_pixelsize_get(), 
1);
        DRW_shgroup_uniform_float(grp, "pixelsize", &U.pixelsize, 1);
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c 
b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 6c4cc0b0e14..f7b94e6e57e 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -43,6 +43,7 @@ extern char datatoc_gpencil_stroke_geom_glsl[];
 extern char datatoc_gpencil_stroke_frag_glsl[];
 extern char datatoc_gpencil_zdepth_mix_frag_glsl[];
 extern char datatoc_gpencil_point_vert_glsl[];
+extern char datatoc_gpencil_point_geom_glsl[];
 extern char datatoc_gpencil_point_frag_glsl[];
 
 /* *********** STATIC *********** */
@@ -83,7 +84,7 @@ static void GPENCIL_engine_init(void *vedata)
        }
        if (!e_data.gpencil_point_sh) {
                e_data.gpencil_point_sh = 
DRW_shader_create(datatoc_gpencil_point_vert_glsl,
-                       NULL,
+                       datatoc_gpencil_point_geom_glsl,
                        datatoc_gpencil_point_frag_glsl,
                        NULL);
        }
diff --git 
a/source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl 
b/source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl
index 59f8761e9c3..2d698381133 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl
@@ -1,15 +1,16 @@
-uniform int xraymode;
+uniform int stroke_type;
+uniform sampler2D myTexture;
 
-in vec4 finalColor;
+in vec4 mColor;
+in vec2 mTexCoord;
 out vec4 fragColor;
 
-#define GP_XRAY_FRONT 0
-#define GP_XRAY_3DSPACE 1
-#define GP_XRAY_BACK  2
+#define texture2D texture
 
 void main()
 {
-       vec2 centered = gl_PointCoord - vec2(0.5);
+//     vec2 centered = gl_PointCoord - vec2(0.5);
+       vec2 centered = mTexCoord - vec2(0.5);
        float dist_squared = dot(centered, centered);
        const float rad_squared = 0.25;
 
@@ -17,16 +18,5 @@ void main()
        if (dist_squared > rad_squared)
                discard;
 
-       fragColor = finalColor;
-
-       /* set zdepth */
-       if (xraymode == GP_XRAY_FRONT) {
-               gl_FragDepth = 0.0;
-       }
-       if (xraymode == GP_XRAY_3DSPACE) {
-               gl_FragDepth = gl_FragCoord.z;
-       }
-       if  (xraymode == GP_XRAY_BACK) {
-               gl_FragDepth = 1.0;
-       }
+       fragColor = mColor;
 }
diff --git 
a/source/blender/draw/engines/gpencil/shaders/gpencil_point_geom.glsl 
b/source/blender/draw/engines/gpencil/shaders/gpencil_point_geom.glsl
new file mode 100644
index 00000000000..e5aa7cf654b
--- /dev/null
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_point_geom.glsl
@@ -0,0 +1,71 @@
+uniform mat4 ModelViewProjectionMatrix;
+uniform vec2 Viewport;
+uniform int xraymode;
+
+layout(points) in;
+layout(triangle_strip, max_vertices = 4) out;
+
+in vec4 finalColor[1];
+in float finalThickness[1];
+
+out vec4 mColor;
+out vec2 mTexCoord;
+
+#define GP_XRAY_FRONT 0
+#define GP_XRAY_3DSPACE 1
+#define GP_XRAY_BACK  2
+
+/* project 3d point to 2d on screen space */
+vec2 toScreenSpace(vec4 vertex)
+{
+       return vec2(vertex.xy / vertex.w) * Viewport;
+}
+
+/* get zdepth value */
+float getZdepth(vec4 point)
+{
+       if (xraymode == GP_XRAY_FRONT) {
+               return 0.0;
+       }
+       if (xraymode == GP_XRAY_3DSPACE) {
+               return (point.z / point.w);
+       }
+       if  (xraymode == GP_XRAY_BACK) {
+               return 1.0;
+       }
+
+       /* in front by default */
+       return 0.0;
+}
+void main(void)
+{
+       /* receive 4 points */
+       vec4 P0 = gl_in[0].gl_Position;
+       vec2 sp0 = toScreenSpace(P0);
+       
+       float size = finalThickness[0] * 0.5; 
+       float aspect = 1.0;
+
+       /* generate the triangle strip */
+       mTexCoord = vec2(0, 1);
+       mColor = finalColor[0];
+       gl_Position = vec4(vec2(sp0.x - size, sp0.y + size * aspect) / 
Viewport, getZdepth(P0), 1.0);
+       EmitVertex();
+
+       mTexCoord = vec2(0, 0);
+       mColor = finalColor[0];
+       gl_Position = vec4(vec2(sp0.x - size, sp0.y - size * aspect) / 
Viewport, getZdepth(P0), 1.0);
+       EmitVertex();
+
+       mTexCoord = vec2(1, 1);
+       mColor = finalColor[0];
+       gl_Position = vec4(vec2(sp0.x + size, sp0.y + size * aspect) / 
Viewport, getZdepth(P0), 1.0);
+       EmitVertex();
+
+       mTexCoord = vec2(1, 0);
+       mColor = finalColor[0];
+       gl_Position = vec4(vec2(sp0.x + size, sp0.y - size * aspect) / 
Viewport, getZdepth(P0), 1.0);
+       EmitVertex();
+
+       EndPrimitive();
+}
diff --git 
a/source/blender/draw/engines/gpencil/shaders/gpencil_point_vert.glsl 
b/source/blender/draw/engines/gpencil/shaders/gpencil_point_vert.glsl
index 170604304ea..eda4bcc2ac1 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_point_vert.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_point_vert.glsl
@@ -12,6 +12,7 @@ in vec4 color;
 in float thickness;
 
 out vec4 finalColor;
+out float finalThickness;
 
 #define TRUE 1
 
@@ -23,11 +24,11 @@ void main()
        finalColor = color;
 
        if (keep_size == TRUE) {
-               gl_PointSize = thickness;
+               finalThickness = thickness;
        }
        else {
                float size = (ProjectionMatrix[3][3] == 0.0) ? (thickness / 
(gl_Position.z * defaultpixsize)) : (thickness / defaultpixsize);
-               gl_PointSize = max(size * objscale, 1.0);
+               finalThickness = max(size * objscale, 1.0);
        }
        
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to