Как с помощью Vertex Color в десятки раз снизить количество текстур на мидкорном проекте

Используя Vertex Color и текстурные атласы, можно на всю игру иметь не более, например, 10-15 текстур, общий объем которых при должной компрессии составит не более 5-10 МБ. В аналогичном проекте без этого подхода размер текстур будет достигать 150 МБ. Для мидкора это особенно актуально, хотя и в гиперкэже разработчики могут столкнуться с ограничениями стора на размер билда, так что тоже будет полезно напомнить.

Иногда разработчики просто упускают момент, что экспортируемые FBX-файлы при экспорте данных из 3D-пакетов несут в себе кое-что ещё, помимо «позиции вертексов». А именно: вектора, указывающие направление нормалей; цвета вершин; текстурные координаты и веса с индексами костей.

Что нам это дает?

Это пригодится, чтобы снизить количество текстур на мидкорном проекте и снизить нагрузку на устройство, так как арт в современных мобильных играх порой близок к фотореализму в отдельных случаях. Например, на проекте Railroad Empire мы создаем модели по реальным чертежам и фотографиям, чтобы создать что-то вроде диорамы железной дороги для игроков, которые любят внимание к деталям и историческую достоверность.

Но вернемся к «хитростям». Нас будут интересовать цвета вершин (Vertex Color), и как мы можем их использовать.

Описанные ниже техники не панацея, ведь каждый проект по своей природе и требованиям уникален, но иногда Vertex Color действительно может помочь закрыть многие потребности без использования дополнительных текстур. Например, тот же Roughness или Metallic легко можно положить в один из RGB каналов Vertex Color.

Рассмотрим кейс на примере. 

Арт-запрос. Сделать, чтобы крыши/купола некоторых зданий давали блеск (Specular) и добавить блеск на окна.

Ограничения. Одна текстура на материал, один материал на массив Mesh Renderer, грейд целого здания — единый Mesh.

Скриншот из игрового движка:

А вот маска Vertex Color, зашитая в FBX-модельки:

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

struct appdata {

   float4 vertex : POSITION;

   float4 color : COLOR;

};

struct v2f {

   float4 pos : POSITION;

   float4 color : COLOR;

};

v2f vert(appdata v) {

   v2f o;

   o.pos = UnityObjectToClipPos(v.vertex);

   o.color = v.color;

   return o;

}

fixed4 frag(v2f i) : COLOR {

   return i.color;

}

Еще один пример использования Vertex Color в проектах: фейк AO

По сути Ambient Occlusion это затемнение тех или иных углов на 3D-модели. И тут нам на помощь снова приходит Vertex Color, которым мы можем «подкрасить» нужные углы любым из RGB-цветов, а затем в шейдере указать, по какому из каналов осуществлять затемнение. 

Никаких текстур AO в данной модели нет.

Мы активно используем Vertex Color в Railroad Empire и других наших моделях для имитации Specular, а также для некоторых плашек с альфа-каналом, чтобы не плодить много лишних текстур.

В итоге получается вот такой результат, который без использования описанных техник весил бы в десятки раз больше. 

Вернуться в блог