Nyans Open Nyans

Free · browser-based · files stay local

Colour-match a kit of 3D assets,
from their textures.

Load the models, mark the one that is already right, and Nyans solves a colour transform for each of the others — against the base-colour maps, not against a screenshot of the render. Export each one as a .cube and a HALD PNG and apply it to the original textures at full resolution.

Chrome, Edge, Firefox and Safari · no account · nothing uploaded

An illustration of the panel, not live controls. The strips stand for values sampled out of each asset's colour maps; the numbers are the shape of a real run, not a measurement of one.
Price
Free no watermark
Scene formats
48 extensions + zip
Fix per asset
2 .cube + HALD
Uploads
0 bytes

Why the maps

A post-process LUT cannot pull two assets together

A grading LUT is one function applied to every pixel of the finished frame. That is exactly what you want for a look, and exactly what cannot fix a kit whose assets disagree with each other.

The shape of the problem

One function, every pixel

Feed a warm crate and a green crate through the same transform and they both move by the same rule. Warm the green one and the warm one goes further; correct the warm one and the green one follows. The frame gets a look, and the two crates still do not agree.

Where it comes from

Assets are authored apart

A marketplace buy, a scan shot under an overcast sky, a texture painted on someone else's monitor and a kitbash from an older project were each balanced against a different idea of neutral. The disagreement is baked into the maps, so that is where it has to be undone.

The correction

One transform per asset, on its own maps

Nyans solves a separate colour transform for each asset, toward the reference asset's untouched palette. Each is exported on its own, so you apply it to that asset's maps and nothing else. The reference does not move; its colours are held while the others are solved.

And then the look

The global LUT still does its job

Once the kit agrees with itself, the shared look is worth baking: Nyans exports it as a .cube, an Unreal 256×16 strip, a Unity 1024×32 strip, a ReShade lut.png or a HALD CLUT. That one goes on the frame, where a global transform belongs.

Workflow

Kit in, one zip of fixes out

Six steps in one browser tab. Nothing installs, nothing uploads, and the whole solve is a single undo step if you do not like it.

  1. 01Load the kitDrag the models into the filmstrip beside any stills or clips already there. glTF and GLB open directly; the rest are converted to glTF 2 in the tab. A zipped folder brings its textures, .bin and .mtl with it, up to 512 MB and 10,000 files.
  2. 02See them togetherGrid view puts every selected asset side by side under one shared zoom and pan, each cell with its own before view, wipe and matte. Orbit and zoom to check a surface; the camera is per asset.
  3. 03Read the actual colourThe scopes read each model's colour textures instead of the rendered viewport, so the histogram, parade, waveform and vectorscope describe the maps rather than the current camera angle and key light. Turning the model does not move the trace.
  4. 04Mark the referenceIn the Harmonize panel, mark the asset that is already right. Scribble over the palette on it that should carry across, and over the material on the others that should adopt it. The scribbles are how you say this stone, not that decal.
  5. 05SolveHarmonize solves one trim per remaining asset toward the reference palette, streaming each result as it lands. Everything you did not scribble is held in a preserve set so the fix stays local to the material you pointed at. Cancel rolls the whole run back.
  6. 06Export texture fixesOne zip: a 33³ .cube and a 512×512 HALD PNG per asset, plus a README with the ImageMagick lines that apply them — magick texture.png fix-crate_pine-hald8.png -hald-clut texture-fixed.png, and a mogrify line for a folder. The .cube is there for Substance, Nuke and anything else that prefers a 3D LUT.

What it touches

Colour maps, before the lighting

The transform is applied to the maps and the scene lights the result — the same order the exported fix will be applied in. What you judge on screen is what the file does.

Colour only

Base colour and emissive

Those two maps are read and written, along with any flat colour factor the material multiplies them by, which is folded in first. Normal, roughness, metallic, ambient-occlusion, height and opacity maps are never touched. Alpha in the colour map is carried through unchanged, so a cutout stays cut out.

Order

Before the scene lights it

The grade goes on the map; the lights then fall on the graded map. Grading the rendered image instead would bake the key light, the shading and the camera angle into the correction — which is what you get if you screenshot a viewport and colour-correct that.

Resolution

A lattice, not an image edit

The fix is a colour lattice, so it applies to your 4K or 8K maps outside the browser at their own resolution. The preview works on a copy capped at 4096 pixels on the long edge; that governs what the viewport shows, not what the exported transform does.

Measurement

The camera cannot skew the numbers

Every asset's colour maps are laid out into one analysis surface, and that is what the scopes, Auto match, Auto balance and Harmonize sample. Two people looking at the same kit from different angles get the same solve.

Reference

Solved from identity, with no look in it

Each exported fix starts from an identity transform and targets the reference's untouched palette, with the reference's own colours in the preserve set. It is a correction, not your grade — the creative look stays a separate export you can change later without redoing the kit.

Local

The kit stays on your machine

Conversion, grading and the zip all happen in the tab. Models are kept in the browser on your own machine when there is room, and the filmstrip marks which are stored and which are session-only. A .nyans project file carries the whole package.

Formats

What you can drop in

glTF 2.0 goes straight to the viewer. Everything else is normalised to glTF 2 by an Assimp build compiled to WebAssembly, in the tab, before it is shown.

