- Propõe uma nova técnica de renderização vetorial em tempo real para resolver problemas de qualidade na renderização de texto, especialmente as limitações das abordagens baseadas em SDF (campos de distância)
- Ao enviar diretamente para a GPU os glifos (caracteres) em forma de curvas vetoriais e executar a rasterização em tempo real, alcança resolução ilimitada e baixo uso de memória
- Utiliza técnicas de atlas de textura e acumulação temporal para obter alta qualidade de anti-aliasing e cache eficiente
- Pode ser adaptado a diversas estruturas de subpixel (por exemplo, OLED, LCD etc.), oferecendo resultados suaves e nítidos sem problemas de fringing (vazamento de cor)
- Apresenta uma abordagem simples e altamente escalável para renderização de fontes de alta qualidade em texto em tempo real, UI e jogos
Introdução: os desafios da renderização de texto
- Na renderização de texto em tempo real, existem vários problemas, como aliasing (efeito serrilhado), texturas grandes, tempo de build, zoom e movimentação suave
- A abordagem Multi-Channel Signed Distance Fields (SDFs), muito usada até hoje, tinha limitações em termos de qualidade e flexibilidade
- Mais recentemente, o surgimento de estruturas de subpixel não padronizadas em monitores OLED e os problemas de fringing levaram ao desenvolvimento de uma nova abordagem que também considera anti-aliasing por subpixel
Limitações da abordagem SDF tradicional
Qualidade
- No caso do SDF, fontes com muitos detalhes finos ou traços estreitos sofrem com perda de qualidade e de informação
- Sem aumentar a resolução, alguns glifos ainda apresentam artefatos
Tamanho do atlas
- O SDF é gerado offline e depois armazenado em um atlas, mas isso pode ficar impraticavelmente grande em fontes com muitos glifos ou fontes CJK (chinês, japonês e coreano)
- Ao usar várias fontes ao mesmo tempo, o consumo de memória e a carga de banda de streaming aumentam bastante
Flexibilidade e simplicidade
- Como existe a etapa intermediária do SDF, o fluxo completo entre os dados de origem e o resultado final fica mais complexo
- Há grandes limitações para usar ou editar diretamente imagens vetoriais em tempo real ou dinâmicas
Nova abordagem: rasterização em tempo real de curvas vetoriais
- Em vez de gerar texturas antecipadamente, envia diretamente à GPU os dados de curvas vetoriais dos glifos realmente visíveis na tela (como curvas de Bézier) e faz a rasterização ali mesmo
- Insere no atlas de textura apenas os glifos necessários, mantendo-os ou liberando-os conforme a frequência de uso
- Enquanto o glifo permanece na tela, implementa um resultado muito suave e de altíssima qualidade (anti-aliased) por meio da acumulação temporal de amostras
- Como tudo é sempre processado de forma vetorial, o resultado permanece nítido sem limitação de resolução
Processamento dos dados de curvas da fonte
- Usa bibliotecas open source como o FreeType para ler vários formatos de fonte e extrair as informações de curvas dos glifos
- Os glifos são analisados como linhas e curvas de Bézier quadráticas/cúbicas, e todas as curvas são convertidas para Bézier quadrática para simplificar o processamento no shader da GPU
- Linhas são convertidas em curvas quadráticas com a adição de um ponto de controle intermediário
- Curvas cúbicas são convertidas em duas curvas quadráticas segmentadas
Cálculo de cobertura (preenchimento dentro do pixel)
- Para cada pixel, calcula-se a interseção entre um raio horizontal e as curvas, usando o winding number (número acumulado de interseções) para determinar interior e exterior
- Centenas de amostras (n amostras acumuladas) são somadas, e pequenos erros finos quase não afetam o resultado final
- Com uma técnica de posicionamento de pontos de amostragem (sequência quasialeatória), os resultados são acumulados em posições diferentes a cada frame
Otimização do acesso às curvas
- O glifo é dividido em bandas horizontais (bands), e em cada banda são testadas apenas as curvas relevantes, reduzindo o volume de cálculo
- Distribuição de threads e iteração por bandas maximizam a eficiência de processamento em lote na GPU
Empacotamento e gerenciamento do atlas
- Cada imagem de glifo é alocada e gerenciada dentro do atlas (textura compartilhada)
- Glifos ausentes recebem novo espaço e são rasterizados; glifos já presentes são reutilizados
- Vale notar que até o mesmo glifo pode exigir versões diferentes conforme a posição de subpixel e o tamanho
- Com Z-Order Packing (Morton code etc.), implementa empacotamento eficiente entre um bitmap unidimensional e um espaço 2D
- Pode ser aplicado com flexibilidade conforme a estrutura da língua, como orientação vertical para alfabetos latinos e horizontal para sistemas como o árabe
- Quando um glifo deixa de ser necessário, o espaço do atlas pode ser realocado
Acumulação temporal (Temporal Accumulation)
- Por meio do cache de glifos e da acumulação de amostras, obtém rapidamente amostras de alta qualidade logo após a exibição, refinando depois nos frames seguintes
- No primeiro frame, 8 amostras por pixel; depois, o número de amostras vai diminuindo, com acúmulo máximo de 512 vezes
- Concilia exibição suave dos glifos com otimização de recursos
Anti-aliasing por subpixel e prevenção de fringing
- Distribui a área de renderização em unidades de subpixel (tratando cada elemento, como RGB, como uma amostra) para obter um efeito de aumento de resolução horizontal
- Compatível com estrutura padrão de LCD, além de vários arranjos como OLED/WOLED
- Permite definir um efeito suave sem fringing (vazamento de cor)
- Quando as amostras de subpixel são organizadas com sobreposição (overlapping), também reflete o efeito real de mistura de luz do monitor
- É possível obter saída natural e nítida mesmo sem bordas alinhadas ao pixel ou hinting
A importância de abordar a estrutura de subpixel por tipo de display
- Se for possível identificar programaticamente as informações sobre o arranjo de subpixels do monitor, torna-se viável uma renderização muito mais precisa
- Reforça-se que isso não é uma limitação do hardware, mas sim uma questão de processamento em software
Encerramento e perspectivas de uso
- Uma boa renderização de texto tem grande impacto na usabilidade geral e na qualidade do serviço
- Especialmente em UI e jogos, a representação de fontes de alta qualidade pode fazer grande diferença na experiência do produto
- Trata-se de uma estrutura de trabalho que realiza os princípios de simplicidade, escalabilidade, alta qualidade e flexibilidade
- Uma implementação open source e o suporte a diversos tipos de subpixel tornam essa abordagem muito adequada para uso real na indústria e em produção
1 comentários
Comentários do Hacker News