[Bf-blender-cvs] [0c47762] clay-engine: More work on Clay engine: - Calculate normals with dfdy while waiting for a proper way to draw mesh normals. - Added initial support for 2d texture arrays. - Better API naming. - Generate Matcap texture arrays and draw with it.

Clément Foucault noreply at git.blender.org
Wed Jan 4 11:02:35 CET 2017


Commit: 0c4776280da79a4a20955be1e9d44bfb7e111966
Author: Clément Foucault
Date:   Wed Jan 4 11:01:14 2017 +0100
Branches: clay-engine
https://developer.blender.org/rB0c4776280da79a4a20955be1e9d44bfb7e111966

More work on Clay engine:
- Calculate normals with dfdy while waiting for a proper way to draw mesh normals.
- Added initial support for 2d texture arrays.
- Better API naming.
- Generate Matcap texture arrays and draw with it.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/DRW_engine.h
M	source/blender/draw/engines/clay/clay.c
D	source/blender/draw/engines/clay/shaders/clay_debug_frag.glsl
D	source/blender/draw/engines/clay/shaders/clay_downsample_depth_frag.glsl
M	source/blender/draw/engines/clay/shaders/clay_frag.glsl
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_texture.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index dceb487..8348ef4 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -61,8 +61,6 @@ set(SRC
 
 data_to_c_simple(engines/clay/shaders/clay_frag.glsl SRC)
 data_to_c_simple(engines/clay/shaders/clay_vert.glsl SRC)
-data_to_c_simple(engines/clay/shaders/clay_downsample_depth_frag.glsl SRC)
-data_to_c_simple(engines/clay/shaders/clay_debug_frag.glsl SRC)
 
 list(APPEND INC
 )
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index a35c5df..81831a3 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -47,7 +47,7 @@ typedef struct DRWUniform {
 
 typedef struct DRWInterface {
 	ListBase uniforms;
-	/* matrices */
+	/* matrices locations */
 	int modelview;
 	int projection;
 	int modelviewprojection;
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index aab9a85..d35b887 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -21,36 +21,42 @@
 
 #include "DRW_render.h"
 
+#include "BKE_icons.h"
+
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+
+#include "UI_resources.h"
+#include "UI_interface_icons.h"
+
 #include "clay.h"
 
 /* Shaders */
 
 extern char datatoc_clay_frag_glsl[];
 extern char datatoc_clay_vert_glsl[];
-extern char datatoc_clay_downsample_depth_frag_glsl[];
-extern char datatoc_clay_debug_frag_glsl[];
-
 
 /* Storage */
 
 static struct CLAY_data {
 	/* Depth Pre Pass */
 	struct DRWPass *depth_pass;
-	struct GPUShader *depth_shader;
-	struct DRWInterface *depth_interface;
-	/* Depth Downsample Pass */
-	struct DRWPass *downsample_pass;
-	struct GPUShader *downsample_shader;
-	struct DRWInterface *downsample_interface;
+	struct GPUShader *depth_sh;
+	struct DRWInterface *depth_itf;
 	/* Shading Pass */
 	struct DRWPass *clay_pass;
-	struct GPUShader *clay_shader;
-	struct DRWInterface *clay_interface;
-
-	/* Debug Pass */
-	struct DRWPass *debug_pass;
-	struct GPUShader *debug_shader;
-	struct DRWInterface *debug_interface;
+	struct GPUShader *clay_sh;
+	struct DRWInterface *clay_itf;
+
+	/* Matcap textures */
+	struct GPUTexture *matcap_array;
+
+	/* Ssao */
+	float dfdyfac[2];
+	float winmat[4][4];
+	float viewvecs[3][4];
+	float ssao_params[4];
+	float sample_params[3];
 } data = {NULL};
 
 /* keep it under MAX_BUFFERS */
@@ -70,88 +76,94 @@ typedef struct CLAY_TextureList{
 	struct GPUTexture *depth_low;
 } CLAY_TextureList;
 
-/* for clarity follow the same layout as TextureList */
+/* for clarity follow the same layout as CLAY_TextureList */
 #define SCENE_COLOR 0
 #define SCENE_DEPTH 1
 #define SCENE_DEPTH_LOW 2
 
 /* Functions */
+static void add_icon_to_rect(PreviewImage *prv, float *final_rect, int layer)
+{
+	int image_size = prv->w[0] * prv->h[0];
+	float *new_rect = &final_rect[image_size * 4 * layer];
+
+	IMB_buffer_float_from_byte(new_rect, prv->rect[0], IB_PROFILE_SRGB, IB_PROFILE_SRGB,
+	                           false, prv->w[0], prv->h[0], prv->w[0], prv->w[0]);
+}
 
 static void clay_init_engine(void)
 {
 	DRWBatch *batch;
 
-	/* Depth prepass */
+	/* Create Texture Array */
 	{
-		data.depth_shader = DRW_shader_create_3D_depth_only();
-		data.depth_interface = DRW_interface_create(data.depth_shader);
+		PreviewImage *prv[2];
+		int layers = 2; /* For now only use the 24 internal matcaps */
 
-		data.depth_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), "DRWPass depth_pass");
-		data.depth_pass->state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS;
+		prv[0] = UI_icon_to_preview(ICON_MATCAP_02);
+		float *final_rect = MEM_callocN(sizeof(float) * 4 * prv[0]->w[0] * prv[0]->h[0] * layers, "Clay Matcap array rect");
+		add_icon_to_rect(prv[0], final_rect, 0);
 
-		batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
-		batch->shader = data.depth_shader;
-		batch->interface = data.depth_interface;
-		BLI_addtail(&data.depth_pass->batches, batch);
+		prv[1] = UI_icon_to_preview(ICON_MATCAP_03);
+		add_icon_to_rect(prv[1], final_rect, 1);
+
+		data.matcap_array = DRW_texture_create_2D_array(prv[1]->w[0], prv[1]->h[0], layers, final_rect);
+		MEM_freeN(final_rect);
+		BKE_previewimg_free(&prv[0]);
+		BKE_previewimg_free(&prv[1]);
 	}
 
-	/* Downsample pass */
+	/* Depth prepass */
 	{
-		data.downsample_shader = DRW_shader_create_2D(datatoc_clay_downsample_depth_frag_glsl, NULL);
-		data.downsample_interface = DRW_interface_create(data.downsample_shader);
-		DRW_interface_uniform_int(data.downsample_shader, data.downsample_interface, "screenres", DRW_get_viewport_size(), 2);
-		DRW_interface_uniform_buffer(data.downsample_shader, data.downsample_interface, "depthtex", SCENE_DEPTH, 0);
+		data.depth_sh = DRW_shader_create_3D_depth_only();
+		data.depth_itf = DRW_interface_create(data.depth_sh);
 
-		data.downsample_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), "DRWPass downsample_pass");
-		data.downsample_pass->state = DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR;
+		data.depth_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), "DRWPass depth_pass");
+		data.depth_pass->state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS;
 
 		batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
