Flexível e preciso: Filtros
Use um filtro texel na textura no lado da CPU ou se estiver usando o pipeline programável OpenGL, diretamente no shader de fragmento.
A idéia de um filtro é simplesmente que você execute um loop 2D para processar cada texel. Se for branco, você percorrerá um loop 2D interno para cada um dos pixels adjacentes em algum raio e se adaptará em conformidade. Isso também é conhecido como filtro de caixa, embora, se você incluir a verificação do raio, é realmente um filtro circular - que evita artefatos de todos os eixos.
Uma maneira mais rápida de fazer isso é pré-calcular o conjunto de compensações de cada pixel central que você verifica; Dessa forma, você não precisa executar uma raiz quadrada para cada pixel ao redor de um determinado pixel. Você deseja manter a complexidade baixa em `O (texWidth * texHeight) em vez de O (texWidth * texHeight * filterRadius * filterRadius), em outras palavras.
Fácil: várias renderizações
Outra maneira de obter o efeito seria não redimensionar o texto, mas renderizar o contorno vermelho em cada uma das oito (ou mais) direções, cada uma ligeiramente deslocada do original nessa direção:
\|/
--+--
/|\
Ao compensar cada uma das versões vermelhas como essa, você obteria uma borda externa razoavelmente uniforme em torno do texto original. Lembre-se de que, ao deslocar na diagonal, você deve usar a mesma magnitude de vetor que quando desloca horizontal ou verticalmente, em vez de simplesmente compensar pelos mesmos valores x e y (o que leva a um comprimento aproximado de 1,4x - trigonometria básica).
Para sua informação
Esse tipo de efeito é conhecido como dilatação e, às vezes, é realizado via Minkowski Summation , que é a abordagem baseada em vetor (contínua) do filtro de caixa (quantizado) baseado em pixel que descrevi acima.