What’s that magic computation in stb__RefineBlock (in stb_dxt.h)?
added on 2022/11/09 @ 11:07:12 | 374 views| category: gamedev

Back in 2007 I wrote my DXT1/5 (aka BC1/3) encoder rygdxt, originally for “fr-041: debris” (so it was size-constrained). A bit later I put up the source and Sean Barrett adapted it into “stb_dxt”, which is probably the form that most know it in today.

It’s a simple BC1 encoder that gives decent quality, the underlying algorithm is reasonably fast (fast enough to say bake textures you produce once per session in a game from a character creator, say, which is one of the cases I’ve ended up using it in in a professional context), and is easy to integrate.

...

That leaves us with the actual subject of this blog post, the iterative refinement logic! I just answered an email by someone asking for an explanation of what that code does and why, so here goes.


The stb__RefineBlock() function:
https://github.com/nothings/stb/blob/8b5f1f37b5b75829fc72d38e7b5d4bcbf8a26d55/stb_dxt.h#L399

DXT encoder in STB:
https://github.com/nothings/stb/blob/master/stb_dxt.h

tags: #gamedev #dxt #bc1