Scene formats accepted by the model importer
FamilyExtensionsRoute
glTF 2.0.gltf, .glbLoaded directly, no conversion step
Autodesk FBX.fbxConverted to glTF 2 in the tab
Wavefront.objConverted; bring the .mtl and maps in a zip
Collada.daeConverted to glTF 2 in the tab
Blender.blendConverted, with the caveat below; exporting glTF from Blender is the surer route
Solids & scans.ply, .stl, .off, .3ds, .3mf, .amfConverted; untextured meshes use their material colour
Game & DCC.pmx, .md2, .md3, .md5mesh, .ms3d, .ase, .b3d, .cob, .iqm, .lwo, .lws, .mdl, .mdc, .smd, .x, .q3bsp, .q3d, .hmp, .nff, .ndo, .sib, .scn, .ogex, .mesh, .mesh.xml, .ac, .ac3d, .assbin, .bvh, .csm, .dxf, .xgl, .zgl, .3d, .md5anim, .md5cameraConverted to glTF 2 in the tab
Packaged.zipThe scene plus its textures and side files. Up to 512 MB and 10,000 entries; the scene entry is picked for you

That list is the set of extensions the Assimp build has enabled, so it is what the file picker will accept. A few of them are companion files — animation and camera takes — that carry no mesh of their own, and coverage of the older and more obscure formats varies with whichever exporter wrote the file. When a scene arrives wrong, exporting glTF or FBX from the application that made it is the shortest way through.

Limits

What this does not fix.

It is a colour transform on colour maps. Everything a colour transform cannot reach is still yours to solve, and it is better to know which is which before you start.

Nyans is a look-development and LUT tool, not a DCC. It does not edit meshes, rebuild materials or replace your engine's renderer.

  • Material response. Roughness, metallic and normal maps are left alone. A crate that reads as plastic next to a crate that reads as wood will still read that way after the colours agree.
  • Baked lighting. A scan carries the light it was captured under. The balance can be corrected; a shadow painted across the map cannot, because it varies with position rather than with colour.
  • Geometry, UVs and scale. Untouched, by design. Nothing here depends on two assets sharing topology or a UV layout.
  • Your renderer. The viewer lights the model with a fixed studio rig so you can see the maps in context. It is not a preview of Unreal, Unity or your offline renderer, and it applies no tone mapping.
  • Animation. Rigs and takes are not played back. The scene is shown statically under an orbit camera; a colour transform has no use for a timeline.
  • The quantized bake preview. The 16³/32³/65³ preview that shows what a baked LUT will do stays on the flat shots, where the exported LUT is what gets applied.

FAQ

Practical questions

Which texture maps does the fix apply to?
Colour maps only: the base-colour map and the emissive map, plus any flat colour factor the material multiplies them by. Normal, roughness, metallic, ambient-occlusion, height and opacity maps are never read and never written. Alpha in the colour map is carried through unchanged, so cutout foliage stays cut out.
Why not just apply a LUT to the final frame?
A 3D LUT is one function applied to every pixel of the frame. If one asset is green and another is warm, a single function cannot pull them together — moving one moves the other. A mismatch between assets has to be corrected per asset, which means correcting the maps. A post-process LUT is still the right tool for the look on top; the two do different jobs, and Nyans exports both.
What do I do with the .cube and the HALD PNG?
They hold the same transform in two shapes. The HALD PNG is for image tools — the README in the zip carries the ImageMagick line for one file and a mogrify line for a folder. The .cube is for anything that prefers a 3D LUT, such as Substance or Nuke. Apply either to that asset's own colour maps, then re-import them.
Does the exported fix depend on my texture resolution?
No. The fix is a 33³ .cube and a HALD PNG — a colour lattice rather than an image operation — so it applies to the original maps at whatever resolution they are. The in-app preview works on a copy capped at 4096 pixels on the long edge, which affects what you see in the viewport, not what the exported transform does.
Will the reference asset change?
No. Each fix is solved from an identity transform toward the reference's untouched palette, with the reference's own colours held in the preserve set. It corrects the other assets toward the reference rather than moving everything to a common average, so an approved asset stays approved.
Does it work on photogrammetry and scanned assets?
Yes, and that is the usual source of a mismatch: scans carry the light they were captured under. The colour balance of the maps is what gets corrected. Baked-in shadows and specular highlights are not, because they vary across the surface rather than with colour.
Do the models get uploaded?
No. The browser opens the files, converts them, grades them on the local GPU and writes the zip locally. Models are stored on your own machine when there is room, and a .nyans project file keeps them with the rest of the board. There is no account and no server-side processing.
Can I grade a model beside stills and video?
Yes. A model sits in the filmstrip next to screenshots, camera RAW, HDR files and clips, all under one look, which is the point when the LUT has to survive gameplay captures and asset renders alike. See 3D assets on the main page for how models fit the rest of the tool.
What do I need to run it?
A current version of Chrome, Edge, Firefox or Safari with WebGL2, which every mainstream browser has shipped for years. Conversion of a large scene is the slowest step and runs in the tab, so a desktop machine is easier on a big kit than a phone.

Drop in the kit and see what disagrees

Open Nyans

Free to use · source files stay local