Pixel Art Lighterv 3.6.1

%

New Image Detected

This image's dimensions do not match existing maps.

Loading this image will clear previous maps.

Create Normal Map

Modify Normal Map

Apply Direction
Face Angle
  • Click - Select/deselect pixel cluster
  • Shift+Click - Add to selection
  • Alt+Click - Remove from selection

Changelog

v3.6.111-11-2026

  • Add new tool logo
  • Add changelog to online and downloadble tool versions
  • Adopted SemVer for public release (historical version numbers are preserved)
  • Various UI tweaks

v3.6.007-11-2026

  • Replaced all tool versions with refactored code
  • Split the editor controller into components
  • Reduced the main controller to coordination
  • More fixes on stylesheet and removal of repeated rules
  • Grouped responsive styles and shared theme colors
  • Cleanup various CSS

v3.5.2507-11-2026

  • Minor fixes

v3.5.2407-11-2026

  • Raised the generation limit to 2k textures
  • Updates to info page

v3.5.2306-11-2026

  • Removed redundant CSS slider polling/duplicate processes
  • Consolidated shortcut handling and export helpers
  • Minor fixes

v3.5.2205-11-2026

  • Final preperations for public release
  • Added Lightest Value for limiting generated highlights
  • Improved shortcut handling around controls and dialogs
  • Added wand stroke handling for dragged selections
  • Continued major refactor and cleanup work on separate version

v3.5.2127-10-2026

  • Updated shortcuts and tooltips
  • Replaced stale luminance and luminosity labels
  • Testing on functionality break for refactor and cleanup
  • Various minor fixes and improvements

v3.5.219-10-2026

  • Tweak interactive normal direction sphere and direction readout
  • Refined normal map modification
  • Several adjustments to the editor
  • Kept Hide BG off by default when loading images
  • More shortcut support
  • Documented refactor requirements and planning

v3.5.1816-10-2026

  • Bug fix

v3.5.1716-10-2026

  • Adjusted editor controls

v3.5.1616-10-2026

  • Various fixes and patching

v3.5.1516-10-2026

  • Removed auto update toggle
  • Renamed Light Mask as map name

v3.5.1416-10-2026

  • Minor fixes

v3.5.1315-10-2026

  • Add hint color option on modify windows

v3.5.1215-10-2026

  • UI tweaks
  • Bug fix

v3.5.1115-10-2026

  • Improved marquee tool

v3.5.115-10-2026

  • Test pencil tool

v3.5.015-10-2026

  • Implemented the normal direction sphere
  • Implement normal direction buttons
  • Add Average Angle calculation for normal apply
  • Improved marquee tool
  • Added a direction readout for inspection
  • Improved feedback during editing
  • Added checks of saved PNG contents during map export and overwrite

v3.4.114-10-2026

  • Various shortcuts added

v3.4.014-10-2026

  • Added canvas view export
  • Kept exported dimensions aligned with the canvas
  • Minor export fixes
  • Added selection source choices for Albedo Normal and Luminance Mask
  • Refined wand pencil and rectangular selection workflows
  • Updated selection handling
  • Prepared to split online version and download version without encoded samples

v3.3.213-10-2026

  • Added new button icons

v3.3.113-10-2026

  • Added new button icons
  • Minor fixes

v3.3.013-10-2026

  • Added contiguous selection
  • Various work done on modify tools
  • Added better handling for loaded textures with mismatched dimensions
  • Improved selection consistency
  • Add MIT license requirements
  • Bug fixes

v3.2.812-10-2026

  • Improved outline merging for normals
  • Added fixed and relative brightness adjustment
  • UI cleanup for online showcase

v3.2.707-10-2026

  • Reworked top texture load section and its buttons
  • Add simple light cursor and off options
  • Add dropdown for Light Cursor type selection

v3.2.607-10-2026

  • Reworked the point light visualization
  • Various UI adjustments

v3.2.506-10-2026

  • Reworked the UI
  • Add custom value input support on more parameters

v3.2.406-10-2026

  • Refined map modification controls
  • Implement selection add/subtract functionality
  • Add marching ants template for selections
  • Improved selection undo and texture overlay handling
  • Minor fixes and required refactor logging

