← Back to list

Understanding Textures : Texture Groups and Mips in Unreal Engine

A 4K character texture and a 4K rock texture are not the same thing, not to the player, and not to the GPU. But by default, Unreal treats…

Nikhil Maurya · 2026-07-18 07:26 · 6 claps · 7.5 min read
#unreal-engine #optimization #technical-art
Open on Medium ↗
Wiki topics: OPS · LLMOps & Inference 🎮 · Gaming

Understanding Textures : Texture Groups and Mips in Unreal Engine

A 4K character texture and a 4K rock texture are not the same thing, not to the player, and not to the GPU. But by default, Unreal treats them identically. That’s what Texture Groups are for, and most developers misconfigure them without ever knowing it. As it sounds, a TextureGroup is a Collection of similar type of textures which will be managed in a certain way.

Texture Groups

So a TextureGroup apply the same properties to the textures where it is assigned, these properties contain

  1. Min & Max LOD Size : Min/Max mip size that will be rendered, specified in pixels, range of 1 to 8192 as power-of-two’s,
  2. LOD Bias : A negative or positive value that determines the number of mip levels to offset prior to uploading for render, clamped within MinLODSize and MaxLODSize
  3. MinMagFilter : Specifies the texture filter type when textures are minified or magnified by the GPU
  4. MipFilter : Specifies whether the GPU should blend two mips together when viewing the texture from a distance or at a grazing angle.
  5. MipGenSettings : Control how mipmaps are generated and filtered during texture import/building, affecting sharpness, blurring, detail preservation, and aliasing behaviour across different mip levels.

Texture Group defaults defined in BaseDeviceProfiles.ini

Texture Group defaults defined in BaseDeviceProfiles.ini

On an Engine level these configs live in BaseDeviceProfiles.ini. A great thing about these groups is that these can be set according to your project needs. Obviously it wont be efficient changing the group settings on engine level if you are planning to maintain multiple projects which might have different needs on the same engine. In this case we can override the group definition in DefaultDeviceProfiles.ini (might have to create this ini as its not created by default) or you can even add it to DefaultEngine.ini.

Now in addition to this you can also add TextureGroup settings according to a specific platform. There are two ways to go for this

  • In the DefaultDeviceProfiles.ini , you can specify your platform and the related TextureGroup settings. (I would go with this approach most of the times.)

DefaultDeviceProfiles.ini

DefaultDeviceProfiles.ini

  • Another way is the DefaultEngine path, so if you were to add group settings on HoloLens and Windows, if the HoloLens plugin is installed, under the Config file you can find the folder HoloLens in which there is an HoloLensEngine.ini , you can add the configs here.

Avoid putting every texture into high quality groups like Character or Cinematic. TextureGroups exist to help the engine prioritize memory and streaming behaviour efficiently. Incorrect grouping can silently increase VRAM usage and texture streaming pressure.

Also a thing to note under TextureGroups, except the default ones which you can override, Unreal also provides extra TextureGroups which you can use and configure based on what you want without editing the default TextureGroups.

Additional configurable TextureGroups

Additional configurable TextureGroups

Is There an easier way to do all this?

Ofcourse, If you navigate to Tools->Platforms->Device Profiles you can check per device configurations. Now this really helps to keep track of how you are setting up TextureGroups even on per device basis.

Navigating to Device Profiles

Navigating to Device Profiles

Once in Device Profiles, you can click on the three dots adjacent to the device name to edit its Global Defaults. Under the Texture LOD Settings you will find all the texture groups and their adjacent setting. You can set every TextureGroup per device over here.

Different platforms have completely different memory and bandwidth budgets. A texture setup that works fine on a high-end PC can easily become a bottleneck on devices like Steam Deck, HoloLens or mobile GPUs.

Setting up per Device Texture LOD Settings

Setting up per Device Texture LOD Settings

On the bottom left corner you’ll notice a text about what we covered before, how to add a new Device Profile.

MipMaps

Earlier we did talk about MipGenSettings, MipFilters and Min/Max mip sizes. But what are MipMaps? MipMaps are pre-generated smaller versions of a texture which are stored alongside the original texture. Ideally, each Mip level is half the resolution of the previous one (one more reason why textures should be ideally be power of 2 resolution).

But why do Mips exist?

Lets take a scenario where you have a wall almost a kilometre away from your camera and the texture over it is of the 4k resolution.

With No Mips enabled, GPU will sample the huge 4k texture which would result in a bandwidth waste as the wall is barely visible. Those texels are spread across many cache lines, causing unnecessary memory bandwidth and poor cache utilization. Smaller mip levels fit much better into the GPU texture cache, reducing bandwidth while improving texture filtering quality. This would result in cache misses and further texture shimmering/aliasing.

With Mips enabled, the GPU will sample only the tiny mip instead of the full res 4k texture resulting in less VRAM bandwidth, better cache locality and a more stable image. Mips are one of the biggest performance optimization in real time rendering.

Disabling mipmaps on regular world textures is almost always a bad idea. Without mips, textures consume more bandwidth, produce more cache misses and often introduce shimmering artifacts when viewed from a distance.

