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.
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.
| 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.
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.
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.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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.
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
Vidu Q4 alternatives compared: Kling 4.0, Seedance 2.5, Wan 3.0, and Runway Gen-4 — 4K support, input modes, durations, audio, and what each costs in credits on Domer.
The top 4K AI image generators on Domer compared: Flux 3 Klein, Nano Banana 2.1, GPT Image 2.5, GPT Image 2, and Nano Banana Pro — 4K credit costs, reference limits, and speed.
Nano Banana 2.1 vs GPT Image 2.5 Flare compared: credit costs per resolution, aspect ratios, reference images, text rendering, and which tasks fit each model.