diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-03-09 19:09:01 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-03-09 19:09:32 +0300 |
commit | 29b405a32784f260d81d4acb1e154a17f4ccc155 (patch) | |
tree | 60dbf6948c19b37da9fcff432b6fb89e7b5e47da /source/blender | |
parent | 3912a2a227c9674476795407003e019ff9abc34d (diff) |
Overlay: Add antialiasing to particle sprites
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/draw/engines/overlay/overlay_shader.c | 2 | ||||
-rw-r--r-- | source/blender/draw/engines/overlay/shaders/particle_frag.glsl | 11 |
2 files changed, 10 insertions, 3 deletions
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c index 86d5f58957e..d5509c7f56b 100644 --- a/source/blender/draw/engines/overlay/overlay_shader.c +++ b/source/blender/draw/engines/overlay/overlay_shader.c @@ -1246,7 +1246,7 @@ GPUShader *OVERLAY_shader_particle_dot(void) datatoc_common_view_lib_glsl, datatoc_particle_vert_glsl, NULL}, - .frag = (const char *[]){datatoc_particle_frag_glsl, NULL}, + .frag = (const char *[]){datatoc_common_view_lib_glsl, datatoc_particle_frag_glsl, NULL}, .defs = (const char *[]){sh_cfg->def, "#define USE_DOTS\n", NULL}, }); } diff --git a/source/blender/draw/engines/overlay/shaders/particle_frag.glsl b/source/blender/draw/engines/overlay/shaders/particle_frag.glsl index a087aae2b2b..06197f63658 100644 --- a/source/blender/draw/engines/overlay/shaders/particle_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/particle_frag.glsl @@ -6,7 +6,8 @@ layout(location = 1) out vec4 lineOutput; void main() { - float dist = length(gl_PointCoord - vec2(0.5)); + vec2 uv = gl_PointCoord - vec2(0.5); + float dist = length(uv); if (dist > 0.5) { discard; @@ -15,5 +16,11 @@ void main() float intensity = sqrt(1.0 - dist * 2.0) * 0.5 + 0.5; fragColor = finalColor * vec4(intensity, intensity, intensity, 1.0); - lineOutput = vec4(0.0); + /* The default value of GL_POINT_SPRITE_COORD_ORIGIN is GL_UPPER_LEFT. Need to reverse the Y. */ + uv.y = -uv.y; + /* Subtract distance to outer edge of the circle. (0.75 is manually tweaked to look better) */ + vec2 edge_pos = gl_FragCoord.xy - uv * (0.75 / (dist + 1e-9)); + vec2 edge_start = edge_pos + vec2(-uv.y, uv.x); + + lineOutput = pack_line_data(gl_FragCoord.xy, edge_start, edge_pos); } |