-		batch->shader = data.downsample_shader;
-		batch->interface = data.downsample_interface;		
-		BLI_addtail(&data.downsample_pass->batches, batch);		
+		batch->shader = data.depth_sh;
+		batch->interface = data.depth_itf;
+		BLI_addtail(&data.depth_pass->batches, batch);
 	}
 
 	/* Shading pass */
 	{
-		data.clay_shader = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, NULL);
-		data.clay_interface = DRW_interface_create(data.clay_shader);
-		//DRW_interface_uniform_int(data.clay_shader, data.clay_interface, "screenres", DRW_get_viewport_size(), 2);
-		//DRW_interface_uniform_float(data.clay_shader, data.clay_interface, "color", col, 4);
+		int bindloc = 0;
 
-		data.clay_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), "DRWPass clay_pass");
-		data.clay_pass->state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL;
+		data.clay_sh = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, NULL);
+		data.clay_itf = DRW_interface_create(data.clay_sh);
 
-		batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
-		batch->shader = data.clay_shader;
-		batch->interface = data.clay_interface;
-		BLI_addtail(&data.clay_pass->batches, batch);		
-	}
+		DRW_interface_uniform_ivec2(data.clay_sh, data.clay_itf, "screenres", DRW_viewport_size_get(), 1);
+		DRW_interface_uniform_buffer(data.clay_sh, data.clay_itf, "depthtex", SCENE_DEPTH, bindloc++);
+		DRW_interface_uniform_texture(data.clay_sh, data.clay_itf, "matcaps", data.matcap_array, bindloc++);
 
