Skip to content

Optimise textures

The Optimise textures page lists textures with their size, format and estimated GPU memory, shows what could be smaller and fixes it. It changes the source pixels of the textures, so the assets, your repository and later imports get smaller too. The original pixels are backed up first and can be restored.

  • Content Browser: right-click textures or folders and choose Optimise Textures. Folders are searched with their subfolders.
  • Panel: open the Optimise textures tab (Optimise when the panel is narrow), select textures or folders in the Content Browser and click Use selection in the header.
  • Python: open_texture_optimizer(assets, folders). See Python.

Measuring only reads. Nothing changes until you click Optimise or Unpack.

Option Default What it does
Max size 2048 Keep, 8192, 4096, 2048, 1024 or 512: the largest width or height of the source pixels. Larger textures are scaled down, keeping their aspect ratio. Keep leaves the size as it is. In a compact panel the choices read Keep, 8K, 4K, 2K, 1K and 512.
Power of two On Scale textures whose width or height is not a power of two to the nearest one (1000 x 1000 → 1024 x 1024), so they get mipmaps and stream. Rounding up never goes past Max size.
Remove unused alpha On Turn on Compress Without Alpha when the alpha channel holds one value everywhere (BC3 → BC1, half the memory). A fully opaque alpha is already dropped by Unreal.
Show all textures Off Also list the textures that need no change.

Changing an option measures the textures again.

The page shows the title Optimise textures with the number of textures, the Source (Loaded from …) and Scan again, which measures the same textures again. An intro line reminds you that the page changes source pixels, that originals are backed up and that Maximum Texture Size is the way to change only the cooked size.

Without Show all textures, the list shows the textures that would change, plus textures with something worth seeing (a backup, grayscale content or constant channels). Each row has:

  • A check box. It is disabled for textures with nothing to change.
  • A square thumbnail and the texture name.
  • An info line: size, source format and GPU memory, for example 4096 x 4096 · BGRA8 · GPU 21.3 MB, and x 4 tiles for UDIM textures.
  • Tags:
Tag Meaning
Over max size Larger than Max size: the source pixels are scaled down.
Not power of two Width or height is not a power of two, so the texture has no mipmaps and does not stream.
UDIM A UDIM texture; the tooltip says how many tiles.
Unused alpha The alpha channel holds one value everywhere, so it carries no information.
Packed A packed texture (ORM, MRA …) by its name. Unpack makes one texture per channel.
R = 0.78, B = 0.00 … This channel holds one value everywhere: a constant in the material would do. Shown for data textures (linear or packed).
Grayscale Red, green and blue are equal. A one channel texture (Grayscale or Alpha compression) would do.
Original backed up The original pixels are in Saved/MaterialSmith/Backups.
Skipped: … The texture can’t be optimised, for example UDIM texture: its tiles are not resized., Layered texture: not resized. or No source pixels (cooked or generated texture).
  • The result: → 2048 x 2048 · GPU 5.3 MB, or Nothing to change.
  • Unpack on packed textures.

Grayscale and constant channels are hints only; Material Smith doesn’t change those textures for them.

Empty states: before a scan Select textures or folders in the Content Browser and click Use selection.; No textures found.; and when everything fits, Every texture already fits these options. Turn on Show all textures to see them.

At the bottom, GPU memory of these textures: 120.0 MB → 40.0 MB shows the total before and after for the listed textures (hidden in a compact panel), next to Restore originals and Optimise N textures.

  1. Pick Max size and the check boxes, and uncheck textures you want to keep as they are.

  2. Click Optimise N textures.

For each checked texture, Material Smith measures it again, then:

  • Before resizing, it saves the original pixels once, losslessly, to Saved/MaterialSmith/Backups in your project (PNG for 8 and 16 bit textures, EXR for float textures; on Unreal Engine 5.0 raw .msraw files). An existing backup is kept, so the backup always holds the first original.
  • Resizes the source pixels to the new size.
  • Turns on Compress Without Alpha for unused alpha.
  • Saves the texture with Save assets on (the default).

If a backup can’t be written, the texture is not changed and the status line says so. The status line then says, for example, 3 textures optimised.

UDIM textures are not resized.

Restore originals puts the backed up original pixels back into every listed texture that has a backup and deletes the backup. The status line says, for example, 3 textures restored to their original pixels. Settings changed by Remove unused alpha are not reverted.

Unpack splits a packed texture into one single-channel texture per channel, next to it. The channel layout comes from the texture name and the name table: T_Rock_ORM becomes T_Rock_AO, T_Rock_Roughness and T_Rock_Metallic; height and opacity channels become _Height and _Opacity; empty channels are skipped.

  • The new textures are linear with Alpha compression (one channel), and stream as virtual textures if the packed texture does.
  • If a texture with the target name was imported from a file, the new one gets _Unpacked appended, so your own maps are never replaced.
  • The packed texture itself is not changed.

A texture whose name doesn’t end with a packed ending can’t be unpacked: … is not named like a packed texture (ORM, MRA, RMA, ORD …).

To pack maps into one texture, use the Channel packer.

import unreal
smith = unreal.get_editor_subsystem(unreal.TAMaterialSmithSubsystem)
options = unreal.TAMaterialSmithOptimizeOptions()
options.max_size = 2048
reports = smith.analyze_textures([], ["/Game/Props"], options)
for report in reports:
print(report.texture, report.width, report.height, report.new_width, report.new_height, report.skip_reason)
result = smith.optimize_textures(reports, options)

See Python for restore_textures, unpack_texture and the fields of TAMaterialSmithTextureReport.