[Bf-blender-cvs] [ad228f8e46c] soc-2018-npr: Edge thinning shader ok

Nick Wu noreply at git.blender.org
Thu May 24 03:49:50 CEST 2018


Commit: ad228f8e46cd34e23065d2100ae61d9c2126fae3
Author: Nick Wu
Date:   Thu May 24 09:49:17 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rBad228f8e46cd34e23065d2100ae61d9c2126fae3

Edge thinning shader ok

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

M	source/blender/draw/engines/lanpr/NUL_TNS.h
M	source/blender/draw/engines/lanpr/NUL_TNS_EdgeRendering.c
M	source/blender/draw/engines/lanpr/shaders/lanpr_image_peel.fragment
M	source/blender/draw/engines/lanpr/shaders/lanpr_snake_edge.fragment

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

diff --git a/source/blender/draw/engines/lanpr/NUL_TNS.h b/source/blender/draw/engines/lanpr/NUL_TNS.h
index 0509520a7bb..f2cea88c7ee 100644
--- a/source/blender/draw/engines/lanpr/NUL_TNS.h
+++ b/source/blender/draw/engines/lanpr/NUL_TNS.h
@@ -16,11 +16,14 @@ typedef struct LANPR_PassList {
 	struct DRWPass *color_pass;
 	struct DRWPass *normal_pass;
 	struct DRWPass *edge_intermediate;
+	struct DRWPass *edge_thinning;
+	struct DRWPass *edge_thinning_2;
 } LANPR_PassList;
 
 typedef struct LANPR_FramebufferList {
 	struct GPUFrameBuffer *passes;
 	struct GPUFrameBuffer *edge_intermediate;
+	struct GPUFrameBuffer *edge_thinning;
 	struct GPUFrameBuffer *on_screen;
 	//and something...
 } LANPR_FramebufferList;
@@ -35,6 +38,8 @@ typedef struct LANPR_TextureList {
 typedef struct LANPR_PrivateData {
 	DRWShadingGroup *multipass_shgrp;
 	DRWShadingGroup *edge_detect_shgrp;
+	DRWShadingGroup *edge_thinning_shgrp;
+	DRWShadingGroup *edge_thinning_shgrp_2;
 } LANPR_PrivateData;
 
 typedef struct LANPR_StorageList {
diff --git a/source/blender/draw/engines/lanpr/NUL_TNS_EdgeRendering.c b/source/blender/draw/engines/lanpr/NUL_TNS_EdgeRendering.c
index ce6fdedb4e2..7d0c4a20495 100644
--- a/source/blender/draw/engines/lanpr/NUL_TNS_EdgeRendering.c
+++ b/source/blender/draw/engines/lanpr/NUL_TNS_EdgeRendering.c
@@ -14,6 +14,7 @@ extern char datatoc_common_fullscreen_vert_glsl[];
 extern char datatoc_gpu_shader_3D_normal_smooth_color_vert_glsl[];
 extern char datatoc_lanpr_snake_multichannel_fragment[];
 extern char datatoc_lanpr_snake_edge_fragment[];
+extern char datatoc_lanpr_image_peel_fragment[];
 
 //==============================================================[ ATLAS / DPIX ]
 
@@ -28,6 +29,7 @@ extern char datatoc_lanpr_snake_edge_fragment[];
 typedef struct LANPROneTimeInit{
     GPUShader* multichannel_shader;
 	GPUShader* edge_detect_shader;
+	GPUShader* edge_thinning_shader;
 	void* ved;
 } LANPROneTimeInit;
 
@@ -73,6 +75,16 @@ static void lanpr_engine_init(void *ved){
 		GPU_ATTACHMENT_LEAVE
 	});
 
+	GPU_framebuffer_ensure_config(&fbl->edge_thinning, {
+		GPU_ATTACHMENT_TEXTURE(txl->depth),
+		GPU_ATTACHMENT_TEXTURE(txl->color),
+		GPU_ATTACHMENT_LEAVE,
+		GPU_ATTACHMENT_LEAVE,
+		GPU_ATTACHMENT_LEAVE,
+		GPU_ATTACHMENT_LEAVE,
+		GPU_ATTACHMENT_LEAVE
+	});
+
 
 	if (!OneTime.multichannel_shader) {
 	OneTime.multichannel_shader = 
@@ -87,6 +99,13 @@ static void lanpr_engine_init(void *ved){
 			datatoc_common_fullscreen_vert_glsl,
 			datatoc_lanpr_snake_edge_fragment,NULL,NULL,NULL);
 
+    }
+	if (!OneTime.edge_thinning_shader) {
+	OneTime.edge_thinning_shader = 
+		GPU_shader_create(
+			datatoc_common_fullscreen_vert_glsl,
+			datatoc_lanpr_image_peel_fragment,NULL,NULL,NULL);
+
     }
 
 }