v3.2.305-10-2026

  • Add different custom colour picker
  • Display image dimensions above canvas
  • Various fix patches

v3.2.204-10-2026

  • Added the built in info page
  • Added version nr to UI
  • Updated supporting text

v3.2.104-10-2026

  • Added brightness adjustment
  • Refined the lighting and occlusion controls
  • Various improvements on texture modify tool

v3.2.003-10-2026

  • Add Modify buttons
  • Implement magic wand tool for cluster selection
  • Added map modification with surface direction tilt and basic controls
  • Added basic undo support for texture modifications
  • Updated normal strength and edge width generation controls
  • Add buttons for BG controls
  • Add manual BG color selection
  • Replace web default color picker with custom template
  • UI Changes
  • Minor fixes

v3.1.2202-10-2026

  • Added early selection and modification workflow
  • Improved the generator controls

v3.1.2101-10-2026

  • Add toggle for Auto updating loaded textures
  • Improved texture loading and map viewing
  • Minor fixes

v3.1.201-10-2026

  • Rework colour selection dialogs
  • Improved texture inspection
  • Updated zoom fit and automatic texture updating
  • Test automatic file update refresh in browsers

v3.1.119-09-2026

  • Added separate map views and a combined lighting preview
  • Generated and exported Normal and Light Mask maps
  • Added new normal preset, adjusted existing preset parameters
  • Improve shape strength outline merging facet splitting darkest value and cavity darkening controls
  • Added background color detection and Hide BG button
  • Started documenting required refactoring of quick patches

v3.1.004-09-2026

  • Named tool Pixel Art Lighter
  • Updates to the Luminance Mask workflow
  • Allowed shadow and occlusion decisions to be edited independently of surface direction
  • Implement experimental map editing tool and button from v2
  • Improve shape strength edge handling facet splitting and outline treatment
  • Fixes on shared pixel coordinates for source textures generated maps and preview
  • Started the Architecture Character Object and Terrain presets
  • Began the downloadable single file edition and online demo
  • Various UI changes
  • Bug fixes

v3.0.003-09-2026

  • Prepared a standalone HTML browser build and converted v2 project
  • Combined earlier generator and lighting preview experiments into the first named application
  • Added the Albedo Normal and Luminance Mask workspace
  • Improved preset based normal generation and live point light preview
  • Separated map inspection from the final lighting view
  • Implement Figma dark navy UI template
  • Improved the responsive editor layout
  • Added more consistent canvas sizing
  • Added independent texture loading removal map viewing and PNG export
  • Improved the browser canvas renderer
  • Various UI and layout changes
  • Various adjustments to the workspace
  • Anchored wheel zoom at the cursor
  • Added middle mouse panning alongside Space drag

v2.6.023-06-2026

  • Combined the normal map generator and original lighting test project
  • Added a reusable texture record with dimensions pixel data and alpha
  • Added dimension checks before applying generated maps
  • Added checks for dimension changes on file load
  • Standardised PNG output dimensions to the source texture
  • Experimental Merge Outlines function to reduce lighting seams
  • Add support for custom value input
  • Adjusted the allowed ranges for various parameters
  • Renamed Luminosity to Luminance mask

v2.5.220-06-2026

  • Refactor
  • Minor fixes

v2.5.119-06-2026

  • Refined preset values for surface estimation
  • Adjusted normal strength and shape response
  • Minor processing changes
  • Minor UI tweaks

v2.5.012-06-2026

  • Added Architecture/Character/Object normal presets
  • Tested Shape Strength and Normal Strength controls
  • Added Edge Width and Facet Splitting controls
  • Added Darkest Value for limiting minimum light reception
  • Improved default settings for both map generations
  • Various prototyping for texture modification and edit tools

v2.4.104-06-2026

  • Improved handling of isolated color clusters
  • Refined transparent edge processing
  • Various fixes

v2.4.028-05-2026

  • Worked on connected color region processing
  • Added a better cavity darkening pass
  • Support preserved alpha during normal map generation and export
  • Added safeguards for transparent pixels and sprite edges

v2.3.218-05-2026

  • Refined luminosity mask parameters
  • Adjusted preview response
  • Minor fixes

