В прошлой статье мы говорили про то, как обычная картинка становится текстурой или картой. Ссылка на ту статью будет в конце этой статьи. А сейчас мы поговорим о том, какие виды этих карт существуют. Готовьте чашку пельменей и настраивайтесь на прочтение статьи. С вами на связи разработчик игр с восьмилетним стажем и сегодня мы с вами разберёмся как можно обмануть глаз игрока и при это сэкономить FPS.
Карта дефуз
Начнём с самой простой карты. Картой defuse называют самую простую текстуру. Вернёмся к нашей текстуре из самой первой статьи.
Это та самая пиксельная текстура кирпича. Давайте нанесём её на куб и посмотрим что выдаст нам игровой движок.
Как и следовало ожидать - мы получили куб с плоскими текстурами похожими скорее на рисунок, чем на реальный кирпич.
Карта отражений
Теперь давайте вспомним что мы с вами узнали из прошлой статьи. Видеокарта переводит обычную картинку в последовательность чисел от 0 до 255. Теперь давайте договоримся что "255" это "Да", а "0" это "Нет". Тогда значения от 1 до 254 будут означать "возможно" с разной интенсивностью. Именно так и сделали разработчики игр.
Итак, давайте давайте создадим текстуру где у нас будет Чёрный цвет означать - "нет" и будет равен для пк "0", белый цвет, равный 255 будет означать - "да" и серый цвет будет равен 128 и будет означать 50% интенсивности. Фон будет чёрный. В районе центрально кирпича будет белый цвет. А в районе верхних кирпичей будет две серых области. Получаем такую картинку:
Что нам это даёт? Теперь видеокарта рендеря эту картинку будет спрашивать "должна ли эта поверхность быть зеркальной?". Если пиксель будет чёрным будет получен ответ "Нет". Если пиксель будет белым - "Да". Если серым - то "Да, с интенсивностью (128 от 256 = 50%). Итоговый результат будет таковым: чёрная область не будет отражать ничего, серая будет иметь небольшие отражение, а белая часть будет зеркальной:
Карта высот
А теперь самая сложная часть для понимания. Играя в игры вы часто видите множество деталей на объектах. Всяких трещин, впадин, шероховатости в игре может быть так много, что порой удивляешься "как твой ПК смог потянуть такое количество деталей?". Но зачастую все эти "хорошо детализированные" объекты плоские и гладкие. Но как же так?
Давайте абстрагируемся и представим жизнь одного маленького фотона света. Представьте как он выходит из лампочки и летит прямо пока не столкнется с твёрдой поверхностью, освятив её. В тот же момент поверхность, которая была заслонена, получает тень и стаёт практически чёрной.
Таким образом мы создали тень на объёмной фигуре. Однако было бы проще для вычисления делать не объёмный рельеф, а просто записать в текстуру где поверхность выше, а где ниже, не тратя на это полигоны. Но как?
Как мы уже читали выше, картинку можно превратить в карту. Давайте договоримся что белый (код в таблице 255) цвет будет равен высоте 255 (неважно чего, метров, сантиметров или миллиметров, это мы уже выставим в самом движке), а чёрный (код в таблице 0) будет равен высоте 0. Тогда все остальные цвета будут иметь высоту согласно их числовому значению. Тогда мы можем сделать нечто такое:
Каждой возвышенности мы присвоили белый цвет, а впадине - чёрный. Промежуточные высоты мы обозначили оттенками серого.
Таким образом мы создали рельеф на ровной поверхности используя всего лишь одну картинку.
Важное замечание, что на сегодняшний момент для normal map (именно так называется карта высот) используют более продвинутую цветовую схему с белым, чёрным, зелёным и фиолетовыми цветами, но сути это не меняет. Итак, давайте превратим в такую карту наши пиксельные кирпичи:
Теперь наложим их в виде карты высот на наш куб в движке и посмотрим на результат:
Мы получили уже не плоскую картинку, а каждый кирпич немного выпирает и создаёт иллюзию что этот куб не гладкий.
А теперь как и обещал, вот вам ссылки на статьи про "Рендеринг текстур" и "Рендеринг объёмных моделей в играх".