From befbf7eb9b7d48113bb91c1fcf3febf439286134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Wed, 2 May 2018 16:17:05 +0200 Subject: Vertex Paint: Use Linear colors for interpolation. This matches Cycles and Eevee's behaviour. --- source/blender/draw/CMakeLists.txt | 2 ++ source/blender/draw/modes/paint_vertex_mode.c | 17 +++++------------ .../draw/modes/shaders/paint_vertex_frag.glsl | 17 +++++++++++++++++ .../draw/modes/shaders/paint_vertex_vert.glsl | 21 +++++++++++++++++++++ 4 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 source/blender/draw/modes/shaders/paint_vertex_frag.glsl create mode 100644 source/blender/draw/modes/shaders/paint_vertex_vert.glsl diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 6ee2acecbb4..cffd135369a 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -254,6 +254,8 @@ data_to_c_simple(modes/shaders/object_particle_dot_vert.glsl SRC) data_to_c_simple(modes/shaders/object_particle_dot_frag.glsl SRC) data_to_c_simple(modes/shaders/paint_texture_frag.glsl SRC) data_to_c_simple(modes/shaders/paint_texture_vert.glsl SRC) +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_wire_frag.glsl SRC) data_to_c_simple(modes/shaders/paint_wire_vert.glsl SRC) data_to_c_simple(modes/shaders/paint_vert_frag.glsl SRC) diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c index 2c963571302..a48effa4bfc 100644 --- a/source/blender/draw/modes/paint_vertex_mode.c +++ b/source/blender/draw/modes/paint_vertex_mode.c @@ -38,6 +38,8 @@ extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ extern struct GlobalsUboStorage ts; /* draw_common.c */ +extern char datatoc_paint_vertex_vert_glsl[]; +extern char datatoc_paint_vertex_frag_glsl[]; extern char datatoc_paint_wire_vert_glsl[]; extern char datatoc_paint_wire_frag_glsl[]; extern char datatoc_common_globals_lib_glsl[]; @@ -81,17 +83,15 @@ typedef struct PAINT_VERTEX_PrivateData { static void PAINT_VERTEX_engine_init(void *UNUSED(vedata)) { if (!e_data.vcolor_face_shader) { - e_data.vcolor_face_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR_ALPHA); - } + e_data.vcolor_face_shader = DRW_shader_create( + datatoc_paint_vertex_vert_glsl, NULL, + datatoc_paint_vertex_frag_glsl, NULL); - if (!e_data.wire_overlay_shader) { e_data.wire_overlay_shader = DRW_shader_create_with_lib( datatoc_paint_wire_vert_glsl, NULL, datatoc_paint_wire_frag_glsl, datatoc_common_globals_lib_glsl, "#define VERTEX_MODE\n"); - } - if (!e_data.face_overlay_shader) { e_data.face_overlay_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -113,13 +113,6 @@ static void PAINT_VERTEX_cache_init(void *vedata) DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_MULTIPLY); stl->g_data->fvcolor_shgrp = DRW_shgroup_create(e_data.vcolor_face_shader, psl->vcolor_faces); - - static float light[3] = {-0.3f, 0.5f, 1.0f}; - static float alpha = 1.0f; - static float world_light = 1.0f; - DRW_shgroup_uniform_vec3(stl->g_data->fvcolor_shgrp, "light", light, 1); - DRW_shgroup_uniform_float(stl->g_data->fvcolor_shgrp, "alpha", &alpha, 1); - DRW_shgroup_uniform_float(stl->g_data->fvcolor_shgrp, "global", &world_light, 1); } { diff --git a/source/blender/draw/modes/shaders/paint_vertex_frag.glsl b/source/blender/draw/modes/shaders/paint_vertex_frag.glsl new file mode 100644 index 00000000000..5a00fec9c43 --- /dev/null +++ b/source/blender/draw/modes/shaders/paint_vertex_frag.glsl @@ -0,0 +1,17 @@ + +in vec3 finalColor; + +out vec4 fragColor; + +vec3 linear_to_srgb_attrib(vec3 c) { + c = max(c, vec3(0.0)); + vec3 c1 = c * 12.92; + vec3 c2 = 1.055 * pow(c, vec3(1.0 / 2.4)) - 0.055; + return mix(c1, c2, step(vec3(0.0031308), c)); +} + +void main() +{ + fragColor.rgb = linear_to_srgb_attrib(finalColor); + fragColor.a = 1.0; +} diff --git a/source/blender/draw/modes/shaders/paint_vertex_vert.glsl b/source/blender/draw/modes/shaders/paint_vertex_vert.glsl new file mode 100644 index 00000000000..178f77c6b9c --- /dev/null +++ b/source/blender/draw/modes/shaders/paint_vertex_vert.glsl @@ -0,0 +1,21 @@ + +uniform mat4 ModelViewProjectionMatrix; + +in vec3 pos; +in vec3 color; + +out vec3 finalColor; + +vec3 srgb_to_linear_attrib(vec3 c) { + c = max(c, vec3(0.0)); + vec3 c1 = c * (1.0 / 12.92); + vec3 c2 = pow((c + 0.055) * (1.0 / 1.055), vec3(2.4)); + return mix(c1, c2, step(vec3(0.04045), c)); +} + +void main() +{ + gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); + + finalColor = srgb_to_linear_attrib(color); +} -- cgit v1.2.3