Low Poly Palette

Schirmer Labs in Materials and Shading


Low Poly Palette paints low poly assets by pointing their faces at a tiny shared texture. One material, one draw call, and a whole scene that recolours without a single face being repainted.


Installing

Low Poly Palette installs as a Blender extension. Drag the .zip straight into a Blender window, or go to Edit › Preferences › Add-ons › Install from Disk and pick the zip there.

It needs Blender 4.2 or newer and runs on 5.x. There are no dependencies, nothing to compile and no internet connection required.

Updating is the same action: install the newer zip over the old one. An in-place update does not need a Blender restart.


Where everything is

Surface How to reach it
Sidebar 3D viewport, N, tab Low Poly. Everything lives here: the palette grid, the gradient strips, the projection settings, the clean-up tools and the export check.
Strip tool Image editor, in the toolbar (T). The palette texture drawn at its real size, with the strips pickable and the active gradient's stops on handles.
Pie menu Ctrl Shift P in the 3D viewport, or right mouse button while the strip tool is active.

The pie menu holds the eight operations you reach for most: UV Snap, Project From View, Radial Snap, Along Axis, Gradient Path, Random Fill, Draw Shape and Add Gradient.


First palette in four steps

  1. New Palette. Creates the palette, the texture it lives in and the material that reads it. The defaults — eight strips of eight cells, two of them reserved for flat colour — give you sixteen flat colours and six gradient strips in a texture 64 pixels tall.
  2. Pick a colour in the swatch grid, or paste a whole set with Load Hex Colors.
  3. Apply Color. In edit mode it snaps the UVs of the selected faces onto the active cell. In object mode the whole mesh is assigned.
  4. Save Texture before you export anything. See Getting it out for why this matters.

From there the interesting part is not picking faces at all — it is asking the mesh a question and letting the answer do the painting.


Texture layout

The layout is set when the palette is created, and the strip count is fixed on purpose: adding colours or gradients later never moves a UV that is already painted. You can widen the texture halfway through a project and nothing you painted last week changes.

Setting Default Range What it does
Strips 8 1–64 Total strips in the texture.
Flat Strips 2 0–64 Strips reserved for one block of flat colours. Gradients fill in from the far end, so raising this costs them room but never moves one. It does move shade cells, which sit a block apart.
Cells per Strip 8 1–64 Flat colour cells in each reserved strip.
Strip Length 64 8–2048 Texture height in pixels, and how many steps a gradient is sampled at. Strips stand up, so this is the length of the gradient.
Strip px 8 2–64 Pixel width of each strip.
Shades 0 0–3 Derive this many darker and lighter versions of every colour. They follow the main colours automatically, so editing a colour updates its shades. Costs strips, but never moves one.
Step 0.15 0.01–0.9 How much lighter or darker each shade level goes, measured the way the eye reads it rather than in linear light.
Filter Smooth Smooth / Stepped Texture interpolation. Stepped makes gradients band and leaves flat colours exact.

Keep Strip px above 1. At one pixel, texture filtering can bleed between neighbouring strips and a face picks up a colour from next door. The minimum is 2 for exactly that reason, and the default of 8 has room to spare.

A sixteen cell palette becomes 48, 80 or 112 cells at one, two or three shade levels.


Building a palette

Operator What it does
Add Color Appends a colour, copying the active one.
Remove Color Removes it. Colours after it shift down one cell, so faces painted with them change colour — this is the one palette edit that is not free.
Load Hex Colors Builds the palette from a list of hex, as pasted from a palette site. Any separator works.
Copy Hex Puts the whole palette on the clipboard as hex. That is the whole of moving a palette to another file.
Add Harmony Appends the colours that go with the active one. Hue only — the saturation and brightness you picked stay where they are.
From Materials Builds the palette out of the materials the selection already has and repaints the faces onto it. Colours that round to the same hex become one cell. This is how an existing asset comes across.
Merge Into Active Folds another palette into this one and walks every face using it across. Two palettes on one asset are two materials and two draw calls; this is how they become one. A colour already in the target palette keeps the cell it had, so nothing is repainted.
Rebuild Texture Redraws the texture from the palette. Normally automatic — reach for this only if something looks stale.

