Apos.Shapes
Shape rendering library for MonoGame and KNI.
Description
This library draws crisp anti-aliased shapes on the GPU using SDFs. It also draws text straight from a font’s outlines, SVG drawings straight from theirs, and textures with the SpriteBatch API. Shapes, text, drawings, and textures can be interleaved in any order. Everything renders together in a single batch that never needs to break.
Special thanks to Inigo Quilez for doing a lot of the work on the math functions. The text follows Eric Lengyel’s Slug algorithm, by way of Forme.

Features
- 11 shapes: Circle, Ellipse, Line, Path, Rectangle, Chamfer, Hexagon, Equilateral Triangle, Triangle, Arc, Ring
Fill,Border, andDrawvariants for every shape- Paths draw a polyline as one continuous shape, with round, miter, or bevel joins and round, butt, or square caps. Open or closed
- Rounded or chamfered corners, one per corner, plus rotation and adjustable anti-aliasing
- Dashed outlines and strokes, flat or round-capped, down to dotted lines
- Gradients: linear, radial, conical, spiral, and more, with repeat styles and Oklab / Oklch / RGB color interpolation. Shapes, text, and SVG drawings all take one
- Blurred shapes with a Gaussian edge, for drop shadows and glows
Measurefor every shape, giving the bounds it covers so a camera can cull it. No batch and no view needed- Blue noise dithering so slow gradients don’t band on 8-bit displays
- Text solved from the font’s own outlines in the shader. No atlas, so nothing picks a size up front and a glyph stays exact at any size, rotation, and zoom
- SVG drawings solved the same way, fills and strokes, in the file’s own colors and gradients or in one color of your own
- Textures (
SpriteBatchAPI) - Clipping to a rectangle
- One batch for everything. Mixing shapes, text, drawings, and textures never breaks the batch
- Precompiled shader embedded in the assembly using ShadowDusk. No need for Wine to build on Linux or macOS.
- Works with MonoGame 3.8.2+ and KNI
Documentation
You can also try the library directly in your browser here.
Getting started
Install with:
dotnet add package Apos.Shapes
Set the HiDef profile in your game’s constructor. (With KNI, use FL10_0 instead.) Create a ShapeBatch, then draw between Begin and End:
using Apos.Shapes;
public class Game1 : Game {
GraphicsDeviceManager _graphics;
ShapeBatch _sb;
public Game1() {
_graphics = new GraphicsDeviceManager(this);
_graphics.GraphicsProfile = GraphicsProfile.HiDef;
}
protected override void LoadContent() {
_sb = new ShapeBatch(GraphicsDevice);
}
protected override void Draw(GameTime gameTime) {
GraphicsDevice.Clear(new Color(17, 24, 39));
_sb.Begin();
_sb.FillCircle(new Vector2(120, 120), 75, new Color(96, 165, 250));
_sb.DrawRectangle(new Vector2(240, 70), new Vector2(150, 100), new Color(220, 38, 38), Color.White, 4f, 20f);
_sb.BorderLine(new Vector2(120, 240), new Vector2(390, 240), 15, Color.White, 2f);
_sb.End();
base.Draw(gameTime);
}
}
Read the Getting started guide for the full walkthrough.
Other projects you might like
- Apos.Gui - UI library for MonoGame.
- Apos.Input - Polling input library for MonoGame.
- Apos.History - A C# library that makes it easy to handle undo and redo.
- Apos.Content - Content builder library for MonoGame.
- Apos.Framework - Game architecture for MonoGame.
- AposGameStarter - MonoGame project starter. Common files to help create a game faster.