v2.3.118-05-2026

  • Add UI icon
  • Bug fixes

v2.3.017-05-2026

  • Added basic editable Luminosity Mask pass based on source brightness
  • Added minimum light and cavity darkening parameters
  • Added a combined preview using texture normal direction and light reception
  • Test light colour ambient contribution height falloff and power controls
  • Added draggable point light placement and reset to centre
  • Fix fit to canvas
  • Add zoom slider controls
  • Implement point light follow cursor option

v2.2.230-04-2026

  • Refined facet boundaries and border handling
  • Improved small region cleanup
  • Various general adjustments

v2.2.129-04-2026

  • Minor fixes

v2.2.028-04-2026

  • Added better faceted normal generation based on estimated height and sprite silhouette
  • Improve broad gradients with quantised surface direction replacement
  • Tested new border facet handling
  • Merged small normal regions
  • Several UI changes and improvement
  • Tested a comparison switch for the original and faceted passes
  • Add new checks

v2.1.402-04-2026

  • Improved neighbourhood sampling
  • Adjusted direction quantisation
  • Minor bug fixes

v2.1.301-04-2026

  • Test outline inclusion into normal map clusters

v2.1.222-03-2026

  • Tested experimental batch processing for sprite to normal map and luminosity conversion
  • Added neighbourhood sampling and direction quantisation
  • Test an outline aware pass
  • Added encoded sample sprites for comparison

v2.1.101-03-2026

  • Refined the point light preview
  • Add remove texture buttons
  • Adjusted the normal map clustering
  • General cleanup & minor fixes

v2.1.014-02-2026

  • Established the second generation faceted normal prototype
  • Added a structured source image and normal map pipeline
  • Update point light preview with drag positioning
  • Update albedo and normal map preview modes
  • Added better controls for light and ambient illumination
  • Revisited the v1 lighting experiment to better retain pixel art edges and limited palettes
  • Compared brightness based surface estimates with silhouette and cluster based estimates
  • Tested normal vector quantisation and simplified facet boundaries
  • Improve outline merging and small region cleanup
  • Added offline point light test page

v2.0.229-01-2026

  • Various fixes

v2.0.128-01-2026

  • Tested simplified surface directions
  • Added early facet grouping
  • Adjusted the preview calculations

v2.0.020-01-2026

  • Implement new faceted normal generation
  • Added better texture view switching
  • Added initial image comparison
  • Remove directional light support due to issues
  • Fixes on normal export
  • UI updates and improvements
  • Various fixes and patching improvements

v1.5.129-12-2025

  • Added ambient contribution and slider control
  • Refined ambient contribution and light elevation
  • Improved the normal inspection view
  • Minor fixes

v1.5.019-12-2025

  • Added a more stable light preview calculation
  • Improve adjustable light elevation
  • Added new texture switch dropdown
  • Added basic luminosity mask implementation
  • Add active filename display
  • Added texture reload for externally edited sprites
  • Added slider reset to default buttons
  • UI updates
  • Various fixes and improvements

v1.4.108-12-2025

  • Improved image fit behavior
  • Added zoom controls
  • Adjusted source and normal alignment
  • Add directional light
  • Add point light falloff setting
  • General cleanup

v1.4.029-11-2025

  • Work on click and drag placement for point light
  • Added light elevation slider
  • Added image fit for differently sized sprites to canvas
  • Improved source and normal alignment at native dimensions

v1.3.220-11-2025

  • Various fixes

v1.3.119-11-2025

  • Improved normal decoding
  • Adjusted diffuse and ambient response
  • Update light color picker
  • Added more error checks
  • Minor fixes

v1.3.008-11-2025

  • Update normal map input and CPU based lighting for previews
  • Work on RGB normal decoding into surface direction vectors
  • Work on light response
  • Fixed neutral material mode causing incorrect light calculations
  • Added checks for missing or differently sized images
  • Add file drag and drop support
  • Add project to game git for version control
  • Implement better light falloff
  • Minor fixes

v1.2.128-10-2025

  • Improved canvas scaling
  • Refined transparency display
  • Implement updates from albedo to normal conversion
  • General adjustments

