From eeda9369b6e63e38a82292f0b42eefc8247e4348 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 4 Jun 2019 11:28:21 +0200 Subject: TexturePaint: Missing Texture Depth Test Depth testing was off as it used the precomputed ModelView matrix. As draw engines currently use a different approach the depth was sometimes a bit off making the color disappear. This change will use a different vertex shader that will write the correct depth. I expected the same change to be needed in the bone selection overlay but was not able to reproduce it. Reviewed By: fclem Maniphest Tasks: T64615 Differential Revision: https://developer.blender.org/D5006 --- source/blender/draw/CMakeLists.txt | 1 + source/blender/draw/modes/paint_texture_mode.c | 15 ++++++++++----- source/blender/draw/modes/paint_vertex_mode.c | 4 ++-- .../draw/modes/shaders/paint_face_selection_vert.glsl | 19 +++++++++++++++++++ .../blender/draw/modes/shaders/paint_face_vert.glsl | 12 ++---------- 5 files changed, 34 insertions(+), 17 deletions(-) create mode 100644 source/blender/draw/modes/shaders/paint_face_selection_vert.glsl (limited to 'source/blender') diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index ade1ec5d53b..44551a4e04b 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -318,6 +318,7 @@ data_to_c_simple(modes/shaders/paint_vertex_frag.glsl SRC) data_to_c_simple(modes/shaders/paint_vertex_vert.glsl SRC) data_to_c_simple(modes/shaders/paint_weight_frag.glsl SRC) data_to_c_simple(modes/shaders/paint_weight_vert.glsl SRC) +data_to_c_simple(modes/shaders/paint_face_selection_vert.glsl SRC) data_to_c_simple(modes/shaders/paint_face_vert.glsl SRC) data_to_c_simple(modes/shaders/paint_wire_frag.glsl SRC) data_to_c_simple(modes/shaders/paint_wire_vert.glsl SRC) diff --git a/source/blender/draw/modes/paint_texture_mode.c b/source/blender/draw/modes/paint_texture_mode.c index 66e2cf7122d..a31efccda88 100644 --- a/source/blender/draw/modes/paint_texture_mode.c +++ b/source/blender/draw/modes/paint_texture_mode.c @@ -47,6 +47,7 @@ extern char datatoc_paint_texture_frag_glsl[]; extern char datatoc_paint_wire_vert_glsl[]; extern char datatoc_paint_wire_frag_glsl[]; extern char datatoc_paint_face_vert_glsl[]; +extern char datatoc_paint_face_selection_vert_glsl[]; extern char datatoc_gpu_shader_uniform_color_frag_glsl[]; @@ -144,8 +145,14 @@ static void PAINT_TEXTURE_engine_init(void *vedata) if (!sh_data->fallback) { const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[draw_ctx->sh_cfg]; - sh_data->fallback = GPU_shader_get_builtin_shader_with_config(GPU_SHADER_3D_UNIFORM_COLOR, - draw_ctx->sh_cfg); + sh_data->fallback = GPU_shader_create_from_arrays({ + .vert = (const char *[]){sh_cfg_data->lib, + datatoc_common_view_lib_glsl, + datatoc_paint_face_vert_glsl, + NULL}, + .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL}, + .defs = (const char *[]){sh_cfg_data->def, NULL}, + }); sh_data->image = GPU_shader_create_from_arrays({ .vert = (const char *[]){sh_cfg_data->lib, @@ -180,7 +187,7 @@ static void PAINT_TEXTURE_engine_init(void *vedata) sh_data->face_select_overlay = GPU_shader_create_from_arrays({ .vert = (const char *[]){sh_cfg_data->lib, datatoc_common_view_lib_glsl, - datatoc_paint_face_vert_glsl, + datatoc_paint_face_selection_vert_glsl, NULL}, .frag = (const char *[]){datatoc_common_view_lib_glsl, datatoc_gpu_shader_uniform_color_frag_glsl, @@ -433,8 +440,6 @@ static void PAINT_TEXTURE_engine_free(void) { for (int sh_data_index = 0; sh_data_index < ARRAY_SIZE(e_data.sh_data); sh_data_index++) { PAINT_TEXTURE_Shaders *sh_data = &e_data.sh_data[sh_data_index]; - /* Don't free builtins. */ - sh_data->fallback = NULL; GPUShader **sh_data_as_array = (GPUShader **)sh_data; for (int i = 0; i < (sizeof(PAINT_TEXTURE_Shaders) / sizeof(GPUShader *)); i++) { DRW_SHADER_FREE_SAFE(sh_data_as_array[i]); diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c index b4438b7e69e..862fb92287c 100644 --- a/source/blender/draw/modes/paint_vertex_mode.c +++ b/source/blender/draw/modes/paint_vertex_mode.c @@ -33,7 +33,7 @@ #include "DEG_depsgraph_query.h" -extern char datatoc_paint_face_vert_glsl[]; +extern char datatoc_paint_face_selection_vert_glsl[]; extern char datatoc_paint_weight_vert_glsl[]; extern char datatoc_paint_weight_frag_glsl[]; extern char datatoc_paint_vertex_vert_glsl[]; @@ -137,7 +137,7 @@ static void PAINT_VERTEX_engine_init(void *vedata) sh_data->face_select_overlay = GPU_shader_create_from_arrays({ .vert = (const char *[]){sh_cfg_data->lib, datatoc_common_view_lib_glsl, - datatoc_paint_face_vert_glsl, + datatoc_paint_face_selection_vert_glsl, NULL}, .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL}, .defs = (const char *[]){sh_cfg_data->def, NULL}, diff --git a/source/blender/draw/modes/shaders/paint_face_selection_vert.glsl b/source/blender/draw/modes/shaders/paint_face_selection_vert.glsl new file mode 100644 index 00000000000..4b5191ead07 --- /dev/null +++ b/source/blender/draw/modes/shaders/paint_face_selection_vert.glsl @@ -0,0 +1,19 @@ + +in vec3 pos; +in vec4 nor; /* select flag on the 4th component */ + +void main() +{ + vec3 world_pos = point_object_to_world(pos); + gl_Position = point_world_to_ndc(world_pos); + + /* Don't draw faces that are selected. */ + if (nor.w > 0.0) { + gl_Position = vec4(0.0, 0.0, 0.0, 1.0); + } + else { +#ifdef USE_WORLD_CLIP_PLANES + world_clip_planes_calc_clip_distance(world_pos); +#endif + } +} diff --git a/source/blender/draw/modes/shaders/paint_face_vert.glsl b/source/blender/draw/modes/shaders/paint_face_vert.glsl index 4b5191ead07..d135071c15c 100644 --- a/source/blender/draw/modes/shaders/paint_face_vert.glsl +++ b/source/blender/draw/modes/shaders/paint_face_vert.glsl @@ -1,19 +1,11 @@ - in vec3 pos; -in vec4 nor; /* select flag on the 4th component */ void main() { vec3 world_pos = point_object_to_world(pos); gl_Position = point_world_to_ndc(world_pos); - /* Don't draw faces that are selected. */ - if (nor.w > 0.0) { - gl_Position = vec4(0.0, 0.0, 0.0, 1.0); - } - else { #ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); + world_clip_planes_calc_clip_distance(world_pos); #endif - } -} +} \ No newline at end of file -- cgit v1.2.3