Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <j.bakker@atmind.nl>2018-05-24 10:06:29 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2018-05-24 10:28:29 +0300
commit7762522ecda77790f0bfa80a11655af578c66d47 (patch)
treed6cd260f22f2ac7bbd3484a0e75a7b3783a10167 /source/blender/draw/engines/workbench
parente561eef3ff0b40c0abeb785d779f0c6ef73d5aa8 (diff)
Workbench: define to enable/disable revealage buffer.
Diffstat (limited to 'source/blender/draw/engines/workbench')
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl10
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl2
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_revealage_frag.glsl2
-rw-r--r--source/blender/draw/engines/workbench/workbench_forward.c48
-rw-r--r--source/blender/draw/engines/workbench/workbench_materials.c4
-rw-r--r--source/blender/draw/engines/workbench/workbench_private.h8
6 files changed, 65 insertions, 9 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
index 02acc0aa00e..12d6296655d 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
@@ -2,7 +2,9 @@ out vec4 fragColor;
uniform usampler2D objectId;
uniform sampler2D transparentAccum;
+#ifdef WORKBENCH_REVEALAGE_ENABLED
uniform sampler2D transparentRevealage;
+#endif
uniform vec2 invertedViewportSize;
layout(std140) uniform world_block {
@@ -15,8 +17,9 @@ void main()
vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
uint object_id = texelFetch(objectId, texel, 0).r;
vec4 transparent_accum = texelFetch(transparentAccum, texel, 0);
+#ifdef WORKBENCH_REVEALAGE_ENABLED
float transparent_revealage = texelFetch(transparentRevealage, texel, 0).r;
- float revealage = texelFetch(transparentRevealage, texel, 0).r;
+#endif
vec4 color;
#ifdef V3D_SHADING_OBJECT_OUTLINE
@@ -28,8 +31,11 @@ void main()
if (object_id == NO_OBJECT_ID) {
color = vec4(background_color(world_data, uv_viewport.y), 0.0);
} else {
+#ifdef WORKBENCH_REVEALAGE_ENABLED
color = vec4((transparent_accum.xyz / max(transparent_accum.a, EPSILON)) * (1.0 - transparent_revealage), 1.0);
- // color = vec4(transparent_revealage);
+#else
+ color = vec4(transparent_accum.xyz / max(transparent_accum.a, EPSILON), 1.0);
+#endif
}
fragColor = vec4(mix(world_data.object_outline_color.rgb, color.xyz, outline), 1.0);
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
index 66445048996..309ae063284 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
@@ -42,7 +42,7 @@ void main()
vec3 shaded_color = diffuse_color.rgb;
#endif /* V3D_LIGHTING_STUDIO */
- float alpha = 1.0;
+ float alpha = 0.5 ;
vec4 premultiplied = vec4(shaded_color.rgb * alpha, alpha);
transparentAccum = calculate_transparent_accum(premultiplied);
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_revealage_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_revealage_frag.glsl
index 22f1cbc8a66..da87fe8f542 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_revealage_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_revealage_frag.glsl
@@ -2,6 +2,6 @@ layout(location=0) out float transparentRevealage;
void main()
{
- transparentRevealage = 1.0;
+ transparentRevealage = 0.5;
}
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index f2c8f3f0aef..d73a37bb341 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -57,7 +57,9 @@ static struct {
struct GPUTexture *object_id_tx; /* ref only, not alloced */
struct GPUTexture *transparent_accum_tx; /* ref only, not alloced */
+#ifdef WORKBENCH_REVEALAGE_ENABLED
struct GPUTexture *transparent_revealage_tx; /* ref only, not alloced */
+#endif
struct GPUTexture *composite_buffer_tx; /* ref only, not alloced */
int next_object_id;
float normal_world_matrix[3][3];
@@ -67,7 +69,9 @@ static struct {
extern char datatoc_workbench_forward_composite_frag_glsl[];
extern char datatoc_workbench_forward_depth_frag_glsl[];
extern char datatoc_workbench_forward_transparent_accum_frag_glsl[];
+#ifdef WORKBENCH_REVEALAGE_ENABLED
extern char datatoc_workbench_forward_transparent_revealage_frag_glsl[];
+#endif
extern char datatoc_workbench_data_lib_glsl[];
extern char datatoc_workbench_background_lib_glsl[];
extern char datatoc_workbench_checkerboard_depth_frag_glsl[];
@@ -107,6 +111,7 @@ static char *workbench_build_forward_transparent_accum_frag(void)
return str;
}
+#ifdef WORKBENCH_REVEALAGE_ENABLED
static char *workbench_build_forward_transparent_revealage_frag(void)
{
char *str = NULL;
@@ -120,6 +125,7 @@ static char *workbench_build_forward_transparent_revealage_frag(void)
BLI_dynstr_free(ds);
return str;
}
+#endif
static char *workbench_build_forward_composite_frag(void)
{
@@ -248,15 +254,18 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
memset(e_data.composite_sh_cache, 0x00, sizeof(struct GPUShader *) * MAX_SHADERS);
memset(e_data.transparent_accum_sh_cache, 0x00, sizeof(struct GPUShader *) * MAX_SHADERS);
- /* XXX: forward depth does not use any defines ATM. */
char *defines = workbench_material_build_defines(wpd, OB_SOLID);
char *forward_depth_frag = workbench_build_forward_depth_frag();
- char *forward_transparent_revealage_frag = workbench_build_forward_transparent_revealage_frag();
e_data.object_outline_sh = DRW_shader_create(datatoc_workbench_prepass_vert_glsl, NULL, forward_depth_frag, defines);
+
+#ifdef WORKBENCH_REVEALAGE_ENABLED
+ char *forward_transparent_revealage_frag = workbench_build_forward_transparent_revealage_frag();
e_data.transparent_revealage_sh = DRW_shader_create(datatoc_workbench_prepass_vert_glsl, NULL, forward_transparent_revealage_frag, defines);
+ MEM_freeN(forward_transparent_revealage_frag);
+#endif
+
e_data.depth_sh = DRW_shader_create_3D_depth_only();
e_data.checker_depth_sh = DRW_shader_create_fullscreen(datatoc_workbench_checkerboard_depth_frag_glsl, NULL);
- MEM_freeN(forward_transparent_revealage_frag);
MEM_freeN(forward_depth_frag);
MEM_freeN(defines);
}
@@ -267,7 +276,9 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
e_data.object_id_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_R32UI, &draw_engine_workbench_transparent);
e_data.transparent_accum_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA16F, &draw_engine_workbench_transparent);
+#ifdef WORKBENCH_REVEALAGE_ENABLED
e_data.transparent_revealage_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_R16F, &draw_engine_workbench_transparent);
+#endif
e_data.composite_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA16F, &draw_engine_workbench_transparent);
GPU_framebuffer_ensure_config(&fbl->object_outline_fb, {
GPU_ATTACHMENT_TEXTURE(dtxl->depth),
@@ -277,10 +288,14 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
GPU_ATTACHMENT_NONE,
GPU_ATTACHMENT_TEXTURE(e_data.transparent_accum_tx),
});
+
+#ifdef WORKBENCH_REVEALAGE_ENABLED
GPU_framebuffer_ensure_config(&fbl->transparent_revealage_fb, {
GPU_ATTACHMENT_NONE,
GPU_ATTACHMENT_TEXTURE(e_data.transparent_revealage_tx),
});
+#endif
+
GPU_framebuffer_ensure_config(&fbl->composite_fb, {
GPU_ATTACHMENT_NONE,
GPU_ATTACHMENT_TEXTURE(e_data.composite_buffer_tx),
@@ -289,9 +304,12 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
DRW_stats_group_start("Clear Buffers");
GPU_framebuffer_bind(fbl->transparent_accum_fb);
GPU_framebuffer_clear_color(fbl->transparent_accum_fb, clear_color);
+
+#ifdef WORKBENCH_REVEALAGE_ENABLED
const float clear_color1[4] = {1.0f, 1.0f, 1.0f, 1.0f};
GPU_framebuffer_bind(fbl->transparent_revealage_fb);
GPU_framebuffer_clear_color(fbl->transparent_revealage_fb, clear_color1);
+#endif
GPU_framebuffer_bind(fbl->object_outline_fb);
GPU_framebuffer_clear_color_depth(fbl->object_outline_fb, clear_color, 1.0f);
DRW_stats_group_end();
@@ -301,14 +319,17 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
int state = DRW_STATE_WRITE_COLOR | DRW_STATE_ADDITIVE_FULL;
psl->transparent_accum_pass = DRW_pass_create("Transparent Accum", state);
}
+
+#ifdef WORKBENCH_REVEALAGE_ENABLED
/* Treansparecy Revealage */
{
int state = DRW_STATE_WRITE_COLOR | DRW_STATE_TRANSPARENT_REVEALAGE;
psl->transparent_revealage_pass = DRW_pass_create("Transparent Revealage", state);
grp = DRW_shgroup_create(e_data.transparent_revealage_sh, psl->transparent_revealage_pass);
wpd->transparent_revealage_shgrp = grp;
-
}
+#endif
+
/* Depth */
{
int state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS;
@@ -322,7 +343,9 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_pass);
DRW_shgroup_uniform_texture_ref(grp, "objectId", &e_data.object_id_tx);
DRW_shgroup_uniform_texture_ref(grp, "transparentAccum", &e_data.transparent_accum_tx);
+#ifdef WORKBENCH_REVEALAGE_ENABLED
DRW_shgroup_uniform_texture_ref(grp, "transparentRevealage", &e_data.transparent_revealage_tx);
+#endif
DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo);
DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1);
DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
@@ -342,7 +365,9 @@ void workbench_forward_engine_free()
DRW_SHADER_FREE_SAFE(e_data.composite_sh_cache[index]);
DRW_SHADER_FREE_SAFE(e_data.transparent_accum_sh_cache[index]);
}
+#ifdef WORKBENCH_REVEALAGE_ENABLED
DRW_SHADER_FREE_SAFE(e_data.transparent_revealage_sh);
+#endif
DRW_SHADER_FREE_SAFE(e_data.object_outline_sh);
DRW_SHADER_FREE_SAFE(e_data.checker_depth_sh);
}
@@ -353,8 +378,10 @@ void workbench_forward_cache_init(WORKBENCH_Data *UNUSED(vedata))
static void workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, Object *ob)
{
+ #ifdef WORKBENCH_REVEALAGE_ENABLED
WORKBENCH_StorageList *stl = vedata->stl;
WORKBENCH_PrivateData *wpd = stl->g_data;
+#endif
const DRWContextState *draw_ctx = DRW_context_state_get();
if (ob == draw_ctx->object_edit) {
return;
@@ -375,7 +402,9 @@ static void workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, O
if (draw_as == PART_DRAW_PATH) {
struct Gwn_Batch *geom = DRW_cache_particles_get_hair(ob, psys, NULL);
WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, NULL, NULL, OB_SOLID);
+#ifdef WORKBENCH_REVEALAGE_ENABLED
DRW_shgroup_call_add(wpd->transparent_revealage_shgrp, geom, mat);
+#endif
DRW_shgroup_call_add(material->shgrp_object_outline, geom, mat);
DRW_shgroup_call_add(material->shgrp, geom, mat);
}
@@ -417,7 +446,9 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
mat_drawtype = OB_TEXTURE;
}
material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype);
+#ifdef WORKBENCH_REVEALAGE_ENABLED
DRW_shgroup_call_object_add(wpd->transparent_revealage_shgrp, geom_array[i], ob);
+#endif
DRW_shgroup_call_object_add(material->shgrp_object_outline, geom_array[i], ob);
DRW_shgroup_call_object_add(material->shgrp, geom_array[i], ob);
}
@@ -433,12 +464,16 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob);
if (geom) {
if (is_sculpt_mode) {
+#ifdef WORKBENCH_REVEALAGE_ENABLED
DRW_shgroup_call_sculpt_add(wpd->transparent_revealage_shgrp, ob, ob->obmat);
+#endif
DRW_shgroup_call_sculpt_add(material->shgrp_object_outline, ob, ob->obmat);
DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
}
else {
+#ifdef WORKBENCH_REVEALAGE_ENABLED
DRW_shgroup_call_object_add(wpd->transparent_revealage_shgrp, geom, ob);
+#endif
DRW_shgroup_call_object_add(material->shgrp_object_outline, geom, ob);
DRW_shgroup_call_object_add(material->shgrp, geom, ob);
}
@@ -456,7 +491,9 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
for (int i = 0; i < materials_len; ++i) {
Material *mat = give_current_material(ob, i + 1);
material = get_or_create_material_data(vedata, ob, mat, NULL, OB_SOLID);
+#ifdef WORKBENCH_REVEALAGE_ENABLED
DRW_shgroup_call_object_add(wpd->transparent_revealage_shgrp, mat_geom[i], ob);
+#endif
DRW_shgroup_call_object_add(material->shgrp_object_outline, mat_geom[i], ob);
DRW_shgroup_call_object_add(material->shgrp, mat_geom[i], ob);
}
@@ -495,9 +532,10 @@ void workbench_forward_draw_scene(WORKBENCH_Data *vedata)
/* Shade */
GPU_framebuffer_bind(fbl->transparent_accum_fb);
DRW_draw_pass(psl->transparent_accum_pass);
+#ifdef WORKBENCH_REVEALAGE_ENABLED
GPU_framebuffer_bind(fbl->transparent_revealage_fb);
DRW_draw_pass(psl->transparent_revealage_pass);
-
+#endif
/* Composite */
GPU_framebuffer_bind(fbl->composite_fb);
DRW_draw_pass(psl->composite_pass);
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 9b364d8ff09..e10bb4d688a 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -77,6 +77,10 @@ char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype)
BLI_dynstr_appendf(ds, "#define WORKBENCH_ENCODE_NORMALS\n");
}
+#ifdef WORKBENCH_REVEALAGE_ENABLED
+ BLI_dynstr_appendf(ds, "#define WORKBENCH_REVEALAGE_ENABLED\n");
+#endif
+
str = BLI_dynstr_get_cstring(ds);
BLI_dynstr_free(ds);
return str;
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index b54d46dd55c..52eb9bf576a 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -44,6 +44,7 @@
#define SHADOW_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_SHADOW)
#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (wpd->shading.light & V3D_LIGHTING_STUDIO || SHADOW_ENABLED(wpd))
#define NORMAL_ENCODING_ENABLED() (true)
+#define WORKBENCH_REVEALAGE_ENABLED
#define STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd) (wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_WORLD)
@@ -55,7 +56,10 @@ typedef struct WORKBENCH_FramebufferList {
/* Forward render buffers */
struct GPUFrameBuffer *object_outline_fb;
struct GPUFrameBuffer *transparent_accum_fb;
+
+#ifdef WORKBENCH_REVEALAGE_ENABLED
struct GPUFrameBuffer *transparent_revealage_fb;
+#endif
} WORKBENCH_FramebufferList;
typedef struct WORKBENCH_StorageList {
@@ -73,7 +77,9 @@ typedef struct WORKBENCH_PassList {
/* forward rendering */
struct DRWPass *transparent_accum_pass;
+#ifdef WORKBENCH_REVEALAGE_ENABLED
struct DRWPass *transparent_revealage_pass;
+#endif
struct DRWPass *object_outline_pass;
struct DRWPass *depth_pass;
struct DRWPass *checker_depth_pass;
@@ -113,7 +119,9 @@ typedef struct WORKBENCH_PrivateData {
struct GPUUniformBuffer *world_ubo;
struct DRWShadingGroup *shadow_shgrp;
struct DRWShadingGroup *depth_shgrp;
+#ifdef WORKBENCH_REVEALAGE_ENABLED
struct DRWShadingGroup *transparent_revealage_shgrp;
+#endif
WORKBENCH_UBO_World world_data;
float shadow_multiplier;
} WORKBENCH_PrivateData; /* Transient data */