I’m very new to all of this, and I am particularly interested in the Textool by NVIDIA. But I’m not sure how to get it working. Does the application export the compressed texture? Or is this something it just previews?
Hi @joel68! The Texture Tools Exporter both exports and previews compressed textures. (It can also inspect compressed textures and decompress them, plus a lot of other features.)
The basic workflow works like this once you’ve installed the Exporter:
Open a texture
In Photoshop: Go to File > Save a Copy...
. In the file format dropdown, choose “DDS - NVIDIA Texture Tools Exporter” or “KTX2 - NVIDIA Texture Tools Exporter”:
In the standalone version: Click the “Open” button at the bottom-right, or drag and drop a file onto the Exporter window.
Choose a texture format
Choose a texture format from the top-left. There’s a lot of formats, but if you aren’t sure what you want, try BC7. There’s a lot more info in the tooltips if you want to learn more about any of these formats:
If the app can’t read BC7, BC3 will probably work. If that fails, then “8.8.8.8 BGRA” should work. If that doesn’t work, then either the app wants a specific format (possibly stored in a metadata file elsewhere), or it doesn’t read DDS files.
More generally, if your app can read any format and you want to choose the best format for a texture, my decision process usually looks like this:
- If the app was made after about 2010:
- If the texture is grayscale: BC4u
- If the texture contains only red and green channels: BC5u
- If the texture is HDR: BC6u
- If the texture contains values less than 0: BC6s
- Otherwise: BC7
- Otherwise:
- If BC1a looks good when the “Display Compressed” checkbox at the top-right is checked, use BC1a
- Otherwise: BC3
Save the image
Press the “Save” button in the bottom right. That’s all!
Other resources
We have a few videos showing how to use the Texture Tools Exporter in Photoshop in the feature list on the NVIDIA Texture Tools Exporter webpage, covering features like cube mapping, mip mapping, and normal mapping. If you need to compress a lot of textures, the Exporter also works with Photoshop actions, batch files, and has a command-line interface (CLI) – open a terminal and run C:\Program Files\NVIDIA Corporation\NVIDIA Texture Tools\nvtt_export.exe --help
for more information on the CLI.
Please let me know if you have any questions!
–Neil
Thank you so much for the reply Neil. I’m very new to all of this so I’m just learning as I go.
I understand what you’ve explained above, but I have a few more questions -
Since I dont use photoshop I would be using the standalone exporter. I am attaching a few screenshots of my process -
- I have a normal map of size 22MB. It is a 4K texture and my primary goal is to reduce its size.
- I have dragged it into the exporter. I have marked the settings I’ve used as well.
Where I am getting confused is that the output file size isn’t that different. Does this mean I’d have to change the resolution first and then bring the texture in? Or this is a process I can do within the tool?
a. Texture normal map 28MB
b. Texture tools settings -
- I am using BC7
- Compression quality is normal
- The size has only reduced a little bit
- I am assumign I click this save button, correct?
c. However I’ve noticed while selecting BC1a the size has reduced to 11mb. Is there a considerable difference between the formats?
Thanks again!
Hi @joel68! The output size of the DDS file depends on the selected format – BC7 always uses 8 bits (1 byte) per pixel, and BC1 always uses 4 bits per pixel1. In other words, they’re constant-bitrate compression formats. The “bpp” in the format combo box says how many bits per pixel each format uses. When mips are enabled, the compressed size is roughly multiplied by 4/3 - so for a 4K texture with mips , BC7 always takes about 4096 * 4096 * 4/3 bytes = 22.4 MB, and BC1 always takes about 4096 * 4096 * (1/2) * (4/3) bytes = 11.2 MB.
The “Compression Quality” radio buttons determine how much effort the compressor puts in to trying to find the best way to represent each block using the amount of space it has. So, on Fastest, the compressor doesn’t spend much time compressing each block; on Highest, the compressor might search through a lot of possibilities to find which one is best.
(This is a bit confusing because in other tools, the “JPEG Quality” slider usually determines the size of the image. Maybe I’ll rename “Compression Quality” to something else in the future.)
So, when using BC formats, resizing the input is the best way to get a smaller output. (This also means that if you put a DDS file in a .zip archive, you’ll usually get a smaller .zip than the DDS file; zipping a PNG or JPEG will usually create a .zip file that’s larger than the original!)
Interestingly, if you’re not using DDS or are compressing images for Tegra GPUs, there are some formats that are variable bit-rate!
- KTX2 supports “supercompression”; we have Zstandard supercompression turned on by default. (For the moment, you’ll need to save the file to see the file size after Zstandard supercompression). Basis “UASTC” and “ETC1S” formats generate data that uses a custom supercompression format.
- ASTC technically isn’t variable bit-rate, but you can vary the overall constant bit-rate from 8bpp to as low as 0.89bpp. This format is only well-supported on mobile GPUs; on most desktop GPUs, it’ll actually use more GPU memory than BC formats, because the GPU can’t read it directly from its compressed format.
Hope this helps!
–Neil
1 Technically, BC7 takes 128 bits per 4x4 block and BC1 takes 64 bits per 4x4 block – this detail only matters when you think about mips whose width or height isn’t divisible by 4.
thank you so much! This has been very helpful!