Гибкость и точность: фильтры
Используйте фильтр texel либо на текстуре на стороне процессора, либо, если вы используете программируемый конвейер OpenGL, прямо в фрагментном шейдере.
Идея фильтра заключается в том, что вы просто проходите двухмерный цикл для обработки каждого текселя. Если он белый, то вы проходите внутренний двухмерный цикл для каждого из окружающих его пикселей в некотором радиусе и соответственно адаптируетесь. Это также известно как блочный фильтр, хотя, если вы включите проверку радиуса, это действительно круговой фильтр, который избегает осевых артефактов.
Более быстрый способ сделать это - предварительно рассчитать набор смещений для каждого центрального пикселя, который вы проверяете; таким образом, вам не нужно запускать квадратный корень для каждого пикселя, окружающего данный пиксель. Другими словами, вы хотите уменьшить сложность до `O (texWidth * texHeight), а не O (texWidth * texHeight * filterRadius * filterRadius).
Легко: несколько рендеров
Другим способом достижения эффекта будет не масштабирование текста, а визуализация красного контура в каждом из восьми (или более) направлений, каждое из которых слегка смещено относительно оригинала в этом направлении:
\|/
--+--
/|\
Смещая каждую из красных версий, как это, вы получите довольно однородный внешний край вокруг исходного текста. Имейте в виду, что при смещении по диагонали вы должны использовать ту же величину вектора, что и при смещении по горизонтали или вертикали, а не просто смещаться на те же значения x и y (что приводит к приблизительно в 1,4 раза большей длине - основной триггер).
FYI
Этот вид эффекта известен как дилатация и иногда выполняется с помощью суммирования Минковского , который является векторным (непрерывным) подходом к пиксельному (квантованному) блочному фильтру I, описанному выше.