Harmonies

Harmony Appends
Complementary The opposite hue.
Analogous The two neighbours, 30 degrees each side.
Triadic Two hues evenly spaced around the wheel.
Split Complementary The two either side of the opposite.
Tetradic Three hues at right angles around the wheel.

Painting

Operator What it does
Apply Color Snaps the UVs of the selected faces onto the active flat cell. In object mode the whole mesh is assigned.
Paint By Slope Faces that point up get one colour, everything steeper gets another. One operator, one angle — grass on the top, rock down the sides.
Random Fill Gives each connected part its own flat colour. This is how a field of rocks stops looking like one rock repeated.
Select Unpainted Selects the faces whose UVs are not sitting on a cell. Geometry out of an extrude, a subdivide or a boolean lands on whatever cell its UVs happened to fall on; this finds it.
Project Gradient Maps the active gradient strip across the target faces using the chosen projection. See below.
Hex To Gradient Rebuilds the active gradient's ramp from a hex list.

Gradients and projections

You do not pick faces. You tell the add-on what question to ask the mesh, and the answer decides where along the gradient each face lands.

Projection The question
View Along the current viewport direction. The one mode that needs a viewport open — it reads where you are looking right now.
Axis Along world X, Y or Z. Snow lines, rust rising from the ground.
Radial Distance from the 3D cursor.
Curve Position along a curve. Pick an existing one, or sketch it with Draw Shape.
Cavity The creases and ridges of the mesh itself — dirt down in the crevices, wear up on the edges.
Occlusion How shut in each point is, measured by casting rays over its hemisphere. A bowl goes dark because it is genuinely more enclosed, not because anybody selected those faces.
Vertex Group The weights you painted, for when none of the automatic ones is what you meant.

Range

Setting What it does
Auto Fit On by default: stretches the ramp across the extent of the selection. Turn it off to set From and To by hand, so separate assets match.
Per Object Fit each object separately instead of fitting them all as one.
From / To The positions mapped to the start and the end of the ramp, when Auto Fit is off.
Flip Reverses the gradient direction.
Ramp Start / Ramp End Use only a slice of the ramp, so several objects can share one strip.
Vertical View projection only: use the screen's up axis instead of its right axis.
Axis Axis projection only: X, Y or Z.
Group Vertex Group projection only. Objects without that group get the start of the ramp.

Blend

Where across the object the gradient actually changes, as a fraction of the range above.

  • From — everything below this keeps the first colour. At 0.2 the bottom fifth stays on it.
  • To — everything above this keeps the last colour.
  • Bring the two together for a narrow band. Set them equal for a hard two-tone split at that height.
  • Soft Blend — eases the blend in and out instead of running straight from one colour to the other.

Occlusion settings

  • Rays (default 16, 4–128) — rays cast over each vertex's hemisphere. More is smoother and slower; 16 is plenty on low poly.
  • Distance (default 1 m) — how far a ray looks for something to be blocked by. Roughly the size of the detail you want shaded, in the object's own units.

Steps

Setting Filter to Stepped bands a gradient into hard steps. The projection runs once; after that only the strip is rebuilt, so the terrain bands without a single UV moving.


Draw Shape

Drag a rough line, circle or rectangle over the viewport. The stroke snaps to the clean shape, the shape becomes a curve you can move, rotate and scale, and that curve is what Curve projection runs along.

It is in the pie menu, and in the sidebar under the projection settings.


Variants and the library

Operator What it does
Save Variant Keeps the palette's colours and their material values under a name, inside this .blend. The row it leaves behind is the switch.
Apply Variant Recolours every face painted from that palette at once. No UV moves — each face already points at cell N, and only what cell N holds changes.
Save To Library Writes the palette into one json beside the add-on's config, where every file on the machine can reach it. A variant lives only in the .blend it was saved in; the library outlives it.
Load Palette Loads one from the library. Twelve ship with the add-on. Loading is the same in-place recolour as a variant, so a palette can be swapped under an asset that is already painted.

Gradient strips are not part of a variant snapshot — the ramps stay where they are. A variant swaps flat colours and material values.