v1.2.018-10-2025

  • Added new basic texture preview and separate normal map preview
  • Support local PNG loading
  • Update canvas renderer with nearest-neighbour scaling
  • Fix zoom to fit and checkerboard transparency
  • Update source and normal comparison
  • Minor fixes

v1.1.104-10-2025

  • Improved the lighting test canvas
  • Implement scroll and zoom function
  • Adjusted light controls
  • Minor fixes

v1.1.027-09-2025

  • Added normal map visualisation and directional lighting
  • Added light direction and color controls
  • Added a test texture for comparing flat and varied normal directions
  • Rename color texture to Albedo
  • Bug fixes

v1.0.318-09-2025

  • Adjust the initial preview
  • Improved normal data inspection
  • Add normal export function
  • Implement new color to normal algorithm

v1.0.212-09-2025

  • Added basic canvas preview using source texture and normal map
  • Added a static preview light
  • Added neutral preview mode

v1.0.109-09-2025

  • Various improvements and fixes

v1.0.008-09-2025

  • Initial prototype for converting a sprite to normal map
  • Added a basic surface normal lighting pass
  • Added direct inspection of normal map data

v0.3.022-08-2025

  • Tested basic surface direction estimates from sprite brightness
  • Comparing various lighting responses
  • Early internal work

v0.2.005-08-2025

  • Tested normal map colours and simple light calculations
  • Added a small preview page

v0.1.019-07-2025

  • Initial experiments with sprite lighting
  • Basic image loading and pixel inspection
  • Early prototype work

Pixel Art Lighter v 3.6.1

Pixel Art Lighter is a free tool for generating, editing and previewing normal maps and light masks for pixel art. It was developed for the indie game Moonfell RPG.

Why I built it

Normal maps are traditionally used to add surface detail to low-poly 3D models. The same tech can be utilized for 2D art, allowing dynamic lighting on an otherwise static image.

For my indie game, I wanted to add lighting to pixel art without losing its distinct style.

Available tools repeatedly caused the same issue: generated normal maps made the original sprite look bad. The reason for this seemed fairly simple: depth estimation introduces information not present in the original art. This typically results in blobby-looking sprites that destroy the original aesthetic.

Eventually, I decided to research and test how to dynamically light sprites while preserving their original appeal. This led to a custom lighting system for my game and this tool to speed up map creation and editing.

Why it is specific to pixel art

In pixel art, a change in color can represent shading, an outline, a material boundary or fine detail. It does not necessarily represent a change in depth. Converting every contrast edge into surface relief can produce unwanted ridges and noisy or overly smooth lighting.

For example, since objects in the real world do not contain drawn outlines, we should consider them a stylistic choice. It's best not to treat them as part of a sprite’s suggested geometry, but instead give them the normal direction of their associated surface.

This tool uses connected color clusters as working regions, limits generated normal directions and handles outlines, keeping the final map faceted rather than smoothly shaded. The approach suits artwork built from deliberate pixel shapes and limited palettes.

How the maps work

The albedo (your original sprite/artwork) provides the color and alpha.
The normal map describes the direction each pixel’s surface faces.
The light mask controls how much direct light each pixel receives.

Lighting sprites works reasonably well with either map alone, but combining them provides clear benefits; normal maps make dynamic lights react to intended geometry, while light masks protect areas that should remain dark, whether from natural occlusion or for artistic purposes.

Normal map generation

A common normal-map workflow derives surface directions from a height map or 3D model. Other tools use algorithms to estimate shapes from a provided color map, which leads to physically inaccurate albeit serviceable maps.

Pixel Art Lighter uses an estimated height field and belongs to the latter category. It groups connected pixels of the same color, estimates surface shape from image brightness and silhouette, then assigns simplified surface directions to those groups.

Larger groups can be split into multiple clean facets. Optional outline merging tries to carry nearby surface directions into dark outlines.

Light mask generation

The light mask starts from your albedo’s brightness, with controls for minimum light reception and additional darkening of enclosed dark regions.

Light masks are much easier to create in traditional image editing software, but generation is included here for speed and convenience. It supports the same editing tools as normal maps.

How to use

