Skip to content

donmccurdy/KTX-Parse

Repository files navigation

ktx-parse

Latest NPM release npm bundle size License CI Coverage

KTX 2.0 (.ktx2) parser and serializer.

Quickstart

Install:

npm install --save ktx-parse

Import:

import { read, write } from 'ktx-parse';

Usage:

// Parse texture container from file:
const container = read(data /* ← Uint8Array or Buffer */);

// Write texture container to file:
const data = write(container); // → Uint8Array

See API documentation for more details:

Encoding / Decoding

KTX-Parse reads/writes KTX 2.0 containers, and provides access to the compressed texture data within the container. To decompress that texture data, or to compress existing texture data into GPU texture formats used by KTX 2.0, you'll need to use additional libraries such as encoders or transcoders.

Encoding:

Encoding GPU textures is a slow process, and should be completed at development/authoring time so that the compressed texture can be transmitted to the viewing device. GPU textures require much less GPU memory than image formats like PNG or JPEG, and can be uploaded to the GPU quickly with less impact on framerate. GPU textures can also have smaller filesizes in many, but not all, cases. See the Basis documentation for details on this process.

The following tools may be used to produce Basis Universal compressed textures in KTX 2.0 (.ktx2) containers, which ktx-parse can then read or edit:

Transcoding / Decoding:

Basis Universal texture formats (ETC1S and UASTC) cannot be directly read by a GPU, but are designed to be very efficiently rewritten into many of the specific GPU texture formats that different GPUs require. This process is called transcoding, and typically happens on the viewing device after a target output format (e.g. ETC1, ASTC, BC1, ...) is chosen. These transcoders can also fully decode texture data to uncompressed RGBA formats, if raw pixel data is required.

  • BinomialLLC/basis_universal provides official C++ and WebAssembly transcoders, which support all Basis Universal input formats and can transcode to any output format (with appropriate compilation flags). With common settings, a transcoder will likely be > 200kb on web. This transcoder can read KTX 2.0 files directly.
  • KhronosGroup/Universal-Texture-Transcoders provides very small, fast WebAssembly transcoders each supporting only a single output texture format. Each transcoder is roughly 10-20kb, and the viewing device can choose which transcoder to download, as appropriate. These transcoders cannot read KTX 2.0 files directly. Instead, unpack the KTX 2.0 files with ktx-parse first, then transcode the mip levels using a low-level transcoder. Only UASTC texture formats currently supported.