Material texture

An optional second texture on the same UVs holds roughness, metallic and emission per colour. Nothing has to be painted twice: the faces already point at the right cell.

Emit Boost (default 2.0) sets what a full Emit is worth as emission strength. It sits above 1 so a glow can actually bloom.


Clean-up

Operator What it does
Dissolve Planar Dissolves edges between near-coplanar faces. Drops poly count without changing the silhouette or the palette.
Snap To Grid Quantises vertex positions for a blockier silhouette.
Weld Merges vertices closer than a distance. Cleans up imported geometry.
Flat Shade Turns off smooth shading on the target faces.
Triangulate So the viewport matches the engine.

Getting it out

Save Texture — run this first

Generated images live in Blender's memory only. Until you run Save Texture, there is no file on disk, and an FBX, OBJ or glTF export will point at a texture that was never written. Save Texture writes the PNG next to the .blend and packs it.

If a texture looks missing in your engine or your exported file, this is almost always why. Export Check reports whether the texture exists as a file yet.

Bake To Vertex Colors

Reads the texture at every painted UV and writes it into a colour attribute, for engines that would rather have vertex colours than a texture. Afterwards the image can be deleted and the material slots cleared, and the colours are still there.

Gradients come across one sample per corner, which is the only place the two representations drift apart: a gradient that varies within a single face is flattened to its corner values.

Export Check

Counts what an export of the selection actually holds, and changes nothing:

  • Objects, verts and triangles across the selection
  • How many materials it costs in draw calls
  • Faces sitting on no cell
  • Objects with no UV map
  • Modifiers the triangle count did not see
  • Whether the texture exists as a file yet
40 objects  5656 verts  9664 tris
1 material = 1 draw call
LP_Palette is on disk

Game engines

The material is a Principled BSDF reading one image texture, so there is nothing exotic to translate. What matters on the engine side:

  • Set the texture filter to point / nearest in your engine's import settings, and turn off mipmaps or compression if colours start bleeding between cells at a distance. The cells are a few pixels wide; bilinear filtering and block compression are both happy to blend them.
  • Unity, Unreal, Godot — export with FBX or glTF after Save Texture. Materials come across as one material; the palette PNG is the base colour map.
  • Vertex colours instead — run Bake To Vertex Colors and use a shader that reads the colour attribute. No texture to import at all.
  • Blender's own renderers — Eevee and Cycles both render the material as-is.

Troubleshooting

My exported model has no texture

Run Save Texture and export again. Generated images exist only in memory until you do. Export Check tells you whether the file is on disk.

Colours bleed into each other in my engine

Texture filtering. Set the import filter to point / nearest and disable mipmaps or compression for that texture. Inside Blender, raise Strip px so there is more pixel room between strips.

New geometry came out the wrong colour

Faces from an extrude, a subdivide or a boolean land on whatever cell their UVs happened to fall on. Select Unpainted finds the ones sitting on no cell. Faces that landed on the wrong cell are, by definition, painted — those you repaint with Apply Color.

I removed a colour and faces changed colour

Expected. Remove Color shifts every colour after it down one cell, and the faces follow their cell. If you only wanted a different colour, edit the swatch in place instead of removing it.

Gradients look banded (or do not band)

Filter. Smooth interpolates, Stepped gives hard steps. Raising Strip Length samples the gradient more finely.

The asset has several palettes and two draw calls

Merge Into Active folds one palette into the other and moves its faces across. Export Check will confirm the draw call count afterwards.

The texture stopped updating by itself

Fixed in 0.21.1. If you are on an older build, update — earlier versions raised during start-up and the file watcher never started.

Low Poly Palette 0.21.2 · Blender 4.2 and newer · GPL-3.0-or-later. The full licence text ships in the add-on package as LICENSE.

$6.99

Support Period Included

Includes 12 months of

Extend this product’s Support Period +12 months: 75% of product price

Have questions before purchasing?
Login to message

Details
Blender Extension Compatible Yes
Published 6 days ago
Blender Version 4.2 - 5.2
Extension Type Add-on
Render Engine Used Cycles, Eevee
License GPL