Richard Geldreich's Blog
Co-owner of Binomial LLC, working on GPU texture interchange. Open source developer, Open Geospatial Consortium member, graphics programmer, former video game developer. Worked previously at SpaceX (Starlink), Valve, Ensemble Studios (Microsoft), DICE Canada.
Tuesday, September 15, 2026
NNTC viewing example which uses VK_NV_cooperative_vector
Sunday, September 13, 2026
Notes on NNTC vs. neural texturing
NNTC (here on GitHub) 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).
In 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.
However, 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.Training 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.
NNTC also encodes in seconds with CUDA. Even with backprop, I'm skeptical a neural solution can be competitive there.
Saturday, September 12, 2026
NNTC repo now on GitHub
https://github.com/richgel999/nntc/
I got this working after implementing neural texture compression using ES (Evolution Strategies), then realizing (after taking inspiration from the old PVRTC1 texture format) the problem can be easily changed so no neural networks were needed to decode the material channels. The end result is far simpler and faster to encode and sample.
Tuesday, September 8, 2026
Neural texture decoders can suppress DCT ringing artifacts within latent features
The first image is the full texel resolution IDCT decoded level 0 latent, and the second is the fully decompressed image (the output from the ~500 weight neural network, after decoding the 2 latents and local "cell" UV as inputs).
New GitHub repo release: "neural_block_textures"
My latest work in this space is here:
https://github.com/richgel999/neural_block_textures
This is a time stamped Prior Art release dated: September 8, 2026, which will be mirrored to various archives.
Sunday, September 6, 2026
Neural block textures vs. GPU textures (like BC7) at Equal Bitrates
Replace the classical GPU texture decoder (ASTC/BC1-7 etc.) with a neural net (MLP). Now you get as many output channels as needed. Then bilinear filter the "color" endpoints (like PVRTC1), and use a flexible (say 2-4) # of channels.
Even on a single texture (not a material), the bitrate and quality is roughly competitive vs. transform methods on GPU texture latents. Except this method scales easily to materials and inference (decoding) cost is amortized across the material. The more channels the MLP outputs, the lower the effective bitrate.
Around 250-1200 MLP weights seems like a good range for this method. Tiny networks. I don't see why this can't be implemented directly in GPU hardware.
Neural block texture: 43.15 dB
bc7f analytical: 43.78 dB
bc7e_scalar level 0: 41.03 dB
bc7e_scalar level 1: 44.85 dB
bc7e_scalar level 2: 44.67 dB
bc7e_scalar level 3: 45.18 dB
bc7e_scalar level 6 (slowest): 45.59 dB
Neural config: Per-texel "selectors" latent: 2 channels, 4+2 bits (6 bits total)
1/4 resolution "colors" latent: 4 channels, 8-bit channels (32 bits total)
MLP: 1,083 weights
Training: Quant aware, ES+CD, 8k iterations, 106 secs on a 5090
This is a sanity check: at equal very high bitrates, can this format and my trainer match a highly tuned widely deployed BC7 encoder? Yes it can, or very close.
Unlike any GPU texture format, this design is highly configurable/flexible. It easily scales down to low bitrates, or scales wider to handle multi-channel PBR textures with the same latents.
Neural block textures stored inside KTX2: a near-perfect fit
It would compete vs. transform domain codecs (ours and others that are surely coming). Valuable for single textures/photos, PBR material sets, correlated geospatial tiles. At first training will be focused on CUDA with a slow CPU fallback. Target bitrate would be ~1-2.5 bpp (so XUBC7 class, not XUASTC which goes down to ~0.35 bpp). Inference cost is highly amortized across 2+ correlated textures (the more the better).
KTX2 global data can be used to hold the MLP inference weights, and the container format already supports mipmaps, texture arrays, seek tables, etc.