Saltar al contenido
Menú
← Volver al blog

Cómo corregimos el error de texto 8K de Nova UI en WebGL

Frustrated developer comparing broken glyph rows in the browser console and Unity Editor.

Corrección del error de texto 8K de Nova en nuestra compilación WebGL

14 de junio de 2025 · 6 minutos de lectura

Resumen

  • Síntoma: los textos de más de unos 260 caracteres mostraban artefactos cada pocos glifos, solo en WebGL.
  • Causa: el renderizador alternativo de Nova empaquetaba los vértices en una textura RGBA unidimensional que superaba el límite de 8192 píxeles de WebGL.
  • Solución: distribuir el búfer en filas de 8192 píxeles y usar el mismo ancho en el shader.

El error: artefactos en textos largos

Las pruebas detectaron que los diálogos de más de 260 caracteres ≈ 1024 glifos se deformaban en WebGL: los caracteres desaparecían o se intercambiaban aproximadamente cada 20 glifos. En el editor todo parecía correcto hasta que forzamos SystemSettings.UseFallbackRendering = true, y el problema apareció también allí.

// WebGL console
Texture has out of range width (got 12800 max supported 8192)

Causa: búferes alternativos demasiado grandes y desalineados

Nova usa un búfer de textura cuando no hay SSBO, como sucede en WebGL. Un vértice de glifo ocupa 64 bytes, equivalentes a cuatro píxeles float4. Un <TextBlock> con 3224 vértices generaba una textura de 12896 × 1 píxeles, muy por encima del límite de WebGL. Tras limitar el ancho a 8192 píxeles, apareció otro problema: el shader seguía suponiendo filas de 16384 píxeles. Las ediciones escribían en una fila y la GPU leía de otra.

La solución en dos commits

1. Distribuir el búfer de textura en filas

int maxEdge = 8192;
int width   = Mathf.Min(numPixels, maxEdge);
int height  = Mathf.CeilToInt((float)numPixels / width);
texture = new Texture2D(width, height, TextureFormat.RGBAFloat, false, true);

2. Sincronizar la constante del shader

#if defined(NOVA_FALLBACK_RENDERING)
  #if defined(UNITY_WEBGL) || defined(UNITY_EDITOR)
    #define MAX_TEXTURE_DIMENSION 8192u
  #else
    #define MAX_TEXTURE_DIMENSION 16384u
  #endif
#endif

También corregimos SetData() para respetar shaderBufferStartIndex * 4 en las rutas RGBA. Las ediciones durante la ejecución dejaron de sobrescribir glifos anteriores.

Resultados

Compilación WebGL: sin artefactos ni fallos. Las compilaciones de escritorio con SSBO de 16384 píxeles permanecen sin cambios. El editor todavía muestra algún comportamiento extraño, pero ahora mismo no es una prioridad.

¿Qué sigue?

La corrección ya está en develop y debería llegar en la próxima versión alfa. Si has encontrado problemas similares con Nova UI, cuéntanoslo en Discord, Facebook o en los comentarios.

Discord · Facebook

Leave a Comment

Scroll to Top