[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