Визуализация независимого от разрешения текста


11

Мне нужен способ рисовать независимый от разрешения текст в моей игре. То есть мне нужно иметь возможность увеличивать текст и никогда не видеть пиксельные артефакты.

Может кто-нибудь сделать какие-либо предложения о том, как я мог бы пойти по этому поводу?


Я бы предположил, что вам нужно изучить методы векторных шрифтов, а не растеризованных шрифтов, которые могли бы стать отправной точкой. Я не эксперт в этом вопросе, поэтому я позволю ответить тому, кто знает.
Рэй Дей

Ответы:


7

Есть три распространенных способа сделать это. Дело не в полном устранении артефактов - что невозможно, если у вас нет неограниченной памяти или процессорного времени - а скорее в том, чтобы минимизировать их таким образом, чтобы они соответствовали вашему существующему коду и целевым платформам.

Во-первых, просто используйте растеризатор шрифта - обычно FreeType - чтобы растеризовать шрифт до нужного размера при увеличении. Это будет отлично смотреться на скриншотах, но невероятно медленно. Вы можете решить проблему медлительности путем кэширования размеров, но тогда она становится невероятно требовательной к памяти. Он также не очень хорошо выглядит в движении, потому что для того, чтобы глифы выглядели хорошо при статическом отображении, требуется их неравномерное масштабирование. Тем не менее, это вариант, если вы находитесь на платформе с достаточным объемом памяти (например, ПК), и ваши весы ограничены небольшим диапазоном, например, от 10 до 30 пикселей. Этот метод также не допускает большого количества конфет.

Во-вторых, вы можете хранить свой текст в виде сетки. Для этого существуют некоторые библиотеки, например GLTT , или вы можете написать свою. Теперь у вас больше нет пиксельных артефактов, но у вас будут полигональные артефакты, если вы приблизитесь очень близко - как и любая другая сетка в 3D-игре. Текст сетки допускает много приятных глаз, поскольку можно применять вершинные шейдеры, а сетку можно чередовать с любым другим рисунком мира, который вы делаете. Он достаточно легкий для памяти и процессора, и его легко измерить, так как это просто стандартная сетка. Может быть трудно интегрироваться в обычный конвейер 2D рендеринга на основе спрайтов.

В-третьих, вы можете использовать поля расстояния в сочетании с пиксельным шейдером . Это относительно новая техника, которая в настоящее время популярна: использование простого шейдера для выборки готовой текстуры и «бесплатная» билинейная фильтрация на вашей видеокарте для точного масштабирования глифов. Он использует мало и легко предсказуемой памяти по сравнению с другими методами - от 0,5 МБ до 1 МБ текстуры на набор символов на шрифт. Он хорошо вписывается в конвейеры рендеринга на основе спрайтов, потому что он основан на спрайтах; каждый глиф - все еще текстурированный квад Он производит пиксельные артефакты, но очень мало по сравнению с другими методами, которые масштабируют текстуры. Существует также откат с фиксированной функцией, если пиксельные шейдеры недоступны, но текст заканчивается очень псевдонимом. Поскольку сэмплирование выполняется в пиксельном шейдере, оно допускает некоторую конфету, как выделение и затенение, по дешевке.


3

Существует также исследовательская статья от Microsoft Research от Loop и Blinn, посвященная отображению кривых, независимых от разрешения, с использованием шейдеров. Он предлагает использовать представленную технику для визуализации текста TrueType независимо от разрешения.


1

Вам нужно будет создать символы шрифта из комбинации кривых и линий, которые вы затем преобразуете в геометрию с подходящим уровнем детализации во время выполнения.

К счастью, большинство шрифтов уже построены из кривых Безье. Чтобы получить данные кривой, вам просто нужно использовать стандартную функцию Windows GetGlyphOutline () для их извлечения.

Я не уверен, что вы можете получить эти данные кривой из C # без PInvoke.


1
Чтобы сделать это кроссплатформенным и не беспокоиться о вещах PInvoke, мне кажется, что вы сможете написать инструмент для сброса данных, которые считывает GetGlyphOutline (см. Этот вопрос SO ), в некоторый пользовательский формат, а затем иметь несколько простых файловых операций ввода-вывода в игровом коде, чтобы просто загрузить ваши собственные сохраненные данные глифов.
Ricket

0

Возможно, вы захотите взглянуть на freetype. Я понятия не имею, доступна ли она на вашей платформе или применима ли лицензия, но это довольно хорошая библиотека с открытым исходным кодом для рендеринга шрифтов true-type и других векторных шрифтов. Я считаю, что они должны были сделать какой-нибудь умный код уклонения адвоката, чтобы заставить шрифты отображаться эстетически приятным способом. Способ истинного типа включает в себя байтовые коды на кривых для предоставления подсказок для средства визуализации, чтобы важные функции шрифта (такие как вертикальные и засечки) не были размыты, как при использовании стандартного наивного сглаживания. У этой техники есть патент на нее, так что люди, занимающиеся свободной формой, должны были придумать что-то еще, что сделало бы работу и не вызвало ужасного зверя-адвоката (я думаю) Apple. Во всяком случае, pogramming правовой стороны в стороне, поищите в FreeTypehttp://freetype.sourceforge.net/index2.html

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.