@@ -100,10 +119,16 @@ static void lanpr_engine_free(void){
     LANPR_PassList *psl = ((LANPR_Data *)vedata)->psl;
 
 	DRW_pass_free(psl->color_pass);
+	DRW_pass_free(psl->edge_intermediate);
+
+	GPU_framebuffer_free(fbl->passes);
+	GPU_framebuffer_free(fbl->edge_intermediate);
+	GPU_framebuffer_free(fbl->edge_thinning);
 
 	DRW_texture_free(txl->depth);
 	DRW_texture_free(txl->color);
 	DRW_texture_free(txl->normal);
+	DRW_texture_free(txl->edge_intermediate);
 }
 
 static void lanpr_cache_init(void *vedata){
@@ -118,21 +143,30 @@ static void lanpr_cache_init(void *vedata){
 		stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
 	}
 
-	{
-		psl->color_pass = DRW_pass_create("Color Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WRITE_DEPTH);
-		stl->g_data->multipass_shgrp = DRW_shgroup_create(OneTime.multichannel_shader, psl->color_pass);
-	}
+
+	psl->color_pass = DRW_pass_create("Color Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WRITE_DEPTH);
+	stl->g_data->multipass_shgrp = DRW_shgroup_create(OneTime.multichannel_shader, psl->color_pass);
+
 
 	struct Gwn_Batch *quad = DRW_cache_fullscreen_quad_get();
 
-	{
-		psl->edge_intermediate = DRW_pass_create("Edge Detection", DRW_STATE_WRITE_COLOR);
-		stl->g_data->edge_detect_shgrp = DRW_shgroup_create(OneTime.edge_detect_shader, psl->edge_intermediate);
-		DRW_shgroup_uniform_texture_ref(stl->g_data->edge_detect_shgrp, "TexSample0", &txl->depth);
-		DRW_shgroup_uniform_texture_ref(stl->g_data->edge_detect_shgrp, "TexSample1", &txl->color);
-		DRW_shgroup_uniform_texture_ref(stl->g_data->edge_detect_shgrp, "TexSample2", &txl->normal);
-		DRW_shgroup_call_add(stl->g_data->edge_detect_shgrp, quad, NULL);
-	}
+
+	psl->edge_intermediate = DRW_pass_create("Edge Detection", DRW_STATE_WRITE_COLOR);
+	stl->g_data->edge_detect_shgrp = DRW_shgroup_create(OneTime.edge_detect_shader, psl->edge_intermediate);
+	DRW_shgroup_uniform_texture_ref(stl->g_data->edge_detect_shgrp, "TexSample0", &txl->depth);
+	DRW_shgroup_uniform_texture_ref(stl->g_data->edge_detect_shgrp, "TexSample1", &txl->color);
+	DRW_shgroup_uniform_texture_ref(stl->g_data->edge_detect_shgrp, "TexSample2", &txl->normal);
+	DRW_shgroup_call_add(stl->g_data->edge_detect_shgrp, quad, NULL);
+
+	psl->edge_thinning = DRW_pass_create("Edge Thinning Stage 1", DRW_STATE_WRITE_COLOR);
+	stl->g_data->edge_thinning_shgrp = DRW_shgroup_create(OneTime.edge_thinning_shader, psl->edge_thinning);
+	DRW_shgroup_uniform_texture_ref(stl->g_data->edge_thinning_shgrp, "TexSample0", &txl->edge_intermediate);
+	DRW_shgroup_call_add(stl->g_data->edge_thinning_shgrp, quad, NULL);
+
+	psl->edge_thinning_2 = DRW_pass_create("Edge Thinning Stage 2", DRW_STATE_WRITE_COLOR);
+	stl->g_data->edge_thinning_shgrp_2 = DRW_shgroup_create(OneTime.edge_thinning_shader, psl->edge_thinning_2);
+	DRW_shgroup_uniform_texture_ref(stl->g_data->edge_thinning_shgrp_2, "TexSample0", &txl->color);
+	DRW_shgroup_call_add(stl->g_data->edge_thinning_shgrp_2, quad, NULL);
 }
 
 static void lanpr_cache_populate(void *vedata, Object *ob){
@@ -203,6 +237,18 @@ static void lanpr_draw_scene(void *vedata)
 
 	DRW_draw_pass(psl->edge_intermediate);
 
+    int stage = 0;
+    GPU_framebuffer_bind(fbl->edge_thinning);
+	GPU_framebuffer_clear(fbl->edge_thinning, clear_bits, clear_col, clear_depth, clear_stencil);
+	DRW_shgroup_uniform_int(stl->g_data->edge_thinning_shgrp, "Stage", &stage, 1);
+    DRW_draw_pass(psl->edge_thinning);
+
+	stage = 1;
+	GPU_framebuffer_bind(fbl->edge_intermediate);
+	//GPU_framebuffer_clear(fbl->edge_intermediate, clear_bits, clear_col, clear_depth, clear_stencil);
+	DRW_shgroup_uniform_int(stl->g_data->edge_thinning_shgrp_2, "Stage", &stage, 1);
+    DRW_draw_pass(psl->edge_thinning_2);
+
 	GPU_framebuffer_bind(dfbl->default_fb);
 	
 	DRW_transform_to_display(txl->edge_intermediate);
diff --git a/source/blender/draw/engines/lanpr/shaders/lanpr_image_peel.fragment b/source/blender/draw/engines/lanpr/shaders/lanpr_image_peel.fragment
index d2b7d500d03..0b80af3ed9b 100644
--- a/source/blender/draw/engines/lanpr/shaders/lanpr_image_peel.fragment
+++ b/source/blender/draw/engines/lanpr/shaders/lanpr_image_peel.fragment
@@ -1,10 +1,7 @@
-#version 330
-in vec4 fColor;
-in vec2 fUV;
-uniform sampler2DMS TexSample0;
-uniform int uValue0;
 
-#define Stage uValue0
+in vec4 uvcoordsvar;
+uniform sampler2D TexSample0;
+uniform int Stage;
 
 int  decisions[256] = int[](0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,
                             1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,
@@ -36,8 +33,8 @@ int PickPixel(ivec2 sp){
 
 void main(){
 
-    ivec2 texSize = textureSize(TexSample0);
-    ivec2 sp = ivec2(fUV * texSize);
+    ivec2 texSize = textureSize(TexSample0,0);
+    ivec2 sp = ivec2(uvcoordsvar.xy * texSize);
 	vec4 OriginalColor = texelFetch(TexSample0, sp, 0);
 
 	int p2 = PickPixel(sp+ivec2( 0,+1));
diff --git a/source/blender/draw/engines/lanpr/shaders/lanpr_snake_edge.fragment b/source/blender/draw/engines/lanpr/shaders/lanpr_snake_edge.fragment
index e106d3b3b95..6272c80193e 100644
--- a/source/blender/draw/engines/lanpr/shaders/lanpr_snake_edge.fragment
+++ b/source/blender/draw/engines/lanpr/shaders/lanpr_snake_edge.fragment
@@ -71,6 +71,8 @@ vec4 DetectEdge(sampler2D tex, float clamp, float strength){
  	 float g3 = sqrt(pow(gx3, 2.0) + pow(gy3, 2.0)); 
      
 	 float value = max(max(g1,g2),g3);
+
+	 value=value>1?value:0;
 	 return vec4(vec3(value),1);
 
 	 //if(value<clamp) value=0;



More information about the Bf-blender-cvs mailing list