Main

  • Load maps: Browse or drop PNG files for Albedo, Normal and Light Mask. Start with your albedo and load or generate matching maps. Linked files can reload automatically in supported browsers.
  • Preview lighting: Move the point light by dragging, or enable Follow Mouse. Adjust light color, height, falloff, brightness, ambient light and Light Mask influence. View switches between the final lighting and individual maps.
  • Background: Set BG Color or use Detect BG to sample the image border. Hide BG hides matching pixels.
  • Navigation: Use the zoom controls, pinch or Ctrl-wheel to zoom. Fit shows the whole image. Hold Space and drag, or middle mouse drag, to pan when zoomed in.

Create maps

  • Normal: Choose a preset, then adjust Shape Strength, Normal Strength, Edge Width and Facet Splitting. Merge Outlines attempts to include outlines in nearby surfaces.
  • Light Mask: Adjust Shading Strength, Darkest Value, Lightest Value and Cavity Darkening to control light reception.

Modify maps

Both maps can be corrected manually. Click Modify under the map you want to edit. The lighting preview updates as changes are made.

  • Wand (W): Click a pixel color cluster to select/deselect it. Shift-click adds clusters; Alt-click removes them. Drag to use as quick selection tool. Wand Source chooses which map supplies the selection colors. Contiguous limits selection to connected pixels; turn it off to select matching colors across the image.
  • Pencil (B) and Marquee (M): Draw a pixel selection or drag a rectangle. Shift adds to the selection; Alt removes from it.
  • Options: Fill Holes fills small enclosed gaps. Merge Outlines to include outlines in the selection. Selection Color changes its display color. Toggle Show Texture to compare the edited map with its lighting result.
  • Normal: Assign a direction using Apply Direction or click a facet in Face Angle sphere. Adjust Angle Strength to change the tilt. Average Angle averages the existing normals across selected pixels. Normal Strength adjusts the entire map.
  • Light Mask: Adjust selected regions using Relative brightness changes or set them to a Fixed value.

Export

Use Export under Normal or Light Mask to save that map as a PNG. The download button over the canvas saves the final lighting as a PNG.

Using in a game engine

Godot 4

Assign a CanvasTexture to Sprite2D. Set Diffuse to the albedo, Normal Map to the normal texture, and Specular to the light mask; add a PointLight2D. Adjust Specular Color and Shininess as needed.

Unity (URP 2D)

Use Sprite-Lit-Default material. In Sprite Editor > Secondary Textures, assign the normal texture as _NormalMap. Enable normal-map use on Light 2D. The light mask needs a custom Sprite Lit shader that multiplies direct lighting by its red channel; the built-in _MaskTex uses blend-style channels.

GameMaker

Use a custom lighting shader. Draw the albedo with shader_set(); bind normal and mask textures with shader_get_sampler_index() and texture_set_stage(). Decode normals from RGB to -1..1, calculate diffuse lighting, and multiply direct light by the mask red channel. Call shader_reset() after drawing.

Invert the green channel in the shader if the lighting appears reversed.

References: Godot · Unity · GameMaker

Limitations

Normal Maps

  • Generated normal maps are estimates. Manual correction is expected where the inferred shape does not match the artwork, particularly on large, complex or hard-surface subjects.
  • The tool cannot reliably distinguish painted shading from material color or recover an object’s actual geometry.

I’m hoping to introduce more advanced shape estimation and welcome any help or insight.

Light Masks

  • The light mask is an artistic control for pixel light reception. It does not calculate cast shadows or physical occlusion.
  • The generated mask is derived entirely from the brightness of the albedo texture.

Performance

  • To keep the tool lightweight and the code simple, lighting and map generation run on CPU in your browser’s main JavaScript thread. It does not use WebGL at this time.
  • Generation is limited to 2048×2048 (or equivalent dimensions). Large/complex images use more memory and may pause the interface during generation. Preview speed depends on image size and hardware.
  • The tool is suited to pixel art assets, not high-resolution textures.

Compatibility

Chrome and Edge are recommended for automatic file refresh if you are editing and saving in a third party app. Brave supports automatic updates if File System Access API is enabled. Not tested in other browsers.

Copyright © 2026 Red Hat Sprite.
Free and open source under the MIT License.
Suggestions are welcome. Enjoy and have fun :)