Version: 2022.3
Mipmaps
The Mipmap Streaming system

Mipmaps introduction

A mip or mip level is a version of a texture with a specific resolution. Mips exist in sets called mipmaps. Mipmaps contain progressively smaller and lower resolution versions of a single texture.

For example, a mipmap might contain four versions of a texture, from the original texture (Mip 0), to Mip 1, Mip 2, and Mip 3:

Mip levels
Mip levels

Mipmaps are commonly used for rendering objects in 3D scenes, where textured objects can vary in distance from the camera. A higher mip level is used for objects closer to the camera, and lower mip levels are used for more distant objects.

Mipmaps can speed up rendering operations and reduce rendering artifacts in situations where the GPU renders a texture at less than its full resolution. A mip is effectively a cached, downsampled version of the original texture. Instead of performing many sampling operations on the original, full resolution texture, the GPU can perform a smaller number of operations on the already downsampled version.

Sometimes, mipmaps aren’t beneficial. Mipmaps increase the size of a texture by 33%, both on disk and in memory. They also provide no benefit when a texture is only rendered at its full resolution, such as a UI texture that isn’t scaled.

You can create a mipmap for a texture manually, or you can instruct Unity to generate a mipmap for you. To automatically generate a mipmap, ensure that your original texture’s resolution is a power of two value, as shown in the example mipmap image.

You can enable or disable mipmaps for a texture asset in the Texture Import Settings Inspector.

How the GPU samples mip levels

When the GPU samples a texture, it determines which mip level to use based on the texture coordinates (UVs) for the current pixel, and two internal values that the GPU calculates: DDX and DDY. DDX and DDY provide information about the UVs of the pixels beside and above the current pixel, including distances and angles.

The GPU uses these values to determine how much of a texture’s detail is visible to the camera. A greater distance and a more extreme angle between the current pixel and its neighbors means that the GPU picks a lower resolution mip; a shorter distance and less extreme angle means that the GPU picks a mip with a higher resolution.

The GPU can also blend the texture information from two mips together with trilinear filtering. Blending mips while sampling can make the transition from one mip to another less noticeable. To blend mips, the GPU takes a specific percentage of texture information from one mip and the rest from another mip.

Mip bias

A setting called mip bias can do two things while sampling, based on the sampler settings:

  • The mip bias can change the threshold for the GPU selecting a lower or higher mip for a sample. The GPU selects a specific mip when you use point and linear filtering in a sampler. For example, the GPU’s might decide that the texture at a set of UVs uses a sample from Mip 3. With a mip bias of –2, the GPU would use the higher resolution Mip 1 for the sample, instead.
  • The mip bias can tell the GPU to prefer one mip over another by an exact percentage when blending samples from different mips. The GPU blends mips when you use trilinear filtering in a sampler. For example, the GPU’s calculations might return a value of 0.5. The 0.5 value tells the GPU to take 50% of the texture information it needs from one mip, and the remaining 50% from the next mip in the mipmap. With an added mip bias of 0.2, the 0.5 value would change to 0.7, and the GPU would take 70% of the texture information from the first mip and only 30% from the second.

The GPU has a global mip bias that it applies to its mip selection by default. Textures can have their own mip bias, which Unity adds or subtracts from the global mip bias. You can also specify your own mip bias for an individual texture sampling operation in a shader.

To set the mip bias for an individual texture, see Texture.mipMapBias. To set a mip bias for a texture sampling operation in a hand-coded shader, use HLSL functions such as tex2dbias. To set a mip bias for a texture sampling operation in Shader Graph, see Sample texture 2D Array node or Sample texture 2D node.

How Unity loads mipmaps

You can control the way that Unity loads mipmaps at runtime with Mipmap Streaming.

Mipmaps
The Mipmap Streaming system