[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