Limited Time Offer: Get 50% OFF Starter & Basic Yearly Plans 🎉

Offline Normal Map Generation for Photorealistic AI Video

Oct 13, 2026

Why surface geometry separates convincing AI video from impressive stills

When a generated clip looks almost real but something still feels off, the problem is usually lighting physics rather than resolution. Diffusion video models are excellent at painting plausible pixels, but a pixel grid carries no information about which direction a surface faces. Without that information, light cannot be re-simulated correctly, reflections slide across the frame, and fine detail flattens the moment the camera moves.

A normal map solves that problem. It stores a per-pixel surface orientation as an RGB triplet, where each channel encodes a vector component in tangent space. Feed a normal map plus a depth pass and an albedo layer into a compositor or game engine, and you can relight the shot, swap materials, add specular highlights, or insert a 3D object that receives light from the same environment as the plate.

For AI-generated footage the appeal is obvious. You get the creative flexibility of generated imagery with a geometry layer that behaves consistently under lighting changes. The catch is producing those maps at video frame rates with enough temporal stability that they do not flicker. That is where offline generation becomes relevant, and it is the difference between a normal map sequence you can ship and one that falls apart on a timeline.

What "offline normal map generation" actually means

Offline here describes where and how the inference happens, not a quality tier. An offline workflow runs the estimation model on hardware you control, over a finished or near-finished clip, and writes every frame to disk. Nothing is streamed to a hosted endpoint, no frame is processed twice with a different backend, and the output is a folder of maps that any artist can inspect.

That predictability matters more than it sounds. Normal maps are intermediate data. They get composited, re-baked, downsampled, tinted, and re-exported many times before delivery. If the estimator behaves differently on the third pass than on the first, every downstream cache is invalidated.

Interactive hosted generation vs offline batch generation

Dimension Interactive hosted generation Offline batch generation
Cost model Metered per run or subscription tier Fixed hardware cost, scales with hours not calls
Latency Seconds per frame, queue dependent Minutes per clip, predictable once tuned
Privacy Frames leave your machine Stays local
Reproducibility Version drift across endpoints Pinned model weights and seeds
Iteration Great for look-dev on single frames Great for full sequences
Throughput Limited by remote capacity Limited by your own GPU farm

A practical split: iterate interactively on a handful of hero frames until the look is right, then commit to an offline batch for the full sequence.

Hardware realities worth planning around

A 10-second clip at 24 fps is 240 frames. At 1920x1080 with a diffusion-based estimator, that is a serious compute job; at 4K it is four times the pixel count. Most teams run tiled inference, process in half precision, and split the sequence across multiple GPUs. VRAM is usually the binding constraint rather than raw throughput, so tile size and overlap settings deserve as much attention as the model choice. Storage matters too: 16-bit float maps at high resolution add up quickly, and a 30-second sequence can consume hundreds of gigabytes if you keep every intermediate pass.

The pipeline: from generated frames to relightable surfaces

Stage one: stabilize and conform

Before any estimation, lock the clip. Convert to a consistent color space, usually linear with an explicit transfer function, and set a single frame rate. Motion blur, heavy grain, and compression artifacts all degrade estimation quality; a light deflicker and a temporal denoise on the plate will improve the maps more than a bigger model will. Keep the original untouched so you can always compare against it.

Stage two: estimate depth and normals

Run a depth pass first, then normals conditioned on that depth. Depth and normals disagree constantly when estimated independently, and a normal map that contradicts the depth pass produces impossible shading. Ordering the passes this way also lets you reuse depth for defocus, fog, or parallax work later.

Stage three: temporal solve

Per-frame estimation is where flicker is born. Two approaches work in practice: use a model that takes a temporal window as input, or estimate on keyframes and propagate through optical flow with refinement. Most production pipelines do both, running a temporally aware estimator for the base pass and then applying flow-guided smoothing and re-projection to clean the residual.

Stage four: bake, pack, and deliver

Convert the results into tangent space using the convention your downstream tools expect. OpenGL and DirectX differ by a flipped green channel, and mixing them produces lighting that looks subtly inverted on every curved surface. Export 16-bit or float formats for intermediates, reserve 8-bit PNG for review copies, and ship depth, normals, and any masks as a matched set with identical frame numbering.

Choosing an estimator: diffusion priors versus lightweight geometric models

When diffusion-based estimation wins

Diffusion-based normal estimators, trained on large image corpora, produce detailed results on organic and irregular surfaces such as fabric, skin, foliage, and sculpted stone. They infer plausible geometry where a purely analytical model would return noise. The trade is speed: they are slower, more VRAM-hungry, and sensitive to conditioning inputs if the model supports them.

When fast geometric estimators win

Lightweight regression models and classical multi-view approaches run an order of magnitude faster. They shine on hard-surface objects, product shots, and scenes where camera motion already provides strong geometric cues. If your shot is a slow orbit around a manufactured object, a fast estimator plus careful temporal smoothing is often indistinguishable from the expensive option at delivery resolution.

A hybrid default that keeps compute proportional

A workable default: run the fast estimator over the whole sequence to get a consistent baseline, identify the shots where it visibly fails, and re-run only those through the heavier diffusion pipeline. Composite the two with a soft mask at the transition. Decision criteria to weigh include required relighting accuracy, shot length, resolution, how many revision cycles you expect, and whether the maps need to be reproducible for a future version of the edit. If a client will ask for a lighting change months later, reproducibility outranks speed.

The flicker problem: temporal consistency in normal maps

Flicker in a normal map sequence rarely comes from the maps themselves. It comes from inconsistency between them. A single frame that is slightly off in orientation is invisible; the same frame next to a neighbor that is off in the other direction reads as a flash of light.

