Comments 14
Обводки иногда называются extrude. Мне сейчас приходится делать библиотеку для рантайм-атласов, потому что всё готовить заранее не всегда удобно.
Довольно редкий метод для устранения артефактов при рисовании текста (и подобных тексту изображений) в 2D: использовать матрицу проекции, основанную на наибольшем общем делителе и рисование по целочисленным координатам.
А ещё имеет смысл по возможности использовать векторные исходники, которые на конечном устройстве рисуются точно по нужным параметрам (не стоит забывать, что если у iOS есть только x2 и x3, то на андроиде можно встретить и x1.5, x1.25). Недостатки: необходимость преобразовать векторные исходники в растр на устройстве пользователя, и невозможность использовать сжатие текстур. Время на создание растра может компенсироваться тем. что загружать по сети оптимизированные для пользовательского устройства ресурсы всё равно выйдет медленнее. Главный недостаток — низкое поголовье векторных художников в игрострое (да и вообще).
const int32_t gcd = sp_gcd(size.width, size.height);
const int32_t dw = (int32_t)size.width / gcd;
const int32_t dh = (int32_t)size.height / gcd;
const int32_t dwh = gcd * dw * dh;
// если gcd слишком маленький, уменьшаем параметры в матрице
// иначе вычисления будут вызывать артефакты уже другого рода
float mod = 1.0f;
while (dwh * mod > 16384) {
mod /= 2.0f;
}
Mat4 proj;
proj.scale(dh * mod, dw * mod, -1.0);
// offset manually
proj.m[12] = -dwh * mod / 2.0f;
proj.m[13] = -dwh * mod / 2.0f;
proj.m[14] = dwh * mod / 2.0f - 1;
proj.m[15] = dwh * mod / 2.0f + 1;
Идея метода в том, чтобы проецировать целочисленные координаты как можно точнее к центру пикселя (который, как известно, имеет смещение (0.5, 0.5)). Работает идеально для экранов со стандартным соотношением сторон (3:4, 9:16), работает тем лучше, чем больше GCD. Позволяет экономить на антиальясинге и получать pixel-perfect шрифты в большинстве случаев.А ещё имеет смысл по возможности использовать векторные исходники, которые на конечном устройстве рисуются точно по нужным параметрам (не стоит забывать, что если у iOS есть только x2 и x3, то на андроиде можно встретить и x1.5, x1.25). Недостатки: необходимость преобразовать векторные исходники в растр на устройстве пользователя, и невозможность использовать сжатие текстур. Время на создание растра может компенсироваться тем. что загружать по сети оптимизированные для пользовательского устройства ресурсы всё равно выйдет медленнее. Главный недостаток — низкое поголовье векторных художников в игрострое (да и вообще).
Успешно применяем бесплатные векторные шрифты и библиотеку. Размер шрифта делаем такой, чтобы глиф получился ровно по физическим пикселям. Получаются четкие тексты.
Когда на сцене не слишком много надписей хорошее ускорение дает кэширование глифов: растеризация символов делается один раз, а рисование готовых символов происходит достаточно быстро в каждом кадре.
Когда на сцене не слишком много надписей хорошее ускорение дает кэширование глифов: растеризация символов делается один раз, а рисование готовых символов происходит достаточно быстро в каждом кадре.
С шрифтовыми атласами есть другая проблема: сложно анимировать размер глифов, ибо сложно вычислить все требуемые комбинации глифа и размера, и дорого перерисовывать атлас на ходу. У нас под каждую анимируемую надпись во время самой анимации используется отдельный мини-атлас, который при необходимости дополняется на ходу.
Про анимации как раз есть интересный момент: мы рассчитываем финальное положение и размер надписи (prescale) и на этих данных запускаем анимацию. Таким образом при пульсации глифы не перестраиваются.
Отличная статья, как и другие! Вопрос у меня по аутлайнам для шрифтов — насколько заметил вы используете врисованные уже в атлас с глифами, верно? Или отдельный атлас с аутлайнами и отдельный с глифами? Или все же это шэйдерные аутлайны?
На сам текст могут накладываться эффекты. По большому счету это быстрые аналоги эффектов из программ Adobe Photoshop/Flash. В движке есть опция рисовать ли эффекты отдельно (чтобы буквы читались поверх тени) или можно применять сразу для глифа. Особо сложные надписи выполнены художниками в растре. Но это уже скорее не про артефакты…
Вопрос по артефактам. Кто знает, почему все VR игры полны этих артефактов (лесенок, почти нечитаемых надписей), это как-то связано с проекцией, что в VR она не фиксирована? Или это связана с ресурсами, потому что надо поддерживать 60 FPS? Или разрешением в VR?
Какая технология должна улучшиться, чтобы VR выглядел на уровне 2D (даже не последних лет)?
Какая технология должна улучшиться, чтобы VR выглядел на уровне 2D (даже не последних лет)?
Мне кажется это связанно с ресурсами, «потому что надо поддерживать 60 FPS». Для VR игр необходима постоянная частота кадров, постоянная нагрузка на глаза, без смены FPS.
Для VR — даже не 60, а 90 FPS. Еще и в очень высоком разрешении, чтобы пиксели в глаза не бросались
Sony симулирует 120 FPS, но игра рисует только 60 FPS. Там рисуется чуть больше картинка, чем видна, и 1/120 движения просто пересчитывает вычислительный блок.
Насколько я помню, у Sony минимум 60 FPS, но рекомендуется все же 90 FPS. Oculus и Vive так точно требуют 90 FPS.
Да похоже, это выбирается разработчиком, использовать reprojection или нет Reddit Sony reprojection algorithm.
Sign up to leave a comment.
Как побороть распространенные артефакты графики