Я использую библиотеку FTGL для рендеринга шрифтов в своей игре, но я совершенно не знаю, как создать контур вокруг текста. Достижение тени может быть легко, потому что я могу просто сделать это так:
(псевдокод)
font.render(Color::BLACK, position.x + 1, position.y + 1); // Shadow
font.render(Color::WHITE, position.x, position.y) // Normal text
Но как создать схему? К сожалению, я не нашел каких-либо интересных решений для этого через Интернет, что показалось мне немного странным, потому что я думал, что это довольно популярная проблема.
Рисовать контур просто крупным шрифтом - это неправильный путь, потому что, как я выяснил, буквы в этом случае просто не совпадают:
Так есть ли простой способ создать схему для шрифтов? Как они это делают в реальных играх?
Заранее спасибо за любой ответ
Ответы:
Гибкость и точность: фильтры
Используйте фильтр texel либо на текстуре на стороне процессора, либо, если вы используете программируемый конвейер OpenGL, прямо в фрагментном шейдере.
Идея фильтра заключается в том, что вы просто проходите двухмерный цикл для обработки каждого текселя. Если он белый, то вы проходите внутренний двухмерный цикл для каждого из окружающих его пикселей в некотором радиусе и соответственно адаптируетесь. Это также известно как блочный фильтр, хотя, если вы включите проверку радиуса, это действительно круговой фильтр, который избегает осевых артефактов.
Более быстрый способ сделать это - предварительно рассчитать набор смещений для каждого центрального пикселя, который вы проверяете; таким образом, вам не нужно запускать квадратный корень для каждого пикселя, окружающего данный пиксель. Другими словами, вы хотите уменьшить сложность до `O (texWidth * texHeight), а не O (texWidth * texHeight * filterRadius * filterRadius).
Легко: несколько рендеров
Другим способом достижения эффекта будет не масштабирование текста, а визуализация красного контура в каждом из восьми (или более) направлений, каждое из которых слегка смещено относительно оригинала в этом направлении:
Смещая каждую из красных версий, как это, вы получите довольно однородный внешний край вокруг исходного текста. Имейте в виду, что при смещении по диагонали вы должны использовать ту же величину вектора, что и при смещении по горизонтали или вертикали, а не просто смещаться на те же значения x и y (что приводит к приблизительно в 1,4 раза большей длине - основной триггер).
FYI
Этот вид эффекта известен как дилатация и иногда выполняется с помощью суммирования Минковского , который является векторным (непрерывным) подходом к пиксельному (квантованному) блочному фильтру I, описанному выше.
источник
Эта функция реализована непосредственно в FTGL, но доступна только в
ExtrudeFont
классе. Вы просто определяете начало для шрифта:Затем вы можете использовать разные цвета для двух режимов рендеринга:
Вот результат с включенным сглаживанием:
источник
Не имеет отношения к FTGL, но есть отличная статья от Valve о рендеринге глифов. Он обеспечивает высокое качество рендеринга с небольшими требованиями к памяти, и такие эффекты, как контуры или тени, могут быть просто реализованы.
источник