How does the GPU choose a Mip?

Essentially the GPU estimates How large is this texture on screen and then it selects an appropriate mip level automatically. This is similar to how LODs are treated for Static Meshes. In a lot of instances Mips are also called TextureLODs.

Mip Settings in Unreal

Now that you know what MipMaps are, lets discuss how you can set them up in the Texture Settings in Unreal Engine.

Mip Settings in Unreal Engine

Mip Settings in Unreal Engine

Mip Gen Settings controls How Unreal generates the mipmaps , this is not a streaming setting. Commonly used modes are

  1. NoMipmaps -> No mip chain generated.
  2. FromTextureGroup -> Uses the texture group defaults.
  3. SimpleAverage -> Basic Averaging
  4. SharpenX -> Sharpens mip levels, when textures downscale details get lost and the textures become muddy. Sharpening tries to preserve percived details. Mostly used for Albedo and stylized textures, Not ideal for masks or normals as it can introduce artifacts.
  5. BlurX -> Blurs mip levels, normally used for softer mips, less aliasing and shimmering.

Sharpen and Blur are image-processing filters during the mipmap generation process, So when Unreal created mips it performs filtering operations on the texels.

Important to note: These are offline texture build operations and NOT runtime shader operations which means they happen during texture cook/build and not every frame on the GPU, The final generated mip chain is then stored on the disk/VRAM.

Num Cinematic Mip Levels reserves top quality mip for cinematics. So if i set it to 2 , the engine will keep 2 the highest resolution mip only for cinematic quality settings. This feature can be really useful for cutscenes, PhotoMode and Ultra Settings.

Global Force Resident Mip Levels forces all mip levels to stay loaded in memory and disables the normal streaming behaviour for the texture. While this can be useful in some cases like for Hero assets or cinematics but if left uncheck it can massively increase VRAM usage.

Do Scale Mips for Alpha Coverage is important for foliage, leaves and masked textures. The problem with mips is when they shrink the alpha mask starts to lose coverage now this results in thinner and sometimes transparent disappearing textures. This option adjusts mip generation to preserve the alpha coverage to avoid the artifacts. Apart from foliage this is also useful for hair cards and other thin objects like fences and stuff.

Mip Load Options control how the generated mips are loaded into the memory. The options in this are pretty self explanatory, but here is what they do in a nutshell

  1. Default : Normal streaming
  2. All Mips : Load everything
  3. Only First Mip : Mostly highest mip
  4. Streamed : Stream dynamically

One important thing to understand here is that there are different stages of memory involved in texture handling. There is memory used for storing/cooking texture data, and then there is GPU memory involved when the texture is actually sampled to shade pixels on screen. Don’t worry too much about the difference yet we’ll talk about this in a later article.

Virtual Texture Prefetch Mips controls how many mips are prefetched ahead of time, if you set higher values here it will absolutely reduce the texture pop-in but also increase the memory usage. Goes without saying, this option is only available when you have Virtual Textures turned on for your project.

Normalise After Making Mips is essential for Normal maps, as when normal maps are downscaled their vector lengths might get affected, this feature normalises the texture to fix lighting errors and shading inconsistencies.

Wrapping Up

Texture Groups and Mipmaps might seem like configuration details you set once and forget, but they are foundational to how your project handles memory and visual quality at runtime. Getting these right early saves you from difficult-to-debug performance issues later like VRAM pressure, texture streaming hitches, and shimmering artifacts are all symptoms of textures that were never set up with intent.

TL;DR Texture Groups to communicate priority and purpose to the engine, not just as a categorization label. Let Mipmaps do their job they exist precisely so the GPU doesn’t have to sample full-resolution data for distant or small surfaces. And when in doubt, use Device Profiles to make platform-specific decisions explicit rather than relying on defaults that were designed for a general case, not your specific hardware target.

If you’ve hit a VRAM streaming budget warning or seen textures popping in at the wrong resolution, drop your setup in the comments; curious what configurations people are running in production

In the next article, we’ll go deeper into texture compression what they mean and how we can handle them better in Unreal Engine.

I’ve been documenting my explorations and learnings around performance, and Unreal Engine internals across a few blogs, feel free to explore the rest if this resonated with you. **Check out more of my Blogs. I enjoy exchanging ideas around game performance, tools, and engine-level problem solving, so feel free to reach out at [nikhil.maurya1201@gmail.com](mailto:nikhil.maurya1201@gmail.com)**.


메타데이터
post_id
0f06eafc8cc5
slug
understanding-textures-texture-groups-and-mips-in-unreal-engine-0f06eafc8cc5
url
https://medium.com/@GroundZer0/understanding-textures-texture-groups-and-mips-in-unreal-engine-0f06eafc8cc5
canonical_url
https://medium.com/@GroundZer0/understanding-textures-texture-groups-and-mips-in-unreal-engine-0f06eafc8cc5
author_url
https://medium.com/@GroundZer0
status
ok
fetched_at
2026-08-20 01:13:01