Normal Map Converter
Convert tangent-space normal maps between OpenGL and DirectX conventions directly in your browser.
PNG, JPG & WebP · Local processing · Free
Open Normal Map ConverterEstimate GPU memory usage for textures based on resolution, format, compression and mipmaps.
Compare a single 2D texture or a group with identical settings. Calculations stay in your browser.
The default estimate is shown below. Enable JavaScript to change the settings.
21.33 MiB
2048 × 2048 · 1 texture · RGBA8 · Mipmaps On · 12 mip levels
22,369,620 bytes in total
Theoretical 2D texture storage, not measured VRAM. Engine settings, GPU allocation and streaming can change actual memory use.
Runs locally. No uploads, saved inputs or calculation requests.
Same dimensions, texture count and mip settings. Equal size does not mean equal quality or platform support.
| Format | Per texture | All textures |
|---|---|---|
| RGB8Selected | 16.00 MiB | 16.00 MiB |
| RGBA8Selected | 21.33 MiB | 21.33 MiB |
| BC1Selected | 2.67 MiB | 2.67 MiB |
| BC3Selected | 5.33 MiB | 5.33 MiB |
| BC5Selected | 5.33 MiB | 5.33 MiB |
| BC7Selected | 5.33 MiB | 5.33 MiB |
1 KiB = 1,024 bytes · 1 MiB = 1,024 KiB · 1 GiB = 1,024 MiB. Rounded values; the exact selected total appears above.
A texture budget starts with the surfaces the player can actually see. Compare resolution and storage formats before importing a full material library, then confirm your choices with the engine profiler. This calculator helps estimate texture storage; it does not compress images or measure your graphics card.
For an asset with base color, normal and roughness maps, calculate each format group separately and add the totals. The texture count applies the same dimensions and format to every texture. Use the PBR map setup guide to identify the channels your material actually uses before counting them.
For each mip level, RGB8 uses width × height × 3 bytes and RGBA8 uses width × height × 4. BC formats store 4 × 4 texel blocks: multiply ceil(width / 4) × ceil(height / 4) by 8 bytes for BC1 or 16 bytes for BC3, BC5 and BC7. Even a 1 × 1 compressed mip needs a complete block.
Each enabled level is summed before multiplying by the texture count. This is a tightly packed storage estimate: dimensions that are not multiples of four are rounded up to full blocks for this calculation, not certified as valid texture resources on every graphics API. Imported size and alignment rules can differ.
A full chain halves each dimension, rounding down and never going below one, until both reach 1 × 1. For a large square, power-of-two uncompressed texture, the extra levels approach one third of the base size. That shortcut is less useful for small textures, narrow rectangles and block-rounded levels, so this tool adds the real level sizes instead.
For example, 2048 × 2048 RGBA8 occupies 16 MiB without mips and 22,369,620 bytes (about 21.33 MiB) with all 12 levels. A 1 × 8 RGBA8 texture has levels 1 × 8, 1 × 4, 1 × 2 and 1 × 1: 60 bytes in total instead of a simple 33% allowance. Mipmaps can improve sampling at a distance; disabling them solely to save storage may introduce visible aliasing.
BC1 favors compact color storage with limited alpha. BC3 provides a separate alpha component. BC5 stores two channels and is often chosen for normal-map data. BC7 targets higher-quality color and alpha on platforms that support it. These choices are not interchangeable simply because several occupy the same space: inspect your imported texture and target platform.
See Microsoft's BC format reference for storage and support details. Before optimizing a normal map, resolve shading problems with the normal-map convention troubleshooting guide; changing compression will not repair an inverted green channel.
A 4096 × 4096 texture contains four times as many pixels as a 2048 × 2048 texture. With the same uncompressed format, its base memory also quadruples. Decide whether that detail is visible using the texture resolution guide for 3D assets, and keep detail consistent across objects with the texel-density workflow.
Reducing texture memory addresses one part of an asset budget. Geometry, draw calls and materials also matter: use the game asset optimization workflow to identify the bottleneck before changing every texture.
The result estimates theoretical storage for the selected 2D texture levels, not exact VRAM used by Unity, Unreal Engine or another runtime. GPU, platform, graphics API, allocation alignment, padding, import settings and format conversion can change the footprint. RGB8 is particularly important: Unity documents RGB24 conversion to RGBA32 on GPUs without native support. Choose RGBA8 here to estimate that expanded storage.
Streaming may keep only some mips resident. Virtual texturing, arrays, cubemaps, runtime or CPU copies, render targets and engine implementation add other considerations outside this model. The number shown is also different from a PNG or JPEG file's compressed disk size. Check the imported format and resident memory on the actual target device.
Use the Unity import-settings checks when the engine result differs from the estimate. Return to 3DSkillUp Tools for other focused texture utilities.
For 4096 × 4096 without mipmaps, RGB8 is 48 MiB, RGBA8 is 64 MiB, BC1 is 8 MiB, and BC3, BC5 or BC7 is 16 MiB. Add mipmaps and texture count using the calculator to estimate the complete set.
Yes, when all levels are stored. The exact increase depends on dimensions and format; the calculator includes every level down to 1 × 1 when the toggle is on.
It encodes texture data in fixed-size 4 × 4 blocks that supported GPUs can sample. It is different from simply saving a smaller image file for download.
No. It is a planning estimate. Profile the imported texture on the target platform to account for format changes, streaming, allocation and additional copies.