Fix T67587: Fix Drawing in Wireframe Non X-Ray Mode

When using Vertex or Weight paint mode on a wireframe the overlay was
blended with the background. In this case we now use alpha blending.

Reviewed By: fclem

Differential Revision: https://developer.blender.org/D5340
This commit is contained in:
Jeroen Bakker 2019-07-25 08:51:59 +02:00
parent 66356dae94
commit 7bc300a74b
Notes: blender-bot 2023-02-14 01:35:50 +01:00
Referenced by issue #67587, WeightPaint color blends with viewport background in wireframe mode
4 changed files with 52 additions and 16 deletions

View File

@ -78,7 +78,8 @@ typedef struct PAINT_VERTEX_Data {
typedef struct PAINT_VERTEX_Shaders {
struct {
struct GPUShader *color_face;
struct GPUShader *color_face_mul_blending;
struct GPUShader *color_face_alpha_blending;
struct GPUShader *wire_overlay;
struct GPUShader *wire_select_overlay;
} by_mode[MODE_LEN];
@ -114,7 +115,7 @@ static void PAINT_VERTEX_engine_init(void *vedata)
const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
if (!sh_data->face_select_overlay) {
sh_data->by_mode[VERTEX_MODE].color_face = GPU_shader_create_from_arrays({
sh_data->by_mode[VERTEX_MODE].color_face_mul_blending = GPU_shader_create_from_arrays({
.vert = (const char *[]){sh_cfg_data->lib,
datatoc_common_view_lib_glsl,
datatoc_paint_vertex_vert_glsl,
@ -122,7 +123,15 @@ static void PAINT_VERTEX_engine_init(void *vedata)
.frag = (const char *[]){datatoc_paint_vertex_frag_glsl, NULL},
.defs = (const char *[]){sh_cfg_data->def, NULL},
});
sh_data->by_mode[WEIGHT_MODE].color_face = GPU_shader_create_from_arrays({
sh_data->by_mode[VERTEX_MODE].color_face_alpha_blending = GPU_shader_create_from_arrays({
.vert = (const char *[]){sh_cfg_data->lib,
datatoc_common_view_lib_glsl,
datatoc_paint_vertex_vert_glsl,
NULL},
.frag = (const char *[]){datatoc_paint_vertex_frag_glsl, NULL},
.defs = (const char *[]){sh_cfg_data->def, "#define DRW_STATE_BLEND_ALPHA\n", NULL},
});
sh_data->by_mode[WEIGHT_MODE].color_face_mul_blending = GPU_shader_create_from_arrays({
.vert = (const char *[]){sh_cfg_data->lib,
datatoc_common_view_lib_glsl,
datatoc_common_globals_lib_glsl,
@ -131,7 +140,18 @@ static void PAINT_VERTEX_engine_init(void *vedata)
.frag = (const char *[]){datatoc_common_globals_lib_glsl,
datatoc_paint_weight_frag_glsl,
NULL},
.defs = (const char *[]){sh_cfg_data->def, NULL},
.defs = (const char *[]){sh_cfg_data->def, "#define DRW_STATE_BLEND_MUL\n", NULL},
});
sh_data->by_mode[WEIGHT_MODE].color_face_alpha_blending = GPU_shader_create_from_arrays({
.vert = (const char *[]){sh_cfg_data->lib,
datatoc_common_view_lib_glsl,
datatoc_common_globals_lib_glsl,
datatoc_paint_weight_vert_glsl,
NULL},
.frag = (const char *[]){datatoc_common_globals_lib_glsl,
datatoc_paint_weight_frag_glsl,
NULL},
.defs = (const char *[]){sh_cfg_data->def, "#define DRW_STATE_BLEND_ALPHA\n", NULL},
});
sh_data->face_select_overlay = GPU_shader_create_from_arrays({
@ -140,7 +160,7 @@ static void PAINT_VERTEX_engine_init(void *vedata)
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},
.defs = (const char *[]){sh_cfg_data->def, "#define DRW_STATE_BLEND_MUL\n", NULL},
});
sh_data->vert_select_overlay = GPU_shader_create_from_arrays({
.vert = (const char *[]){sh_cfg_data->lib,
@ -195,13 +215,17 @@ static void PAINT_VERTEX_cache_init(void *vedata)
const RegionView3D *rv3d = draw_ctx->rv3d;
PAINT_VERTEX_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
const bool use_alpha_blending = draw_ctx->v3d->shading.type == OB_WIRE;
DRWState draw_state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL |
(use_alpha_blending ? DRW_STATE_BLEND_ALPHA : DRW_STATE_BLEND_MUL);
/* Vertex color pass */
{
DRWPass *pass = DRW_pass_create(
"Vert Color Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND_MUL);
DRWShadingGroup *shgrp = DRW_shgroup_create(sh_data->by_mode[VERTEX_MODE].color_face, pass);
DRW_shgroup_uniform_float_copy(
shgrp, "white_factor", 1.0f - v3d->overlay.vertex_paint_mode_opacity);
DRWPass *pass = DRW_pass_create("Vert Color Pass", draw_state);
GPUShader *shader = use_alpha_blending ?
sh_data->by_mode[VERTEX_MODE].color_face_alpha_blending :
sh_data->by_mode[VERTEX_MODE].color_face_mul_blending;
DRWShadingGroup *shgrp = DRW_shgroup_create(shader, pass);
DRW_shgroup_uniform_float(shgrp, "opacity", &v3d->overlay.vertex_paint_mode_opacity, 1);
if (rv3d->rflag & RV3D_CLIPPING) {
DRW_shgroup_state_enable(shgrp, DRW_STATE_CLIP_PLANES);
}
@ -211,9 +235,11 @@ static void PAINT_VERTEX_cache_init(void *vedata)
/* Weight color pass */
{
DRWPass *pass = DRW_pass_create(
"Weight Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND_MUL);
DRWShadingGroup *shgrp = DRW_shgroup_create(sh_data->by_mode[WEIGHT_MODE].color_face, pass);
DRWPass *pass = DRW_pass_create("Weight Pass", draw_state);
GPUShader *shader = use_alpha_blending ?
sh_data->by_mode[WEIGHT_MODE].color_face_alpha_blending :
sh_data->by_mode[WEIGHT_MODE].color_face_mul_blending;
DRWShadingGroup *shgrp = DRW_shgroup_create(shader, pass);
DRW_shgroup_uniform_bool_copy(
shgrp, "drawContours", (v3d->overlay.wpaint_flag & V3D_OVERLAY_WPAINT_CONTOURS) != 0);
DRW_shgroup_uniform_float(shgrp, "opacity", &v3d->overlay.weight_paint_mode_opacity, 1);

View File

@ -2,7 +2,7 @@
in vec3 finalColor;
out vec4 fragColor;
uniform float white_factor = 1.0;
uniform float opacity = 1.0;
vec3 linear_to_srgb_attr(vec3 c)
{
@ -14,6 +14,11 @@ vec3 linear_to_srgb_attr(vec3 c)
void main()
{
fragColor.rgb = mix(linear_to_srgb_attr(finalColor), vec3(1.0), white_factor);
vec3 color = linear_to_srgb_attr(finalColor);
#ifdef DRW_STATE_BLEND_ALPHA
fragColor = vec4(color, opacity);
#else
fragColor.rgb = mix(vec3(1.0), color, opacity);
fragColor.a = 1.0;
#endif
}

View File

@ -95,6 +95,11 @@ void main()
color = mix(weight_color, colorVertexUnreferenced, alert * alert);
}
#ifdef DRW_STATE_BLEND_ALPHA
/* alpha blending mix */
fragColor = vec4(color.rgb, opacity);
#else
/* mix with 1.0 -> is like opacity when using multiply blend mode */
fragColor = vec4(mix(vec3(1.0), color.rgb, opacity), 1.0);
#endif
}

View File

@ -144,7 +144,7 @@ typedef struct View3DCursor {
/** 3D Viewport Shading settings. */
typedef struct View3DShading {
/** Shading type (VIEW3D_SHADE_SOLID, ..). */
/** Shading type (OB_SOLID, ..). */
char type;
/** Runtime, for toggle between rendered viewport. */
char prev_type;