The 3D Handbook
Reference

Texture file formats

PNG, TGA, JPEG, TIFF, PSD, EXR, HDR, WebP, DDS and KTX2 compared for game work; bit depth, alpha, compression, which engines import what, and the difference between source formats and GPU-ready formats.

texturesfoundationsexportpipeline

A texture file format is how an image is stored on disk. Game work uses two kinds: source formats you paint, bake and export to (PNG, TGA, TIFF, PSD, EXR), and GPU-ready formats that already hold compressed data the graphics card can read directly (DDS, KTX2). Engines such as Godot and Unreal take source formats and compress them on import (Godot documentation: Importing images; Unreal Engine documentation: Texture Compression Settings); see texture formats, compression and mipmaps.

The questions that matter for each format are bit depth, alpha, compression, and whether your engine reads it.

#Comparison

Format Bit depth per channel Typical use Engine notes
PNG (.png) 8 or 16 (Substance 3D Painter documentation) Most exported maps Godot limits PNG precision "to 8 bits per channel upon importing" (Godot documentation); Unity reads it (Unity Manual)
TGA (.tga) 8 only (Substance 3D Painter documentation) Exported maps Imported by Godot and Unity (Godot documentation; Unity Manual)
JPEG (.jpg) 8 only (Substance 3D Painter documentation) Reference and photos "Doesn't support transparency" (Godot documentation)
TIFF (.tif) 8, 16 or 32-bit float (Substance 3D Painter documentation) High-precision bakes and masters Unity reads it and flattens layers on import (Unity Manual); not on Godot's list (Godot documentation)
PSD (.psd) 8 or 16 (Substance 3D Painter documentation) Layered source files Unity flattens layers on import, but "not to the file itself" (Unity Manual); not on Godot's list (Godot documentation)
OpenEXR (.exr) 16 or 32-bit float (Substance 3D Painter documentation) HDR skies, height and displacement Godot: "Supports HDR (highly recommended for panorama skies)" (Godot documentation); Unity picks an HDR output format automatically (Unity Manual)
Radiance HDR (.hdr) HDR (Godot documentation) HDR skies and probes Godot and Unity import it (Unity Manual)
WebP (.webp) 8 only (Substance 3D Painter documentation; Godot documentation) Web and 2D Supports transparency; lossy or lossless
DDS (.dds) Depends on the stored GPU format Shipping GPU-ready textures; custom mipmaps Uncompressed or block-compressed (DXTn) data (Microsoft Learn); Godot loads included mipmaps directly (Godot documentation)
KTX / KTX2 (.ktx2) Depends on the stored GPU format glTF, web and cross-platform delivery KTX2 adds Basis Universal supercompression (khronos.org); Godot imports 2D KTX only, without cubemaps or arrays (Godot documentation)

#Source formats

Bit depth sets how many steps each channel has. 8 bits give 256 levels, enough for most colour maps; height maps and smooth gradients may band. See bit depth and banding. Adobe's Painter export table is a handy reference for which formats can hold more: TGA, JPEG, BMP and WebP are 8-bit only, PNG and PSD 8 or 16-bit, TIFF up to 32-bit float, and OpenEXR 16 or 32-bit float (Substance 3D Painter documentation: Export settings).

Top, two grey gradient strips: one with 64 fine steps that reads as smooth, one with 8 coarse steps that shows clear bands. Bottom, a side profile of a terrain slope drawn twice: a smooth dashed line labelled 16-bit, 65,536 steps of 7.8 millimetres, and an orange staircase labelled 8-bit, 256 steps of 2 metres, terraces. A note says the profile is not to scale.
Why the file format's bit depth matters for some maps. Too few steps turn a smooth gradient into bands, and a terrain heightmap into terraces. Export height and other smooth data to a 16-bit PNG or an EXR.Diagram by the handbook author

Layers are only useful in the source file. Unity can import a layered PSD, but "flattening happens to the imported data in Unity, not to the file itself", so you can keep editing and re-importing (Unity Manual: Import a texture).

Supported lists differ. Unity reads BMP, EXR, GIF, HDR, IFF, JPG, PICT, PNG, PSD, TGA, TIFF and SVG (Unity Manual: Import a texture). Godot lists BMP, DDS, KTX, EXR, HDR, JPEG, PNG, TGA, WebP and SVG (Godot documentation: Importing images). Note that Unity's list has no DDS or KTX, and Godot's has no PSD or TIFF.

#GPU-ready formats

DDS is Microsoft's container: Direct3D uses it "for storing uncompressed or compressed (DXTn) textures", and it "supports single layer textures, textures with mipmaps, cube maps, volume maps and texture arrays" (Microsoft Learn: Programming Guide for DDS). Its DX10 header extension adds formats the original header cannot express, "such as floating point formats, sRGB formats" (Microsoft Learn: Programming Guide for DDS). Because the data is already block-compressed, the engine does not have to compress it again.

Three panels. Left, a 4 by 4 grid of sixteen slightly different greys forming a diagonal gradient. Centre, two endpoint swatches labelled A and B, outlined in orange, with two mixed greys between them on an orange line, numbered 0 to 3. Right, the same 4 by 4 grid redrawn with only those four greys, each cell labelled with its index from 0 to 3. Text below: 2 endpoints times 16 bits plus 16 indices times 2 bits equals 64 bits, 8 bytes; the same pixels as RGBA8 take 64 bytes, so BC1 is 8 to 1.
What "block-compressed" means inside a DDS or KTX file, using BC1 as the example. Each 4 × 4 block keeps two endpoint colours and a 2-bit index per pixel, an eighth of the size of uncompressed RGBA8. See texture compression for the other formats.Diagram by the handbook author

KTX is the Khronos equivalent: "an efficient, lightweight container format for reliably distributing GPU textures to diverse platforms" (khronos.org: KTX: GPU Texture Container Format). KTX 2.0 "adds support for Basis Universal supercompressed GPU textures", which "can be efficiently transcoded to a variety of GPU compressed texture formats at run-time" (khronos.org: KTX: GPU Texture Container Format). The KHR_texture_basisu extension lets glTF files carry KTX 2.0 textures (khronos.org: KTX: GPU Texture Container Format).

#Common mistakes

Related: texture formats, compression and mipmaps, bit depth and banding, colour space: sRGB and linear, channel packing, mipmaps, 3D file formats.

#Further reading and watching

References

  1. Godot Engine contributors · Importing images (documentation source) · Godot documentation (GitHub) · docs · accessed 2026-10-21
  2. Epic Games · Texture Compression Settings (Unreal Engine 4.27) · Unreal Engine documentation, 2021 · docs · accessed 2026-10-21
  3. Adobe · Export settings · Substance 3D Painter documentation · docs · accessed 2026-10-21
  4. Unity Technologies · Import a texture · Unity Manual, 2026 · docs · accessed 2026-10-21
  5. Microsoft · Programming Guide for DDS · Microsoft Learn (Win32), 2026 · docs · accessed 2026-10-21
  6. Khronos Group · KTX: GPU Texture Container Format · khronos.org, 2026 · docs · accessed 2026-10-21
  7. Unity Technologies · Preparing your model files for export · Unity 6.6 Manual, 2026 · docs · accessed 2026-10-20

Last updated 2026-10-22