KTX files are texture files used on mobile. Beamdog converted the base game files to KTX for that dataset. They sorta-kinda work on desktop but see notes below. They might also not work perfectly on mobile to be honest due to same issues.
Due to the specification it's not recommended to use them over DDS which especially for PBR files have much more optimal versions for space/efficiency/quality.
The version the game loads is the ETC2 compression version used for OpenGL ES 3.0. This is a KTX1 texture format (the file name needs to be filename.ktx for the game to load it). ETC2 is similar to the BC type compression found in DDS files, as in it is the same size for each resolution.
The game only loads RGB and RGBA versions. This means no R or RG versions (well it tries to load them, but incorrectly as RGB or RGBA) so there is no efficiency saving for normal or spec/roughness maps. Even for basic normal maps they'll be much larger due to 3 channels. There is also no sRGB support, which is a higher quality version.
They load fine if set properly as per the tools below, but only as a 3 channel RGB (or 4 channel RGBA, although not many reasons to use alpha in textures nowadays in NWNEE) but this is very space inefficient compared to DDS.
These are the types for OpenGL ES 3.0 with notes:
| File Specification | Definition | NWN EE Notes |
|---|---|---|
| GL_COMPRESSED_R11_EAC | 11 bits for a single channel. Useful for single channel data where higher than 8 bit precision is needed. For example, heightmaps. | |
| GL_COMPRESSED_SIGNED_R11_EAC | Signed version of GL_COMPRESSED_SIGNED_R11_EAC, useful when signed data is needed. | |
| GL_COMPRESSED_RG11_EAC | 11 bits for two channels. Useful for two channel data where higher than 8 bit precision is needed. For example, normalised bump maps, the third component can be reconstructed from the other two components. | |
| GL_COMPRESSED_SIGNED_RG11_EAC | Signed version of GL_COMPRESSED_RG11_EAC, useful when signed data is needed. | |
| GL_COMPRESSED_RGB8_ETC2 | 8 bits for three channels. Useful for normal textures without alpha values | This is the standard non-alpha texture format NWNEE reads |
| GL_COMPRESSED_SRGB8_ETC2 | sRGB version of GL_COMPRESSED_RGB8_ETC2 | |
| GL_COMPRESSED_RGBA8_ETC2_EAC | 8 bits for four channels. Useful for normal textures with varying alpha values | This is the alpha texture format NWNEE reads The game defaults to 0.5 alpha mean values for KTX textures. |
| GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC | sRGB version of GL_COMPRESSED_RGBA8_ETC2_EAC | |
| GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 | 8 bits for three channels and a 1 bit alpha channel. Useful for normal textures with binary alpha values | Punchthrough is not supported explicitly. |
| GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 | sRGB version of GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2. | Punchthrough is not supported explicitly. |
There are two main issues:
So you either have space efficient DDS files for majority of players and mobile players lose out or have KTX and waste a lot more space with 3 channel files when 1 or 2 would do.
There are some tools used to test the game files for ETC2:
Currently the follow on KTX2 format which has advanced algorithms to do smaller efficient files, with compression to boot, are not supported by the game. This would have been an improvement possibly on using DDS files in general!
Mainly this means more modern KTX tooling is geared towards this meaning the KTX Tools and NVIDIA tools and others are not going to work on NWNEE alas.