Vertex Paint: Use Linear colors for interpolation.
This matches Cycles and Eevee's behaviour.
This commit is contained in:
parent
a2b05accea
commit
befbf7eb9b
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue