Snap sprites to pixel grid in Renderer

Previously, we were doing so in the `SpriteCache` but that would cause
floating point errors that caused glyphs to sometimes be positioned
midway through a pixel.
This commit is contained in:
Antonio Scandurra 2021-03-26 11:07:16 +01:00
parent 61d4da9934
commit 466016a374
2 changed files with 5 additions and 6 deletions

View file

@ -293,11 +293,13 @@ impl Renderer {
glyph.origin, glyph.origin,
scene.scale_factor(), scene.scale_factor(),
) { ) {
// Snap sprite to pixel grid.
let origin = (glyph.origin * scene.scale_factor()).floor() + sprite.offset.to_f32();
sprites_by_atlas sprites_by_atlas
.entry(sprite.atlas_id) .entry(sprite.atlas_id)
.or_insert_with(Vec::new) .or_insert_with(Vec::new)
.push(shaders::GPUISprite { .push(shaders::GPUISprite {
origin: (glyph.origin * scene.scale_factor() + sprite.offset).to_float2(), origin: origin.to_float2(),
size: sprite.size.to_float2(), size: sprite.size.to_float2(),
atlas_origin: sprite.atlas_origin.to_float2(), atlas_origin: sprite.atlas_origin.to_float2(),
color: glyph.color.to_uchar4(), color: glyph.color.to_uchar4(),

View file

@ -23,7 +23,7 @@ struct GlyphDescriptor {
pub struct GlyphSprite { pub struct GlyphSprite {
pub atlas_id: usize, pub atlas_id: usize,
pub atlas_origin: Vector2I, pub atlas_origin: Vector2I,
pub offset: Vector2F, pub offset: Vector2I,
pub size: Vector2I, pub size: Vector2I,
} }
@ -109,13 +109,10 @@ impl SpriteCache {
bounds bounds
}); });
// Snap sprite to pixel grid.
let offset = glyph_bounds.origin().to_f32()
- vec2f(target_position.x().fract(), target_position.y().fract());
Some(GlyphSprite { Some(GlyphSprite {
atlas_id: atlasses.len() - 1, atlas_id: atlasses.len() - 1,
atlas_origin: atlas_bounds.origin(), atlas_origin: atlas_bounds.origin(),
offset, offset: glyph_bounds.origin(),
size: glyph_bounds.size(), size: glyph_bounds.size(),
}) })
}) })