Commit: e561eef3ff0b40c0abeb785d779f0c6ef73d5aa8
Author: Jeroen Bakker
Date:   Wed May 23 16:35:34 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBe561eef3ff0b40c0abeb785d779f0c6ef73d5aa8

Workbench: Revealage buffer

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

M       source/blender/draw/CMakeLists.txt
M       source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
M       
source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
M       
source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
A       
source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_revealage_frag.glsl
M       source/blender/draw/engines/workbench/workbench_forward.c
M       source/blender/draw/engines/workbench/workbench_private.h
M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_manager.c
M       source/blender/draw/intern/draw_manager_exec.c
M       source/blender/editors/space_view3d/view3d_header.c
M       source/blender/makesdna/DNA_view3d_types.h
M       source/blender/makesrna/intern/rna_space.c

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

diff --git a/source/blender/draw/CMakeLists.txt 
b/source/blender/draw/CMakeLists.txt
index 96dcac5b2d2..c93035e5c6d 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -220,6 +220,7 @@ 
data_to_c_simple(engines/workbench/shaders/workbench_deferred_composite_frag.gls
 
data_to_c_simple(engines/workbench/shaders/workbench_forward_composite_frag.glsl
 SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_forward_depth_frag.glsl 
SRC)
 
data_to_c_simple(engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
 SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_forward_transparent_revealage_frag.glsl
 SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_object_outline_lib.glsl 
SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_prepass_vert.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_prepass_frag.glsl SRC)
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
index 2550f44271b..88b715f55a8 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -1,5 +1,5 @@
 #define NO_OBJECT_ID uint(0)
-
+#define EPSILON 0.00001
 /* 4x4 bayer matrix prepared for 8bit UNORM precision error. */
 #define P(x) (((x + 0.5) * (1.0 / 16.0) - 0.5) * (1.0 / 255.0))
 const vec4 dither_mat4x4[4] = vec4[4](
@@ -62,3 +62,10 @@ void fresnel(vec3 I, vec3 N, float ior, out float kr)
        // As a consequence of the conservation of energy, transmittance is 
given by:
        // kt = 1 - kr;
 }
+
+vec4 calculate_transparent_accum(vec4 premultiplied) {
+       float a = min(1.0, premultiplied.a) * 8.0 + 0.01;
+       float b = -gl_FragCoord.z * 0.95 + 1.0;
+       float w = clamp(a * a * a * 1e8 * b * b * b, 1e-2, 3e2);
+       return premultiplied * w;
+}
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 2d6f78082e3..02acc0aa00e 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
@@ -15,6 +15,7 @@ void main()
        vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
        uint object_id = texelFetch(objectId, texel, 0).r;
        vec4 transparent_accum = texelFetch(transparentAccum, texel, 0);
+       float transparent_revealage = texelFetch(transparentRevealage, texel, 
0).r;
        float revealage = texelFetch(transparentRevealage, texel, 0).r;
        vec4 color;
 
@@ -27,7 +28,8 @@ void main()
        if (object_id == NO_OBJECT_ID) {
                color = vec4(background_color(world_data, uv_viewport.y), 0.0);
        } else {
-               color = transparent_accum / transparent_accum.a;
+               color = vec4((transparent_accum.xyz / max(transparent_accum.a, 
EPSILON)) * (1.0 - transparent_revealage), 1.0);
+               // color = vec4(transparent_revealage);
        }
 
        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 6428ed44f6b..66445048996 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
@@ -17,12 +17,7 @@ layout(std140) uniform world_block {
 
 layout(location=0) out vec4 transparentAccum;
 
-vec4 calculate_transparent_accum(vec4 premultiplied) {
-       float a = min(1.0, premultiplied.a) * 8.0 + 0.01;
-       float b = -gl_FragCoord.z * 0.95 + 1.0;
-       float w = clamp(a * a * a * 1e8 * b * b * b, 1e-2, 3e2);
-       return vec4(premultiplied.rgb, premultiplied.a);
-}
+
 void main()
 {
        vec4 diffuse_color;
@@ -47,7 +42,7 @@ void main()
        vec3 shaded_color = diffuse_color.rgb;
 #endif /* V3D_LIGHTING_STUDIO */
 
-       float alpha = 0.1;
+       float alpha = 1.0;
        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
new file mode 100644
index 00000000000..22f1cbc8a66
--- /dev/null
+++ 
b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_revealage_frag.glsl
@@ -0,0 +1,7 @@
+layout(location=0) out float transparentRevealage;
+
+void main()
+{
+       transparentRevealage = 1.0;
+}
+
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c 
b/source/blender/draw/engines/workbench/workbench_forward.c
index 823ca904415..f2c8f3f0aef 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -50,12 +50,14 @@
 static struct {
        struct GPUShader *composite_sh_cache[MAX_SHADERS];
        struct GPUShader *transparent_accum_sh_cache[MAX_SHADERS];
+       struct GPUShader *transparent_revealage_sh;
        struct GPUShader *object_outline_sh;
        struct GPUShader *depth_sh;
        struct GPUShader *checker_depth_sh;
 
        struct GPUTexture *object_id_tx; /* ref only, not alloced */
        struct GPUTexture *transparent_accum_tx; /* ref only, not alloced */
+       struct GPUTexture *transparent_revealage_tx; /* ref only, not alloced */
        struct GPUTexture *composite_buffer_tx; /* ref only, not alloced */
        int next_object_id;
        float normal_world_matrix[3][3];
@@ -65,6 +67,7 @@ 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[];
+extern char datatoc_workbench_forward_transparent_revealage_frag_glsl[];
 extern char datatoc_workbench_data_lib_glsl[];
 extern char datatoc_workbench_background_lib_glsl[];
 extern char datatoc_workbench_checkerboard_depth_frag_glsl[];
@@ -104,6 +107,20 @@ static char 
*workbench_build_forward_transparent_accum_frag(void)
        return str;
 }
 
+static char *workbench_build_forward_transparent_revealage_frag(void)
+{
+       char *str = NULL;
+
+       DynStr *ds = BLI_dynstr_new();
+
+       BLI_dynstr_append(ds, datatoc_workbench_common_lib_glsl);
+       BLI_dynstr_append(ds, 
datatoc_workbench_forward_transparent_revealage_frag_glsl);
+
+       str = BLI_dynstr_get_cstring(ds);
+       BLI_dynstr_free(ds);
+       return str;
+}
+
 static char *workbench_build_forward_composite_frag(void)
 {
        char *str = NULL;
@@ -234,9 +251,12 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
                /* 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);
+               e_data.transparent_revealage_sh = 
DRW_shader_create(datatoc_workbench_prepass_vert_glsl, NULL, 
forward_transparent_revealage_frag, defines);
                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);
        }
@@ -247,6 +267,7 @@ 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);
+       e_data.transparent_revealage_tx = DRW_texture_pool_query_2D(size[0], 
size[1], GPU_R16F, &draw_engine_workbench_transparent);
        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),
@@ -256,6 +277,10 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
                GPU_ATTACHMENT_NONE,
                GPU_ATTACHMENT_TEXTURE(e_data.transparent_accum_tx),
        });
+       GPU_framebuffer_ensure_config(&fbl->transparent_revealage_fb, {
+               GPU_ATTACHMENT_NONE,
+               GPU_ATTACHMENT_TEXTURE(e_data.transparent_revealage_tx),
+       });
        GPU_framebuffer_ensure_config(&fbl->composite_fb, {
                GPU_ATTACHMENT_NONE,
                GPU_ATTACHMENT_TEXTURE(e_data.composite_buffer_tx),
@@ -264,6 +289,9 @@ 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);
+       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);
        GPU_framebuffer_bind(fbl->object_outline_fb);
        GPU_framebuffer_clear_color_depth(fbl->object_outline_fb, clear_color, 
1.0f);
        DRW_stats_group_end();
@@ -273,6 +301,14 @@ 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);
        }
+       /* 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;
+
+       }
        /* Depth */
        {
                int state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | 
DRW_STATE_DEPTH_LESS;
@@ -286,6 +322,7 @@ 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_uni

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to