Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

Grounded horror lighting: the flipped-green normal map check, and a no-AI tool

A topic by Listwright created 7 days ago Views: 31
Viewing posts 1 to 1
Nine days left, so this is short and practical.

This jam is grounded horror. No ghosts, no curses, no folklore creatures. That puts the whole burden of "this place is real and something is wrong with it" on materials and light. A flashlight raking across wet concrete, rust, corrugated sheet or skin is the effect you are after, and a flat diffuse texture cannot produce it at any resolution. A normal map is what makes a surface answer a moving light.

THE BUG THAT EATS JAM BUILDS, AND HOW TO SEE IT IN 30 SECONDS

Normal maps come in two conventions. OpenGL puts +Y in the green channel, DirectX puts -Y. Unreal is the usual odd one out and wants -Y; Godot, Unity and Blender want +Y. Import settings can override either of those, which is exactly why memorising the table is worse than checking.

The check: drop one light low and to one side of your surface, then look. Raised detail should be bright on the side facing the light and dark on the far side. If your rivets, cracks and pores read as dents pressed into the wall instead, your green channel is inverted. Invert green and it is fixed. Nothing errors out when this is wrong, which is why people spend a whole jam moving lights around and concluding their materials just look like plastic.

HOW TO CHECK WHETHER A GENERATOR IS ACTUALLY CORRECT

Different question, same spirit. Almost no tool publishes its own error, so measure it yourself. Build a height field whose true surface normal is known in closed form, a paraboloid z = a(x^2 + y^2) is the easy one, push it through the generator, and compare the RGB it writes against the analytic normal, angle by angle. Then compare the mean angular error against the 8-bit quantisation floor, about 3.4 degrees, which is the shallowest slope an 8-bit PNG can represent at all. If the mean error sits above that floor, the error belongs to the tool and not to the file format. That is ten minutes in any language and it works on whichever tool you end up using.

ON THIS JAM'S AI RULE

The rules say AI-generated content has to be clearly disclosed, and that pre-made assets need permission and credit. Worth knowing where the line sits for textures. A site that invents a texture from a text prompt generates something new, and that is a disclosure. A tool that takes an image you already own and computes derived maps from it invents nothing, so there is nothing new to disclose, and whatever rights you held on the source you still hold on the output.

THE TOOL

Normal Forge is one HTML file. You open it in a browser and it keeps working with the network unplugged. A texture goes in; a normal map (OpenGL +Y or DirectX -Y, your choice), an ambient occlusion map and a cavity map come out. Every map is built on a wrapped height field, so a tileable source stays tileable, and it shows you a real 3x3 tiling assembled from the actual output rather than a mockup.

It ships the bench described above as a button, so you do not have to take my word for the numbers. Measured in Chrome on 2026-09-21, 27440 samples inside the valid radius: mean angular error 0.98 degrees, worst case 2.97, against that 3.37 degree 8-bit floor. The operator is more accurate than the format it writes into.

Nothing is generated and nothing is uploaded. It costs 3.00 EUR: https://listwright.itch.io/normal-forge

The green-channel check and the paraboloid bench are free and work on any tool, mine included. Good luck with your entries.