How to upscale textures
Updated · 10 min read
To upscale a texture, run it through an AI upscaler at 2x or 4x, but treat each map type differently: colour maps can go straight in, normal maps must be renormalised afterwards, and tiling textures need their opposite edges as context so the seams still match. Then save the result at a power-of-two size in the format your engine expects.
This guide walks through each of those steps, the DDS round trip for game files, when re-baking beats upscaling, and how to do it in the browser with our AI texture upscaler.
Try it on your own model
Upload a GLB, OBJ, FBX, STL or PLY file (or pick a sample), describe the look, and let AI paint it from every side.
Open the AI 3D Texturing StudioWhat upscaling a texture really does
A plain resize (bilinear, bicubic or Lanczos in an image editor) only spreads the pixels you already have over a bigger grid, so the result is larger but just as soft. An AI upscaler such as Real-ESRGAN has learned what sharp edges, grain and fine detail usually look like, so it guesses new detail as it enlarges the image.
That guess is the important word. The AI does not know what your texture was meant to show. It is very good at making bricks, bark, fabric or rust look crisp, and it can also turn noise into fake detail or smooth a hand-painted look. Always compare before and after at 100% zoom, and on the model, before you replace the original.
| Method | What it does | Best for |
|---|---|---|
| Nearest neighbour | Repeats each pixel as a hard square | Pixel art and textures that must stay blocky |
| Bicubic / Lanczos resize | Smooth enlargement, no new detail | Smooth data maps (roughness, AO, masks), quick previews |
| AI upscaler (for example Real-ESRGAN) | Enlarges and rebuilds plausible detail | Colour / albedo maps, photo textures, normal maps (with renormalising) |
| Re-bake or re-export | Makes the map again at the new size from its source | Baked normal / AO maps and procedural materials, when the source exists |
Choose the method per map type
A PBR material is several images, and only one of them is a picture. The others are data: directions, amounts and masks. AI upscalers are trained on ordinary images, so they treat every file as a picture. That is fine for colour, needs a fix for normals, and is often unnecessary for greyscale maps.
Base colour / albedo and emissive
These are the maps an AI upscaler was made for. Upscale them with AI at 2x or 4x. Watch for painted text and logos (the AI may reshape letters), and for noise or JPEG blocks that turn into fake texture. If the colour map has baked-in shadows you want gone, fix that first: see how to remove baked lighting from textures.
Normal maps
A normal map stores a direction in each pixel, and that direction must have a length of exactly 1 (a "unit" vector). Any resize or AI pass blends and sharpens the colours, so many pixels end up a little too short or too long, and the lighting goes slightly flat or noisy. The fix is to renormalise after upscaling: rescale every pixel back to a unit vector. Keep the map as linear (Non-Color) data and keep its green-channel convention (OpenGL or DirectX); upscaling does not change it. More on the format in what is a normal map.
Another clean route: if you have the height (bump) map, upscale that instead and make a fresh normal map from it with our free normal map generator.
Roughness, metalness, ambient occlusion and height
These are greyscale amounts. What matters is the value of each pixel, not crisp edges, and they are often smooth already. A plain bicubic or Lanczos resize is usually enough and keeps the values honest. Metalness is often almost pure black or white; an AI pass can add grey halos along those edges, which read as half-metal. Check it before you use it.
Many glTF and game assets pack maps into one image: in glTF, occlusion sits in the red channel, roughness in green and metalness in blue. An AI upscaler sees that as one colour picture, so check each channel on its own after upscaling, or resize a packed map plainly.
Opacity and alpha
Keep alpha out of the AI. Upscale the colour, and resize the alpha channel separately with a smooth resize, so cut-out edges stay where they were.
Not every map needs the same size. A material can mix a 4096 px colour map with a 2048 px roughness map. Spend your upscaling on the maps you can actually see.
Keep tiling textures seamless
A seamless texture repeats: its left edge continues into its right edge, and its top into its bottom. Upscale it like a normal image and the AI sees a hard border at each edge with nothing beyond it, so it treats the last few pixels differently from the middle. Tile the result and a faint line appears where the copies meet.
The fix is wrap padding: before upscaling, add a border to each side copied from the opposite edge (the left border is a strip from the right side, and so on). The AI now sees exactly what sits next to each edge when the texture repeats, so it treats the edge like any other part of the image. After upscaling, crop the border off again.
- Add a border of a few dozen pixels on all four sides, wrapped from the opposite edges (in an image editor: offset the image by half its size, or paste copies around it).
- Upscale the padded image.
- Crop the border off at the new scale (a 24 px border becomes 96 px at 4x).
- Test it: place the result 2 x 2 or 3 x 3 next to itself and look for lines.
Big textures add a second seam problem. Most AI upscalers take a limited input size, so a large texture is cut into tiles. Each tile needs real pixels around it as context, and neighbouring tiles should be blended over a small band, or the tile borders show as a grid.
Our texture upscaler does both for you: tick Seamless and each tile is sent with 24 px of context wrapped from the opposite edge, and tiles are cross-faded where they meet.
Power-of-two sizes and memory
Game textures are usually a power of two on each side: 256, 512, 1024, 2048, 4096. Mipmaps (the smaller copies the GPU uses for distant surfaces) halve cleanly at those sizes, and some targets still require them. In WebGL 1, for example, a non-power-of-two texture cannot have mipmaps and cannot repeat (MDN). Block-compressed formats such as DXT/BC must also be a multiple of 4 on each side (Microsoft).
The good news: 2x and 4x keep a power of two a power of two. 512 becomes 1024 or 2048, and 1024 becomes 2048 or 4096. If your source is an odd size (say 1000 px), resize the result to the nearest power of two afterwards, or fix the source first.
Watch the cost too. 4x means 16 times as many pixels. An uncompressed 4096 x 4096 RGBA texture is 4096 x 4096 x 4 bytes = 64 MB in video memory, and a full mip chain adds about a third. Upscale what the camera gets close to, not everything.
| Source size | 2x result | 4x result | Pixels at 4x |
|---|---|---|---|
| 256 px | 512 px | 1024 px | 16x the source |
| 512 px | 1024 px | 2048 px | 16x the source |
| 1024 px | 2048 px | 4096 px | 16x the source |
| 2048 px | 4096 px | 8192 px | 16x the source |
Upscaling DDS textures (the round trip)
Most games ship textures as DDS files with block compression (BC1/DXT1, BC3/DXT5, BC5, BC7 and others). AI upscalers do not read DDS, so the work is a round trip:
- Find out the format. Open the file in our DDS viewer to see its format, size and mip levels, so you can save it back the same way.
- Convert to PNG. Use DDS to PNG. It decodes BC1 to BC5, BC7 and uncompressed DDS in your browser, and rebuilds the blue channel of BC5 normal maps.
- Upscale the PNG, following the per-map rules above.
- Convert back. PNG to DDS writes BC1, BC3, BC7 or uncompressed DDS with mipmaps. Pick the same format the game used, unless you know it accepts another one. It does not write BC5, so if a game needs BC5 normal maps, use your engine or a desktop tool for that last step.
One catch: block compression is lossy and works in 4 x 4 pixel blocks. Upscale a compressed DDS and you also upscale its block artefacts, which the AI may sharpen into a pattern. If you have the original PNG or TGA (convert TGA with TGA to PNG), always start from that instead.
When to re-bake or repaint instead
Upscaling is a guess. Sometimes you can make the map again for real, and that always wins:
- You have the high-poly model. Baked normal, AO and curvature maps should be re-baked at the new size. The bake is exact; an upscaled bake is not. See what is texture baking.
- The material is procedural. A node material in Blender or Substance Designer can simply be exported again at 4096 px.
- The texture is tiny or wrong. From a 64 or 128 px source, an AI has too little to work with and invents most of the detail. If the look is wrong anyway, repaint the model instead: the AI 3D Texturing Studio paints a fresh texture from a prompt, then upscale that.
- It is pixel art. Use nearest neighbour at a whole-number scale and keep the pixels square.
Step by step: upscale a texture or a GLB in the browser
Our AI texture upscaler runs in the browser and sends the image, tile by tile, through our server to the Real-ESRGAN AI model on Replicate. It has two tabs: Image for one texture and 3D model (GLB) for the textures inside a model.
- Upload. On the Image tab, drop a PNG, JPG or WebP texture (16 to 4096 px per side, up to 30 MB). On the 3D model tab, open a GLB (or a .gltf with embedded textures); it lists the base colour, normal, roughness/metalness, occlusion and emissive maps, and you pick which ones to upscale.
- Choose 2x or 4x. The Image tab goes up to 8192 px per side; textures written back into a GLB go up to 4096 px.
- Tick the right boxes. Seamless for tiling textures. Normal map on the Image tab for normal maps; the GLB tab finds normal maps and renormalises them on its own.
- Check the cost and upscale. Before you start, the tool shows how many tiles your texture needs: 1 credit per tile of up to 1440 px a side. You need to sign in. If a tile fails or takes too long, its credits are refunded automatically.
- Compare and download. Drag the before/after slider, then download the PNG, or the GLB with the upscaled textures inside.
| Square texture | Tiles (= credits) | Image tab | Inside a GLB |
|---|---|---|---|
| 512 px | 1 | 2x or 4x | 2x or 4x |
| 1024 px | 1 | 2x or 4x | 2x or 4x |
| 2048 px | 4 | 2x or 4x | 2x only (4096 px cap) |
| 4096 px | 9 | 2x only (8192 px cap) | Already at the cap |
Alpha is never sent to the AI: the colour is upscaled and the alpha channel is resized smoothly. In GLB mode, Draco or meshopt mesh compression is not kept, so the new file can be bigger, and KTX2/Basis textures cannot be read.
Upscale the base colour and normal map first and look at the model. Roughness, metalness and occlusion are often fine at their old size, and leaving them out saves credits.
Texture a model first, then upscale it
No good texture to start from? Paint one with AI in the studio, download the GLB, and upscale its maps afterwards.
Open the AI 3D Texturing StudioQuestions
Can you upscale a texture without losing quality?
You can make it larger and sharper, but the new detail is a guess. An AI upscaler rebuilds plausible detail; a plain resize only makes it bigger and softer. If you have the source (a high-poly bake or a procedural material), making the map again at the new size is the only exact way.
Should I use the same AI upscaler for normal maps?
You can, as long as you renormalise the result so every pixel is a unit vector again. Our texture upscaler does that when "Normal map" is ticked, and on its own for normal maps inside a GLB. Upscaling the height map and regenerating the normal map is another good option.
Why does my seamless texture show seams after upscaling?
Because the upscaler saw hard borders at the edges. Pad the texture with strips from the opposite edges before upscaling, then crop them off, so the edges get the same context as the middle. The "Seamless" option in our texture upscaler does this for you.
Should textures be a power of two?
For games, usually yes: 512, 1024, 2048 or 4096 px. Mipmaps work best at those sizes, some platforms need them, and block-compressed DDS must be a multiple of 4 on each side. Upscaling a power of two by 2x or 4x keeps it a power of two.
How do I upscale DDS game textures?
Convert the DDS to PNG, upscale the PNG, then convert it back to DDS in the same format with mipmaps. If you still have the original PNG or TGA, start from that, because the DDS already carries compression artefacts.
Ready to texture something?
Upload a GLB, OBJ, FBX, STL or PLY file (or pick a sample), describe the look, and let AI paint it from every side.
Start texturingStep-by-step tutorials
Keep reading
What is a normal map?
What a normal map is, how its RGB channels store surface direction, why it looks blue, tangent vs object space, OpenGL vs DirectX, and bump vs displacement.
What is texture baking? A plain-English guide for 3D beginners
What texture baking is in 3D: high-poly to low-poly normal maps, ambient occlusion, lighting into colour, procedural to image, and how AI texturing bakes camera views into a UV texture.
PBR maps explained: albedo, normal, roughness, metallic and AO
PBR maps explained for beginners: what albedo, normal, roughness, metallic and ambient occlusion maps do, how a GLB stores them, and how AI textures fit in.
What is a DDS file?
A .dds file is a DirectDraw Surface texture used by games. What is inside (BC1-BC7 compression, mipmaps, cube maps), where you meet it, and how to open or convert a DDS for free.
Sources
Checked 2026-10-18. Other tools change their features and prices often, so check their own pages too.
- Real-ESRGAN (Xintao Wang et al.), code and paper links, BSD-3-Clause
- nightmareai/real-esrgan on Replicate (the model our upscaler calls)
- Khronos Group, glTF 2.0 specification (normal, occlusion and metallic-roughness textures, channel packing)
- MDN: Using textures in WebGL (non-power-of-two limits in WebGL 1)
- Microsoft Learn: Block Compression (Direct3D 10), 4 x 4 blocks and multiple-of-4 sizes