Three techniques do most of the work. First, temporal conditioning: feed the estimator a short window of frames so its predictions see neighboring context. Second, flow-guided propagation: warp the previous frame's normals through optical flow, blend with the new prediction, and weight the blend by how confident the estimator was. Third, measurement: compute a warp error between consecutive maps and plot it over time; spikes localize the frames that need manual repair.

There is also a compression trap. Normal maps are high-frequency data, and aggressive delivery codecs will smear them into a shimmering mess. Review maps at full resolution in 16-bit, and if the final deliverable is compressed, test the compression on a moving shot rather than a still. A single frame will almost always look clean; the artifact only appears in motion.

Three realistic toolchain setups

Solo creator on a laptop

Blender plus a node-based diffusion graph covers depth and normal estimation with community weights. Process in 720p or 1080p tiles, export EXR sequences, and use ffmpeg for conforming and versioning. Reserve heavier diffusion passes for hero shots only. Keep a manifest file listing model weights, seeds, and settings per shot, because you will need it the first time a client asks for a change.

Single-workstation pipeline

A high-VRAM GPU plus Nuke or Fusion for compositing. Run estimation as a background batch while you work, keep depth and normals in a project-managed directory structure, and build a relighting test comp early rather than at the end. Material authoring tools such as Substance 3D Designer are useful for turning baked maps into tileable material sets you can reuse across a series.

Small studio with a render queue

A render manager with job submission, a shared asset store, and at least two GPU nodes. Shot templates encode the whole chain: conform, estimate, temporal solve, bake, quality-control render. Artists submit shots; the farm does the rest. This is where reproducibility stops being a luxury, because several people will touch the same sequence and nobody will remember the settings from three weeks ago.

Putting the maps back to work in AI video

Once you have clean normals, the creative options open up quickly.

Relighting is the headline use. Rebuild the light in a compositor, apply new environment maps, or move a virtual key light across a generated product shot without regenerating a single pixel. Because the geometry is explicit, shadows and highlights move the way a viewer expects.

Compositing 3D into generated plates is the second. Insert a rendered prop, character, or CG element and let it receive light from the same direction as the AI-generated background. Normal maps plus depth make the merge hold up under camera movement, which a flat video plate never manages convincingly.

Detail transfer and material swapping round it out. Sample a material's surface from a photographed swatch and apply it to a generated surface, or sharpen micro-detail in an upscaled shot by modulating the normals rather than the color. Game and virtual production teams use the same data to bring generated footage into an engine as a textured, relightable element instead of a flat video clip.

Mistakes that quietly ruin normal map sequences

Common failure modes

Ignoring color management. Estimating on gamma-encoded frames and compositing in linear space produces wrong intensities everywhere. Set the pipeline explicitly at the start and document it.

Flipping the green channel accidentally. Mixing OpenGL and DirectX conventions makes convex details look concave under strong light. Pick one, document it, and verify with a test sphere.

Estimating depth and normals independently. The two disagree, and shading becomes physically impossible. Always condition one on the other.

Skipping the temporal pass. Frame-by-frame output looks fine when scrubbing and terrible on playback. Flicker is a motion artifact, so judge it in motion.

Baking at final resolution too early. Higher-resolution estimation on hero frames, followed by downsampling, often beats working at delivery size throughout.

Using 8-bit PNG for intermediates. Banding in normal maps shows up as visible banding in the final render. Use 16-bit or float.

Over-sharpening. Artists who find maps too soft often boost contrast, which creates edges that never existed and lighting artifacts at silhouettes.

No version manifest. If you cannot reproduce the pass, you cannot revise it, and a revision request becomes a full redo.

A quality control checklist before delivery

  • Sweep a virtual light source across the shot at grazing angles. Errors in normal orientation become obvious between 60 and 80 degrees.
  • Compare depth and normals frame by frame on random samples; disagreement indicates a conditioning failure.
  • Play the sequence at speed with a flat, overexposed shaded view. Flicker reads instantly.
  • Check frame numbering, resolution, and channel packing against the delivery spec.
  • Verify edge behavior: transparent borders, padding, and tile seams.
  • Run a warp-error curve over the full sequence and log the outliers for review.
  • Store model weights, seeds, and tool versions alongside the maps.

FAQ

Do I need normal maps if the video is never relit? Sometimes not. But detail recovery, upscaling, and future-proofing are strong secondary reasons, and the cost of a normal pass is small relative to regenerating footage you already approved.

What resolution should the maps be? Match the plate. Estimation at higher resolution and downsampling afterward is a good option for hero shots where quality matters most.

Can I estimate normals from depth alone? You can derive them from a depth gradient, but the result is smooth and loses micro-detail. Learned normal estimators preserve fine structure far better, which is why the two-pass order exists.

How do I handle motion blur? Estimate on sharp frames where possible. If the plate has baked blur, either work on a deblurred intermediate or accept lower confidence in blurred regions and mask them out of any relighting adjustment.

Is offline always better than hosted inference? No. Hosted inference is faster to start and often better for look-development. Offline pays off on long sequences, privacy-sensitive material, and anything that will be revised later.

How long does a full pass take? A short 1080p clip on a modern GPU with a fast estimator can run in minutes. A diffusion-based pass on 4K takes hours. Plan the schedule around the heavy shots, not the average.

Where this is heading

Estimation quality is improving faster than the surrounding pipeline, which means the bottleneck is shifting from models to workflow discipline. The teams getting the best results are not chasing the newest estimator; they are pinning versions, measuring temporal error, and building shot templates that make a repeatable pass cheap. Treat normal maps as production data rather than a creative effect, and the photorealistic output takes care of itself.

Alexander

Alexander