Надання роздільної здатності незалежного тексту


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 (див. Це питання ТА ) у якийсь спеціальний формат, а потім мати кілька простих вводу-виводу файлів у ігровому коді, щоб просто завантажити власні збережені дані глифів.
Ricket

0

Можливо, ви захочете поглянути на фрітейп. Я не маю уявлення, чи вона доступна на вашій платформі чи чи застосовується ліцензія, але це досить відмінна бібліотека відкритого коду для візуалізації справжнього типу та інших векторних шрифтів. Я вважаю, що їм довелося зробити якийсь розумний відступник коду, щоб отримати шрифти для естетичного відображення. Справжній тип способу включає в себе байтові коди на кривих, щоб надати підказки рендерінгу, щоб важливі функції шрифту (наприклад, вертикалі та серіфи) не розмивалися, як це було б за допомогою стандартного наївного антизшивання. Ця техніка має патент на неї, тому людям вільного типу потрібно було придумати щось інше, що зробило цю роботу і не попросило жахливого юриста-звіра (я думаю) Apple. У будь-якому разі, програмуючи юридичну сторону, спробуйте заглянути у вільну формуhttp://freetype.sourceforge.net/index2.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.