Qué hay detrás de neuraltexturees2
Rich Geldreich, veterano de la compresión en juegos (autor histórico de libs como crunch y ex- Valve), publicó el 4 de septiembre de 2026 un repositorio en GitHub llamado neuraltexturees2: una implementación pequeña en C++ que entrena un decodificador neuronal para texturas y materiales PBR (Physically Based Rendering, o renderizado basado en física) usando únicamente Evolution Strategies (ES). No hay backpropagation, no hay autodiff, no hay framework de entrenamiento. Las dependencias son apenas stb_image, stb_image_write y OpenMP.
La fórmula central es directa: una imagen RGB (o hasta cuatro texturas del mismo tamaño que forman un material) se codifica como una textura latente de baja resolución compartida más un MLP (Multi-Layer Perceptron, una red neuronal pequeña) decodificador. La fórmula que el propio repositorio muestra es:
I(u,v) ≈ MLP( bilinear(Z, u, v), phi(u,v) )
🤖 La IA no es solo para leer sobre ella
En la comunidad la aplicamos: automatización, agentes IA y herramientas reales para emprender, no solo para informarte.
👥 Aplicarla en la comunidaddonde Z es el latente y phi un codificado posicional compacto. En el momento de decodificar, cada pixel toma una muestra bilineal de Z en su UV, le concatena phi, y pasa el resultado por el MLP. Una segunda capa latente opcional, más gruesa, se concatena a la primera.
Resultados del repo: 32,2 dB en kodim23
Los números que el repositorio reporta, sobre un recorte de 512×512 de kodim23 (el clásico set Kodak), tras 3.000 iteraciones, con el latente cuantizado a 8 bits y los pesos del MLP contados como fp16, son:
| Latente | PSNR | bpp (raw) | bpp (entropy coded) |
|---|---|---|---|
| 64×64×4 | 26,9 dB | 0,56 | 0,47 |
| 64×64×8 | 28,2 dB | 1,07 | 0,87 |
| 128×128×4 | 30,3 dB | 2,06 | 1,65 |
| 128×128×8 | 32,2 dB | 4,07 | 3,27 |
La corrida 128×128×8 usa un MLP de 14 → 24 → 24 → 3 (1.035 pesos, leaky ReLU, salida sigmoide) y entrena en aproximadamente 150 segundos en una CPU de 32 hilos. Cuantizar el latente a 8 bits cuesta apenas 0,04 dB. El PSNR (Peak Signal-to-Noise Ratio) es la métrica estándar para medir calidad de reconstrucción: a mayor valor, menos diferencia entre la imagen original y la reconstruida.
Para materiales PBR el repo demuestra el caso PavingStones070 (normal, roughness, albedo, AO) entrenado en conjunto desde un latente compartido 128×128×4 + 64×64×4 y un MLP 10 → 36 → 36 → 12 (2.172 pesos), 3.000 iteraciones con annealing de learning rate y finite differences por peso en el último cuarto. Resultado a 8 bits: 2,64 bpp (bits por píxel) totales, 0,66 bpp por textura, con PSNRs por capa de 23,2 / 31,5 / 23,2 / 29,6 dB.
Por qué importa que NO use backpropagation
La parte técnicamente distintiva del repo, según la propia disclosure de prior art de Geldreich, no es la representación neuronal del latente —eso ya es práctica establecida en compresión neuronal— sino cómo se aplica ES sobre ella. En ES ordinario para un latente con 131k valores, la diferencia escalar de pérdida mide la suma de miles de efectos locales y el aporte de cada texel queda enterrado bajo el ruido del resto.
La solución del repo se llama footprint attribution: todos los valores del latente se perturban a la vez, se decodifica la imagen completa dos veces (con +ε y −ε), y la diferencia de pérdida de cada pixel se acredita solo a los texels que el footprint bilinear de ese pixel realmente lee. Como cada texel solo ve los pixeles que dependen de él, se descarta el ruido del resto. Esto produce, en una sola pareja antithetic, estimaciones locales simultáneas para todos los texels del latente. ES clásico ya hacía esto a nivel global; este repo demuestra que funciona a nivel local con un esquema de credit assignment explícito.
El decoder se entrena con un esquema distinto: ES antithetic, 32 parejas de perturbación por paso, cada pareja evaluada sobre el mismo minibatch de 4.096 pixeles, y la estimación alimenta a Adam (optimizador adaptativo estándar para entrenar redes neuronales). El repo también añade, ya entrenando, una fase opcional de finite differences numéricos por peso para el decoder (--mlp-fd), sin backpropagation, que en sus mediciones añade 0,27 dB a 3.000 iteraciones y 0,42 dB a 6.000 (31,38 → 31,80 dB) igualando una corrida de 12.000 en la mitad de iteraciones.
El contexto: Nvidia, Intel y la carrera por la textura neuronal
Este experimento aparece en un momento caliente. Nvidia mostró en GTC 2026 su Neural Texture Compression (NTC), con escenas en las que el uso de VRAM cae de unos 6,5 GB a menos de 1 GB al usar texturas NTC en lugar de BCn, según reportó XDA Developers. Nvidia mencionó ratios de compresión de hasta el 85%, pero la demo corría sobre una RTX 5090: solo las RTX 40 y 50 series tienen Tensor cores con potencia suficiente para reconstruir el latente en tiempo real sin penalizar el frame rate.
Intel, por su parte, presentó TSNC (Texture Set Neural Compression), que se apoya sobre BC1 y codifica un set de texturas en un espacio latente compartido guardado en cuatro niveles de pirámide comprimidos con BC1, reconstruidos por un MLP de tres capas. En pruebas internas de Intel, BC estándar dio ~4,8x de ratio sobre el bitmap control, TSNC Variant A superó 9x, y TSNC Variant B pasó de 18x. Según TechSpot, Intel midió en una iGPU Panther Lake B390 ~0,661 ns/pixel por la ruta FMA (operaciones fused multiply-add) y ~0,194 ns/pixel por la ruta XMX (instrucciones de matriz de Intel, equivalentes a los Tensor cores de Nvidia), una ganancia de ~3,4x. La pérdida perceptual estimada con la herramienta FLIP de Nvidia ronda 5% para Variant A y 6-7% para Variant B.
Lo que hace Geldreich con neuraltexturees2 no compite con esos pipelines industriales en velocidad de decodificación: el suyo es un research toy (lo dice él mismo en el README) pensado para CPUs de escritorio, tarda 150 segundos en entrenar una corrida 128×128×8 y el decoder reconstruye en CPU. Pero ataca un problema diferente: demostrar que se puede entrenar la representación sin backpropagation, lo que abre puertas a codecs no diferenciables — cuantizadores, formatos block-compressed BC1–BC7, BC6H, ASTC (Adaptive Scalable Texture Compression) — metidos directamente dentro del loop de optimización. Como ES solo observa valores de pérdida, ningún operador no diferenciable necesita un surrogate.
¿Qué significa esto para tu startup?
Si tu producto toca gráficos en tiempo real, compresión de assets, o almacenamiento de mallas/materiales, hay tres ideas accionables que te llevas de este repo aunque nunca uses ES:
- El formato objetivo puede vivir dentro del loop de entrenamiento. Geldreich describe explícitamente en su sección «Described, not yet implemented» que el latente puede almacenarse en formatos GPU nativos (BC1–BC7, ASTC LDR y HDR) y el round-trip de encode/decode puede sentarse dentro de cada evaluación de ES sin straight-through estimator. Para un motor indie o un pipeline de assets, eso significa: el codec final puede ser el propio trainer.
- El credit assignment local es lo que desbloquea la escala sin backprop. Si alguna vez optimizas un sistema donde la pérdida es global pero la dependencia espacial es local, vale la pena estudiar el patrón footprint attribution. No es exclusivo de texturas: aplica a cualquier decoder espacial.
- Annealing de learning rate + reset de Adam en cambios de fase importan. Geldreich reporta que el reset de Adam al pasar de la fase ES a la fase finite differences duplicó el efecto de esa última fase (0,27 dB → más). Si entrenas un modelo con un optimizador y cambias de objetivo a mitad de camino, resetear el estado del optimizador puede ser la diferencia entre una mejora marginal y una real.
Para founders que construyen tooling gráfico o de compresión, el repositorio es además una lectura de referencia sobre cómo estructurar un experimento: README + METHOD.md + datos crudos + código fuente reproducible. Es el formato que cualquier paper o demo debería aspirar a tener.
Fuentes
- Fitting Neural Textures and PBR Material Maps with ES (No Backprop) — Rich Geldreich blog (fuente original)
- richgel999/neuraltexturees2 — GitHub
- Intel joins Nvidia in pushing neural texture compression, can shrink game assets by up to 18x — TechSpot
- Nvidia’s new VRAM trick sounds great, until you realize your RTX card can’t even use it — XDA Developers
🤖 La IA no es solo para leer sobre ella
En la comunidad la aplicamos: automatización, agentes IA y herramientas reales para emprender, no solo para informarte.
👥 Aplicarla en la comunidad













