{"slug": "notes-on-nntc-vs-neural-texturing", "title": "Notes on NNTC vs. neural texturing", "summary": "A developer behind NNTC, an open-source texture compression project on GitHub, reports that a bilinear/degree-2 polynomial decoder fitted to each PBR material can match or beat MLP-based neural texturing on raw PSNR after CUDA encoder optimizations and BC4/BC5 awareness. The developer argues MLP training is more expensive and harder to solve, and that NNTC's use of high-resolution weight planes with GPU texture filtering hardware makes it far faster, encoding in seconds. NNTC currently supports up to 4 channels per latent plane, with possible expansion to 6-8 channels.", "body_md": "NNTC ([here on GitHub](https://github.com/richgel999/nntc/)) uses a bilinear/degree-2 polynomial decoder fitted to each PBR material (i.e. a degree-2 polynomial whose only quadratic terms are the products between the two latents). Other solutions use full non-linear neural networks (MLP's).\n\nIn my testing, MLP's are usually but not always stronger, but not by much (low PSNR difference, like ~1-3 dB). MLP's also make it harder to get filtered samples - NNTC easily leverages existing GPU texture filtering hardware.\n\nHowever, eventually as I optimized the NNTC-specific CUDA encoder, and made it BC4/BC5 aware, it started to beat my neural network based solution on raw PSNR. \n\nTraining MLP's is a lot more expensive, and a harder problem to solve - and IMHO unnecessary for PBR textures if you *configure the latent textures correctly*. Encoding high frequency details into low-res feature channels and training MLP's to decode them is going to be quite expensive. The alternative is to do what GPU texture formats like BC1-7/PVRTC1/ASTC/etc. have been using for ages: use high resolution weight planes, and optionally (for more efficient distribution) supercompress the data in some way using RDO+LZ, DCT etc.\n\nOne of NNTC's current limits: it only supports up to 4 channels on each of the two latent planes. I may expand this to up to ~6-8 channels in the future. If I hadn't implemented a neural net prototype first, I couldn't have found a way to NNTC.\n\nNNTC also encodes in seconds with CUDA. Even with backprop, I'm skeptical a neural solution can be competitive there.", "url": "https://wpnews.pro/news/notes-on-nntc-vs-neural-texturing", "canonical_source": "https://richg42.blogspot.com/2026/09/notes-on-nntc-vs-neural-texturing.html", "published_at": "2026-09-13 20:05:41+00:00", "updated_at": "2026-09-14 17:24:47.771831+00:00", "lang": "en", "topics": ["machine-learning", "neural-networks", "computer-vision", "ai-research", "developer-tools"], "entities": ["NNTC", "GitHub", "CUDA", "BC1", "BC4", "BC5", "PVRTC1", "ASTC"], "alternates": {"html": "https://wpnews.pro/news/notes-on-nntc-vs-neural-texturing", "markdown": "https://wpnews.pro/news/notes-on-nntc-vs-neural-texturing.md", "text": "https://wpnews.pro/news/notes-on-nntc-vs-neural-texturing.txt", "jsonld": "https://wpnews.pro/news/notes-on-nntc-vs-neural-texturing.jsonld"}}