NVIDIA Texture Tools Exporter 2024.1.0 / NVTT 3.2.5 Released

I’m happy to announce that Texture Tools Exporter 2024.1.0 and NVTT 3.2.5 have been released!

This release brings new resize filters, a new Swizzle utility effect, --max-mip-count and --min-mip-size controls, bug fixes, and more. Here are the full release notes!


  • Added min and max filters. RTX Remix uses these to generate the textures it uses for parallax occlusion mapping!

From Half-Life® 2 RTX

  • 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 characters outside the currently enabled code page.
  • nvcompress: Fixed a bug where compressing more than 509 files at a time would fail.

Thank you to Developer Forums user Dr. Mona for reporting these issues!

  • Fixed a GCC warning about the [[deprecated]] attribute being applied after the return type in nvtt_lowlevel.h.

  • Attempting to create an nvtt::Surface with a width, height, or depth that would overflow an underlying integer type now produces an error instead of overflowing.

NVTT Exporter

  • The “Override Filter Parameters” UI now shows the full set of parameters NVTT supports for each resizing filter, along with dedicated names and tooltips for each one.

Here’s an example for the Kaiser filter! Previously, you could only override the filter width.

  • Added Mitchell-Netravali, min, and max mipmapping filters.

Mitchell-Netravali filtering is like Kaiser-windowed sinc filtering, but has less ringing. It also has sharpness and roundness parameters! B=0, C=0.5 is a Catmull-Rom filter, B=1, C=0 is a B-spline filter.

  • Added Resize effect.

This allows you to perform arbitrary image resizing! It supports all the same options as mipmapping, plus several modes for controlling how images are resized. We’re using the “Fit if Larger (Proportional)” mode in one application to batch resize images to 4K if they’re too large. Here’s what it looks like in a different mode which proportionally scales the image so that its width is a certain number of pixels:

The Resize effect and all its controls.

  • Added Swizzle effect.

Have an image that was stored with the R and B components flipped? Or stored in RGBA8, but with a different endianness or components order? Or need to write to an unusual BC3 format other than BC3n or AGBR/RXGB? This utility effect can rearrange the components for you, or set them to constant values!

The Swizzle effect, and its options to set the R, G, B, and A components to components of the input, or the constant values 1, 0, or -1.

  • Added Maximum Mipmap Count (--max-mip-count), which sets the maximum number of mipmaps (including the base mip) to generate, and Minimum Mip Size (--min-mip-size), which sets the minimum width or size of any mip.

These are especially useful when you’re working with an engine that uses an old version of DirectX, where all mips of block-compressed textures had to have width and height divisible by the block size (usually 4). By default, the tool will generate a full mip chain, including 2x2 and 1x1 mips for power-of-two images. Now, you can set “Minimum Mipmap Size” to 4 to have it stop at the 4x4 mip.

Minimum Mipmap Size, set to 4 px, and Maximum Mipmap Count, set to MAX.

  • --no-mips now only controls whether mips are generated.

Previously, it also controlled whether mips are read. The 2023.3.2 --no-mips option is equivalent to 2024.1’s --no-mips --max-mip-count 1.

  • Added “Export Transfer Function” overrides for sRGB and Linear formats.

By default, the Exporter tries to choose the DXGI and Vulkan formats that are compatible with as many applications as possible, and use the color spaces most engines expect. However, there are cases where the engine expects a file with specific color space flags, doesn’t have logic to remap formats, and where the easiest place to fix this issue is in the texture compression pipeline. Now, you can select between _SRGB and linear (KTX) or untagged (DDS) formats if you want to!

  • Improved GLEW initialization compatibility.

This works around an issue where some drivers on non-NVIDIA GPUs would return an OpenGL version string listing a version of 1.0 when the Exporter Photoshop plugin tried to create a default OpenGL context; GLEW requires OpenGL 1.1 or higher. The Exporter now checks for this; if it detects this has happened, it tries to request OpenGL 3.0. Thank you to several Developer Forums users for reporting this!

  • Fixes in our fork of FreeImage for CVE-2023-47992 through and including CVE-2023-47997.

  • TIFF loading now supports Zstandard compression.

  • Fixes an issue where trying to save Basis data to a DDS file would produce an empty file.

If you spot any bugs in the new version, please don’t hesitate to contact us at texturetools@nvidia.com or in this forum. Thanks again!

1 Like