-	/* Debug */
-	{
-		data.debug_shader = DRW_shader_create_2D(datatoc_clay_debug_frag_glsl, NULL);
-		data.debug_interface = DRW_interface_create(data.debug_shader);
-		DRW_interface_uniform_int(data.debug_shader, data.debug_interface, "screenres", DRW_get_viewport_size(), 2);
-		DRW_interface_uniform_buffer(data.debug_shader, data.debug_interface, "depthtex", SCENE_DEPTH_LOW, 0);
+		/* SSAO */
+		DRW_interface_uniform_mat4(data.clay_sh, data.clay_itf, "WinMatrix", data.winmat);
+		DRW_interface_uniform_vec4(data.clay_sh, data.clay_itf, "viewvecs", data.viewvecs, 3);
+		DRW_interface_uniform_vec4(data.clay_sh, data.clay_itf, "ssao_params", data.ssao_params, 1);
+		DRW_interface_uniform_vec3(data.clay_sh, data.clay_itf, "ssao_sample_params", data.sample_params, 1);
 
-		data.debug_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), "DRWPass debug_pass");
-		data.debug_pass->state = DRW_STATE_WRITE_COLOR;
+		data.clay_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), "DRWPass clay_pass");
+		data.clay_pass->state = DRW_STATE_WRITE_COLOR;
 
 		batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
-		batch->shader = data.debug_shader;
-		batch->interface = data.debug_interface;
-		BLI_addtail(&data.debug_pass->batches, batch);		
+		batch->shader = data.clay_sh;
+		batch->interface = data.clay_itf;
+		BLI_addtail(&data.clay_pass->batches, batch);
 	}
 }
 
+#if 0
 static void clay_init_view(CLAY_FramebufferList *buffers, CLAY_TextureList *textures)
 {
-	int *viewsize = DRW_get_viewport_size();
+	int *viewsize = DRW_viewport_size_get();
 
 	DRWFboTexture depth = {&textures->depth_low, DRW_BUF_R_16};
 
 	DRW_framebuffer_init(&buffers->downsample_depth, viewsize[0]/2, viewsize[1]/2, &depth, 1);
 }
+#endif
 
 static void clay_populate_batch(const struct bContext *C)
 {
@@ -168,6 +180,55 @@ static void clay_populate_batch(const struct bContext *C)
 	}
 }
 
+static void clay_ssao_setup(void)
+{
+	float invproj[4][4];
+	float dfdyfacs[2];
+	bool is_persp = DRW_viewport_is_persp();
+	/* view vectors for the corners of the view frustum. Can be used to recreate the world space position easily */
+	float viewvecs[3][4] = {
+	    {-1.0f, -1.0f, -1.0f, 1.0f},
+	    {1.0f, -1.0f, -1.0f, 1.0f},
+	    {-1.0f, 1.0f, -1.0f, 1.0f}
+	};
+	int i;
+
+	DRW_get_dfdy_factors(dfdyfacs);
+
+	data.ssao_params[0] = 1.0f; /* Max distance */
+	data.ssao_params[1] = 1.0f; /* Factor */
+	data.ssao_params[2] = 1.0f; /* Attenuation */
+	data.ssao_params[3] = dfdyfacs[1]; /* dfdy sign */
+
+	/* invert the view matrix */
+	DRW_viewport_matrix_get(data.winmat, DRW_MAT_WIN);
+	invert_m4_m4(invproj, data.winmat);
+
+	/* convert the view vectors to view space */
+	for (i = 0; i < 3; i++) {
+		mul_m4_v4(invproj, viewvecs[i]);
+		/* normalized trick see http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer */
+		mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][3]);
+		if (is_persp)
+			mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][2]);
+		viewvecs[i][3] = 1.0;
+
+		copy_v4_v4(data.viewvecs[i], viewvecs[i]);
+	}
+
+	/* we need to store the differences */
+	data.viewvecs[1][0] -= data.viewvecs[0][0];
+	data.viewvecs[1][1] = data.viewvecs[2][1] - data.viewvecs[0][1];
+
+	/* calculate a depth offset as well */
+	if (!is_persp) {
+		float vec_far[] = {-1.0f, -1.0f, 1.0f, 1.0f};
+		mul_m4_v4(invproj, vec_far);
+		mul_v3_fl(vec_far, 1.0f / vec_far[3]);
+		data.viewvecs[1][2] = vec_far[2] - d

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list