Pull to refresh

Comments 14

Обводки иногда называются extrude. Мне сейчас приходится делать библиотеку для рантайм-атласов, потому что всё готовить заранее не всегда удобно.
У нас при создании атласов (статических) препроцессинг делается самостоятельным шагом. Для динамических атласов хорошим подспорьем будут заранее подготовленные блоки. Также рекомендую решение с premultiplied alpha для несжатой графики.
Довольно редкий метод для устранения артефактов при рисовании текста (и подобных тексту изображений) в 2D: использовать матрицу проекции, основанную на наибольшем общем делителе и рисование по целочисленным координатам.
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 (даже не последних лет)?
Мне кажется это связанно с ресурсами, «потому что надо поддерживать 60 FPS». Для VR игр необходима постоянная частота кадров, постоянная нагрузка на глаза, без смены FPS.
Для VR — даже не 60, а 90 FPS. Еще и в очень высоком разрешении, чтобы пиксели в глаза не бросались
Sony симулирует 120 FPS, но игра рисует только 60 FPS. Там рисуется чуть больше картинка, чем видна, и 1/120 движения просто пересчитывает вычислительный блок.
Насколько я помню, у Sony минимум 60 FPS, но рекомендуется все же 90 FPS. Oculus и Vive так точно требуют 90 FPS.
Sign up to leave a comment.