The 3D Handbook
Key term

Specular aliasing

The sparkling and shimmering of highlights on glossy, bumpy or finely detailed surfaces; why mipmapped normal maps and dense geometry cause it, how studios fix it in content (Toksvig, roughness mips, The Order 1886) and at runtime (TAA, geometric specular AA, roughness limiters), and what artists can do.

materialsrenderingnormal-mapsoptimisation

Specular aliasing is the sparkle, flicker and crawling of highlights on glossy surfaces with fine detail. Godot's antialiasing guide describes aliasing as a "staircase" on edges and as "flickering and/or sparkles on reflective surfaces (specular aliasing)" (Godot documentation: 3D antialiasing). Think of a polished, normal-mapped floor that fizzes with white pixels as you walk, or the edge highlights of a dense metal grille that crawl when the camera moves.

Ready at Dawn, who built The Order: 1886, found that "shader aliasing became a common problem for surfaces with low specular roughness", causing highlights "to flicker and shimmer over time, which can be highly distracting for the viewer" (Neubelt & Dawn) 2013).

#Why it happens

Each pixel evaluates the lighting once, at one point. Stefan Groenewoud, a senior staff technical artist at Bend Studio, puts it this way: "Your pixel shader evaluates the BRDF at one fixed point on screen per pixel" (ArtStation blog: Day 24 - Quick - Specular Aliasing). If the surface direction changes a lot inside that pixel, one sample cannot represent it, and which direction gets sampled changes from frame to frame.

Glossiness makes it worse: "The smoother your material, the worse it is; a tight specular lobe amplifies every small normal deviation" (ArtStation blog: Day 24 - Quick - Specular Aliasing). Two sources feed the problem:

  • Normal maps at a distance. Mipmaps average the normals, and "The result of averaging or interpolating unit normals is less than unit length" (Toksvig 2004). Shaders normally renormalise that shorter vector, so the bumps disappear from the low mips, but the roughness map still says "glossy". The surface becomes a smooth mirror built from noisy samples.
  • Dense geometry. Small bevels, cables, grilles and distant high-poly meshes have more curvature per pixel than one sample can capture (ArtStation blog: Day 24 - Quick - Specular Aliasing).
Left, four short arrows on a line, tilted by plus and minus 15 and 35 degrees, labelled mip 0. An arrow leads to a single vertical orange arrow, shorter than a dashed reference of full length, labelled "mip 1: the average is only 0.89 long". Right, two notes: renormalised as usual, the surface is flat and still glossy, so the highlight sparkles; with Toksvig or roughness mips, the shortening is turned into extra roughness in that mip level. Bottom: the result is a wider, dimmer highlight at distance that matches the average of the bumps.
Averaging bumpy normals gives a shorter vector. That lost length is a measure of how bumpy the area was, and can be put back as roughness.Diagram by the handbook author

#Fixing it in the content

The idea, first published by Michael Toksvig at NVIDIA in 2004, is to use that lost length rather than throw it away: "the shortening can be used as a measure of normal variation to eliminate the common problem of strobing/sparkling noise" (Toksvig 2004). Lowering the gloss where normals disagree "makes the specular highlight wider and fainter making the surface appear more dull" (Toksvig 2004), which is what the bumpy surface really looks like from far away.

Studios moved this work offline:

  • Stephen Hill's 2011 Specular Showdown in the Wild West proposed a Toksvig map: "pre-compute the Toksvig Factors from a gaussian-filtered version of each MIP level" and "Store the Toksvig Factor in a texture" (Self Shadow: Specular Showdown in the Wild West).
  • For The Order: 1886, Ready at Dawn built it into their texture pipeline. The adjusted value "is stored in the texels of the various mip levels of the roughness map", with results "very similar to using Toksvig's formula to pre-compute a roughness map" (Neubelt & Dawn) 2013). It costs nothing at runtime.
  • Groenewoud's recommendation today is the same: "generate roughness mips to account for normal variance" (ArtStation blog: Day 24 - Quick - Specular Aliasing).

In engines this is usually a texture setting:

  • Unreal Engine: assign the normal map as the Composite Texture of the roughness texture. It targets "Aliasing or shimmering of normal maps in the distance", raising roughness where the normal map varies, with Composite Power controlling the strength. It requires the two maps to share a UV layout and ignores direction (it is isotropic) (Unreal Engine documentation: Composite Texture).
  • Godot: set Roughness > Src Normal on the roughness texture's import. Godot says this "can help decrease specular aliasing slightly in 3D" (Godot documentation: Importing images).

#Fixing it at render time

#What artists can do

#Further reading and watching

Related: normal map, roughness map, mipmaps, physically based rendering, exposure and post-processing.

References

  1. Godot Engine contributors · 3D antialiasing (documentation source) · Godot documentation (GitHub) · docs · accessed 2026-10-21
  2. David Neubelt and Matt Pettineo (Ready at Dawn) · Crafting a Next-Gen Material Pipeline for The Order: 1886 · SIGGRAPH 2013 Physically Based Shading course, 2013 · paper · accessed 2026-10-21
  3. Stefan Groenewoud (Bend Studio) · Day 24 - Quick - Specular Aliasing · ArtStation blog, 2026 · article · accessed 2026-10-21
  4. Michael Toksvig · Mipmapping Normal Maps · NVIDIA technical brief, 2004 · paper · accessed 2026-10-21
  5. Stephen Hill · Specular Showdown in the Wild West · Self Shadow (blog), 2011 · article · accessed 2026-10-21
  6. Epic Games · Composite Texture (Unreal Engine 4.27) · Unreal Engine documentation, 2021 · docs · accessed 2026-10-21
  7. Godot Engine contributors · Importing images (documentation source) · Godot documentation (GitHub) · docs · accessed 2026-10-21
  8. Unity Technologies · Lit material Inspector reference (HDRP) · High Definition Render Pipeline manual 17.0 · docs · accessed 2026-10-21

Last updated 2026-10-22