NVIDIA Texture Tools 3

Create block-compressed textures and write custom asset pipelines using NVTT 3, an SDK for CUDA-accelerated texture compression and image processing.

NVTT 3 can be used to compress textures to and from block-compressed formats including BC1-7 and LDR ASTC, which stay small both on disk and in GPU memory. Or use its image processing functions, like mipmapping and convolution, as part of a custom app or asset processing pipeline. CUDA-accelerated operations speed up processing significantly, with CPU fallbacks for maximum compatibility.

NVTT 3 exposes a quick and powerful API (a C++ command-line compressor using it fits in 250 characters) and a C wrapper for use with other languages. The library is a reliable component within NVIDIA, and already fully integrated in technologies including Omniverse, the Texture Tools Exporter, and more.

nvtt3-quads-crop-4k.jpg

What’s New in NVTT 3

nvtt3-codesample-dark.png

New APIs

Compress textures entirely within GPU memory with the new On-The-Fly API. 200+ functions are available from both C and C++.

cuda-acceleration.png

Comprehensive CUDA Acceleration

NVTT 3 adds CUDA compression for BC4-BC7 and ASTC, most image processing operations, and GPU device selection.

marbles-astc-repeat.png

Adaptive Scalable Texture Compression

Scalably compress textures for Tegra GPUs, from 8 bits per pixel with BC7-like quality, to as compactly as 0.89 bits per pixel.

Download NVTT 3

Windows

The NVTT 3 SDK is packaged with the NVIDIA Texture Tools Exporter.

Operating System Windows 10, 11 (64-bit only)
Requirements C++ API: MSVC toolset v14x
C API: Compiler supporting at least C99 and dynamic linking
Download Now

Linux AArch64

On Linux, the NVTT 3 SDK is packaged by itself.

Operating System Ubuntu 18.04+ or similarly compatible distro
Requirements glibc version 2.27 or higher
libc.so version 6 or higher
C++ API: Compiler ABI-compatible with g++ 5.4.0
C API: Compiler supporting at least C99 and dynamic linking
Download Now

Linux x86_64

On Linux, the NVTT 3 SDK is packaged by itself.

Operating System Ubuntu 16.04+, CentOS 7, or similarly compatible distro
Requirements glibc version 2.4 or higher
libc.so version 6 or higher
C++ API: Compiler ABI-compatible with clang 8.0.1
C API: Compiler supporting at least C99 and dynamic linking
Download Now
Release Notes

3.2.5
  • Added min and max filters. These are useful for effects like parallax occlusion mapping.
  • nvcompress: Fixed a bug where an extra mip would be generated when using --max-mip-count or --min-mip-size.
  • nvcompress: Fixed a bug where nvcompress would crash on files whose paths contained emoji.
  • nvcompress: Fixed a bug where compressing more than 509 files at a time would fail.
3.2.4
  • Fixed naming of NVTT_VERSION fields to make the mapping to semantic versioning clearer. For instance, NVTT 3.2.4 is fork 3, major version 2 (incremented on API breaks), minor version 4 (incremented on new features and bug fixes).
  • Added a safer 4-argument overload of `TimingContext::GetRecord()`, which takes the size of the buffer to write the description to, and deprecated the 3-argument version.
3.2.3
  • BC1-BC3: Fixes a bug in 3.2.2 where CUDA compression on Turing GPUs would produce a `cudaErrorIllegalAddress` error.
  • Fixes a bug where nvtt::Surface::createSubImage() and nvtt::Surface::diff() did not copy the texture type, alpha mode, wrap mode, or normal flag from their input(s) to their output nvtt::Surface.
3.2.2
  • BC1–BC3, BC1a: Improved compression quality at Quality::Production|Highest.
  • BC7, ASTC: Fixes a bug where images marked opaque would use a transparent compressor, and images marked transparent would use an opaque compressor.
  • Improved nvcompress' performance on images over 6.25 megapixels.
  • Added --max-mip-count, --nim-mip-size, and --no-mip-gamma-correct options to nvcompress.
  • Renamed nvbatchcompress.exe to nvbatchcompress.bat; nvbatchcompress' functionality has been merged into nvcompress.
  • Retargeted CUDA dependency to version 11.8.
3.2.1
  • Adds Surface::loadFromMemory(), Surface::saveToMemory(), and CubeSurface::loadFromMemory(). These variants of Surface::load() and Surface::save() work on in-memory data.
  • Faster compression when using the nvtt::Context API and the nvtt::Surface data is not in VRAM.
  • Faster GPU BC6 compression.
  • Fixes a bug where the CPU BC1 compressor would sometimes encode transparent single-color blocks with transparency.
3.2.0
  • Adds precompiled kernels for Hopper and Ada GPUs.
  • Adds 16-bit half float (nvtt::ValueType::FLOAT16) as an input to the low-level API.
  • Faster BC6H GPU compression.
  • Adds BC3n GPU compressor.
  • Adds nvtt::SetMessageCallback(). NVTT now reports errors, warnings, and messages through each thread's message callback. In particular, this can be used to detect errors even when a function does not return bool.
  • Adds nvtt::Surface::gpuDataMutable(). This allows NVTT Surface data to be used with your own custom CUDA kernels, without requiring a const_cast.
  • Adds unclamped sRGB transfer functions (toSrgbUnclamped() and toLinearFromSrgbUnclamped()). These allow HDR images to be converted to sRGB and back without significant information loss.
  • Adds toLinearFromXenonSrgb(), the inverse of toXenonSrgb().
  • Adds nvtt::nvtt_encode() and nvtt::EncodeSettings to the low-level API. nvtt_encode() unifies all low-level compression functions under a single interface, and EncodeSettings can be extended to add new features without breaking the API. Adds aarch64 Linux builds.
  • x64 Linux builds are now compatible with CentOS 7 and glibc 2.2.5.
  • Fixes an out-of-bounds write within the BC2 GPU compressor.
  • Fixes a bug where the C wrapper and C++ Error enumerations didn't match.
  • Fixes a bug where the slow-mode BC1 CPU compressor would sometimes output blocks with alpha, if the input had variegated blocks with semitransparent pixels. (Thank you to tgrimmer on the NVIDIA Developer Forums.)
  • Fixes a bug where nvtt::Surface::toSrgb() turned 1.0 into 0.999999940 instead of 1.
  • Fixes a bug where nvttContextQuantize() was missing from the C wrapper symbols. (Thank you to mijalko on the NVIDIA Developer Forums.)

Resources

Online Tutorials and Samples

Tutorials and samples for NVTT3, including reimplementations of some of the tools shipping with NVTT 3, are available at https://github.com/nvpro-samples/nvtt_samples.

Full Documentation

Documentation for every function in NVTT and a getting started guide are available as part of the NVTT 3 package, starting from docs/index.html.