Commit: 04f8929271148659f3157fd728f7437e6409a29f
Author: Jeroen Bakker
Date:   Fri Jun 29 12:05:23 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB04f8929271148659f3157fd728f7437e6409a29f

Workbench: Transparent textures

Worknemch now supports transparent textures.
As the main engine is a deferred shading only a cutoff is supported
(draw or don't draw this pixel)

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

M       
source/blender/draw/engines/workbench/shaders/workbench_forward_depth_frag.glsl
M       
source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
M       
source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
M       source/blender/draw/engines/workbench/workbench_forward.c

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

diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_forward_depth_frag.glsl
 
b/source/blender/draw/engines/workbench/shaders/workbench_forward_depth_frag.glsl
index 41726a774eb..9380044f2b9 100644
--- 
a/source/blender/draw/engines/workbench/shaders/workbench_forward_depth_frag.glsl
+++ 
b/source/blender/draw/engines/workbench/shaders/workbench_forward_depth_frag.glsl
@@ -1,7 +1,20 @@
 uniform int object_id = 0;
 layout(location=0) out uint objectId;
+uniform float ImageTransparencyCutoff = 0.1;
+#ifdef V3D_SHADING_TEXTURE_COLOR
+uniform sampler2D image;
+
+in vec2 uv_interp;
+#endif
 
 void main()
 {
+#ifdef V3D_SHADING_TEXTURE_COLOR
+       vec4 diffuse_color = texture(image, uv_interp);
+       if (diffuse_color.a < ImageTransparencyCutoff) {
+               discard;
+       }
+#endif
+
        objectId = uint(object_id);
 }
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 110b5a51fa5..81b6b2567a9 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
@@ -1,5 +1,7 @@
 #ifdef V3D_SHADING_TEXTURE_COLOR
 uniform sampler2D image;
+uniform float ImageTransparencyCutoff = 0.1;
+
 #endif
 uniform mat4 ProjectionMatrix;
 uniform mat3 normalWorldMatrix;
@@ -35,6 +37,9 @@ void main()
 
 #ifdef V3D_SHADING_TEXTURE_COLOR
        diffuse_color = texture(image, uv_interp);
+       if (diffuse_color.a < ImageTransparencyCutoff) {
+               discard;
+       }
 #else
        diffuse_color = materialDiffuseColor;
 #endif /* V3D_SHADING_TEXTURE_COLOR */
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index 8752afb09c1..62c7e4515cd 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -6,6 +6,8 @@ uniform float materialRoughness;
 
 #ifdef V3D_SHADING_TEXTURE_COLOR
 uniform sampler2D image;
+uniform float ImageTransparencyCutoff = 0.1;
+
 #endif
 
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
@@ -42,6 +44,9 @@ void main()
 
 #ifdef V3D_SHADING_TEXTURE_COLOR
        diffuseColor = texture(image, uv_interp);
+       if (diffuseColor.a < ImageTransparencyCutoff) {
+               discard;
+       }
 #else
        diffuseColor = vec4(materialDiffuseColor.rgb, 0.0);
 #  ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c 
b/source/blender/draw/engines/workbench/workbench_forward.c
index fb7f3d2bb84..76172443c2d 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -51,6 +51,7 @@ static struct {
        struct GPUShader *composite_sh_cache[MAX_SHADERS];
        struct GPUShader *transparent_accum_sh_cache[MAX_SHADERS];
        struct GPUShader *object_outline_sh;
+       struct GPUShader *object_outline_texture_sh;
        struct GPUShader *object_outline_hair_sh;
        struct GPUShader *checker_depth_sh;
 
@@ -78,20 +79,6 @@ extern char datatoc_workbench_common_lib_glsl[];
 extern char datatoc_workbench_world_light_lib_glsl[];
 
 /* static functions */
-static char *workbench_build_forward_depth_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_depth_frag_glsl);
-
-       str = BLI_dynstr_get_cstring(ds);
-       BLI_dynstr_free(ds);
-       return str;
-}
-
 static char *workbench_build_forward_vert(void)
 {
        char *str = NULL;
@@ -189,7 +176,15 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
                material->shgrp = grp;
 
                /* Depth */
-               material->shgrp_object_outline = 
DRW_shgroup_create(e_data.object_outline_sh, psl->object_outline_pass);
+               if (workbench_material_determine_color_type(wpd, material->ima) 
== V3D_SHADING_TEXTURE_COLOR)
+               {
+                       material->shgrp_object_outline = 
DRW_shgroup_create(e_data.object_outline_texture_sh, psl->object_outline_pass);
+                       GPUTexture *tex = 
GPU_texture_from_blender(material->ima, NULL, GL_TEXTURE_2D, false, 0.0f);
+                       
DRW_shgroup_uniform_texture(material->shgrp_object_outline, "image", tex);
+               }
+               else {
+                       material->shgrp_object_outline = 
DRW_shgroup_create(e_data.object_outline_sh, psl->object_outline_pass);
+               }
                material->object_id = engine_object_data->object_id;
                DRW_shgroup_uniform_int(material->shgrp_object_outline, 
"object_id", &material->object_id, 1);
                BLI_ghash_insert(wpd->material_hash, SET_UINT_IN_POINTER(hash), 
material);
@@ -266,23 +261,26 @@ 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);
 
-               char *defines = workbench_material_build_defines(wpd, OB_SOLID, 
false);
-               char *defines_hair = workbench_material_build_defines(wpd, 
OB_SOLID, true);
+               char *defines = workbench_material_build_defines(wpd, false, 
false);
+               char *defines_texture = workbench_material_build_defines(wpd, 
true, false);
+               char *defines_hair = workbench_material_build_defines(wpd, 
false, true);
                char *forward_vert = workbench_build_forward_vert();
-               char *forward_depth_frag = workbench_build_forward_depth_frag();
                e_data.object_outline_sh = DRW_shader_create(
                        forward_vert, NULL,
-                       forward_depth_frag, defines);
+                       datatoc_workbench_forward_depth_frag_glsl, defines);
+               e_data.object_outline_texture_sh = DRW_shader_create(
+                       forward_vert, NULL,
+                       datatoc_workbench_forward_depth_frag_glsl, 
defines_texture);
                e_data.object_outline_hair_sh = DRW_shader_create(
                        forward_vert, NULL,
-                       forward_depth_frag, defines_hair);
+                       datatoc_workbench_forward_depth_frag_glsl, 
defines_hair);
 
 
                e_data.checker_depth_sh = DRW_shader_create_fullscreen(
                        datatoc_workbench_checkerboard_depth_frag_glsl, NULL);
                MEM_freeN(forward_vert);
-               MEM_freeN(forward_depth_frag);
                MEM_freeN(defines);
+               MEM_freeN(defines_texture);
                MEM_freeN(defines_hair);
        }
        workbench_fxaa_engine_init();
@@ -369,6 +367,7 @@ void workbench_forward_engine_free()
                DRW_SHADER_FREE_SAFE(e_data.transparent_accum_sh_cache[index]);
        }
        DRW_SHADER_FREE_SAFE(e_data.object_outline_sh);
+       DRW_SHADER_FREE_SAFE(e_data.object_outline_texture_sh);
        DRW_SHADER_FREE_SAFE(e_data.object_outline_hair_sh);
        DRW_SHADER_FREE_SAFE(e_data.checker_depth_sh);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to