[Bf-blender-cvs] [35dccf35f11] greasepencil-object: WIP: Add geometry shader for volumetrics

Antonio Vazquez noreply at git.blender.org
Mon Jul 3 20:28:14 CEST 2017


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);
 	}
 	
 }




More information about the Bf-blender-cvs mailing list