- Para resolver los problemas de calidad del renderizado de texto, especialmente las limitaciones de los métodos basados en SDF (campos de distancia), se propone una nueva técnica de renderizado vectorial en tiempo real
- Al enviar directamente a la GPU los glifos (caracteres) en forma de curvas vectoriales y rasterizarlos en tiempo real, se logra resolución ilimitada y bajo uso de memoria
- Mediante el uso de atlas de texturas y la técnica de acumulación temporal (temporal accumulation), se consigue una alta calidad de antialiasing y un caché eficiente
- Puede adaptarse a distintas estructuras de subpíxeles (por ejemplo, OLED, LCD, etc.), ofreciendo resultados suaves y nítidos sin problemas de fringing (sangrado de color)
- Presenta un enfoque simple pero altamente escalable para el renderizado tipográfico de alta calidad en texto en tiempo real, UI y juegos
Introducción: los desafíos del renderizado de texto
- En el renderizado de texto en tiempo real existen varios problemas, como aliasing (efecto escalonado), texturas grandes, tiempo de build, zoom y desplazamiento suave
- El método ampliamente usado de Multi-Channel Signed Distance Fields (SDFs) tenía limitaciones en calidad y flexibilidad
- A partir de los subpíxeles no estándar en monitores OLED recientes y del problema del fringing, se desarrolló un nuevo enfoque que también contempla el antialiasing por subpíxel
Limitaciones del enfoque SDF tradicional
Calidad
- En el caso de SDF, en tipografías con detalles finos o muchos trazos delgados, aparecen problemas de pérdida de calidad y de información
- Si no se aumenta la resolución, permanecen artefactos en ciertos glifos
Tamaño del atlas
- SDF se genera primero de forma offline y luego se almacena en un atlas, pero con muchos glifos o fuentes CJK (chino, japonés, coreano) el tamaño puede volverse imprácticamente grande
- Si se usan varias fuentes al mismo tiempo, aumentan mucho el consumo de memoria y la carga del ancho de banda de streaming
Flexibilidad y simplicidad
- Como pasa por una etapa intermedia llamada SDF, todo el flujo entre los datos de origen y el resultado final se vuelve más complejo
- Hay muchas limitaciones para usar o editar directamente imágenes vectoriales en tiempo real o de forma dinámica
Nuevo enfoque: rasterización en tiempo real de curvas vectoriales
- En lugar de crear texturas por adelantado, se envían directamente a la GPU los datos de curvas vectoriales de los glifos visibles en pantalla (como curvas Bézier) y se rasterizan en ese momento
- Solo se colocan en la textura atlas los glifos necesarios, manteniéndolos o liberándolos según su frecuencia de uso
- Mientras el glifo permanece en pantalla, se implementa un resultado mucho más suave y de muy alta calidad (anti-aliased) mediante la acumulación de muestras (temporal accumulation)
- Como siempre se procesa de forma vectorial, se obtienen resultados nítidos sin límite de resolución
Procesamiento de datos de curvas tipográficas
- Con bibliotecas open source como FreeType se leen distintos formatos de fuentes y se extrae la información de curvas de los glifos
- Los glifos se parsean como líneas y curvas Bézier cuadráticas/cúbicas, y todas las curvas se convierten a Bézier cuadráticas para simplificar el procesamiento en el shader de GPU
- Las líneas se convierten en curvas cuadráticas añadiendo un punto de control intermedio
- Las curvas cúbicas se convierten en 2 curvas cuadráticas divididas
Cálculo de cobertura (relleno dentro del píxel)
- En cada píxel se calculan las intersecciones entre la curva y un rayo horizontal, y se determina interior/exterior mediante el winding number (número acumulado de cruces)
- Se suman cientos de muestras (n muestras acumuladas), y algunos errores pequeños casi no afectan el resultado final
- Con una técnica de distribución de puntos de muestreo (quasirandom sequence), en cada frame se acumulan resultados desde distintas posiciones
Optimización del acceso a curvas
- El glifo se divide en bandas horizontales, y solo se prueban las curvas relevantes para cada banda para reducir la carga computacional
- Mediante distribución de hilos e iteración por bandas, se maximiza la eficiencia de procesamiento masivo en la GPU
Empaquetado y gestión del atlas
- Se asigna y administra cada imagen de glifo en un atlas (textura compartida)
- Si un glifo no existe, se asigna espacio nuevo y se rasteriza; si ya existe, se reutiliza
- Como referencia, incluso el mismo glifo puede requerir versiones distintas según la posición de subpíxel y el tamaño
- Con Z-Order Packing (Morton code, etc.) se implementa un empaquetado eficiente entre un bitmap unidimensional y un espacio 2D
- Puede aplicarse con flexibilidad según la estructura del idioma, por ejemplo, vertical para alfabetos latinos y horizontal para familias como el árabe
- Cuando un glifo deja de ser necesario, el espacio del atlas se reasigna para volver a usarse
Acumulación temporal (Temporal Accumulation)
- A través del caché de glifos y del método de acumulación de muestras, justo después de mostrarse se obtiene rápidamente un muestreo de alta calidad, y luego se refina con más precisión en frames posteriores
- El primer frame usa 8 muestras por píxel; después la cantidad de muestras disminuye gradualmente, con un máximo de 512 acumulaciones
- Se logra un equilibrio entre visualización suave de glifos y optimización de recursos
Antialiasing por subpíxel y prevención de fringing
- Se asigna el área de renderizado por unidad de subpíxel (tratando cada elemento como muestra, como RGB) para aumentar de forma efectiva la resolución horizontal
- Compatible con la estructura estándar de LCD y con arreglos variados como OLED/WOLED
- Permite definir un efecto suave sin fringing (sangrado de color)
- Al disponer las muestras de subpíxel de forma que se superpongan (overlapping), también se refleja el efecto real de mezcla de luz del monitor
- Se puede obtener una salida natural y nítida incluso sin bordes de píxel ni hinting
La importancia de abordar la estructura de subpíxeles según cada pantalla
- Si la información sobre la disposición de subpíxeles del monitor puede verificarse por software, es posible lograr un renderizado mucho más preciso
- Se enfatiza que no es una limitación del hardware, sino un problema de procesamiento por software
Cierre y perspectivas de uso
- Un buen renderizado de texto influye mucho en la usabilidad general y en la calidad del servicio
- Especialmente en UI/juegos, una representación tipográfica de alta calidad puede marcar una gran diferencia en la experiencia del producto
- Es una estructura de trabajo que puede materializar los principios de simplicidad, escalabilidad, alta calidad y flexibilidad
- Una implementación open source y la compatibilidad con diversos subpíxeles la hacen muy adecuada para uso real en industria/producción
1 comentarios
Comentarios en Hacker News
wgpuusando cosmic-text para el parsing y layout de fuentes, pero les preocupa que después Slug pudiera demandarlos