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).

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.

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