Как неправильная битность карты нормалей может испортить текстуры
Проблемы с битностью текстур в последнее время встречаются всё чаще и чаще. Сейчас, когда большинство движков стали использовать одинаковый воркфлоу для карт нормалей, ошибки в пайплайне художников стало намного проще вычислять.
Первым делом разберемся, что такое битность и почему она важна.
От битности зависит количество оттенков, которое может быть записано в изображении. 24-битное изображение может записать 8 бит, или 256 значений в каждый канал. 256 значений обычно достаточно для текстур типа diffuse, specular или gloss map, потому что они используют более широкий спектр цветов и на них нет необходимости четко изображать слабые градиенты.
С этого момента, говоря 8, 16 или 32 бита, я буду иметь ввиду их количество в одном канале изображения.
Tangent Space Normal Map же наоборот, обычно использует более узкий диапазон значений. Ухудшается всё тем, что чем сильнее low poly модель похожа на high poly, тем больше важна битность изображения. Причина в том, что для отображения слабой разницы между двумя версиями модели (а это нужно для корректного шейдинга), нужно использовать большее количество промежуточных оттенков. В противном случае, слабый градиент не сможет корректно отображаться на текстуре и появится лесенка.
Ниже — пример этой проблемы. Low poly объект с плавным силуэтом практически идеально совпадает с high poly. Дополнительно на него назначен металлический зеркальный материал, что позволит еще более наглядно увидеть артефакты.
Если запечь 8-битную карту с помощью софта, который не использует дайзеринг (xNormal или Maya например), появится артефакт в виде лесенки там, где текстура не может записать плавные перепады поверхности из-за ограниченной битности.
Если увеличить битность до 16 и запечь нормал с помощью xNormal в TIFF расширении, результат будет намного лучше.
И так, если 16 бит выдают хороший результат, 32 должны сделать текстуру ещё лучше? В теории да, но на практике это не всегда так. Ниже — пример запеченной 32-битной карты. Как видно, визуальной разницы между 16 и 32-битными версиями нет.
Но ведь сейчас у всех стоят SDD и HDD на несколько терабайт, проблем с памятью для хранения текстур нет, почему бы просто не запекать 32-bit текстуру каждый раз, дабы избежать проблем?
Во-первых, разница между ними практически не видна. Во-вторых, с 32-битной текстурой сложнее работать в промежутке между запеканием и до финализации текстур. Некоторые инструменты в Photoshop недоступны в режиме работы с 32-bit файлами.
В третьих, конвертация 32-bit изображений в 16-ти или 8-ми битные может вызвать еще больше артефактов. В обычной ситуации, когда происходит конвертация из 32-х бит в 16 или 8, тебе нужно будет использовать фотошоповский tone mapping, и поверь, это очень плохо сказывается на карте нормалей.
А что насчет игр? 16 и 32-битные файлы не поддерживаются многими игровыми движками из-за ограничений текстурной памяти. Так что, в конце концов, всю работу с 32-битной текстурой придется ужать в 8-ми битное изображение.
Еще хуже, текстуры могут оптимизироваться движком автоматически. Такое вмешательство со стопроцентной вероятностью создаст шумы и лесенки на карте нормалей.
Да и не все объекты имеют такую сложную форму и зеркальный материал. Поэтому описанной выше проблемы, скорее всего, не будет видно в финале.
Я не упоминал 3ds Max, но если ты запекаешь 8-битный normal map в нем, то можешь вообще не беспокоиться о том, что я тут перечислил. Только если ты не собираешься запечь curvature или AO на основе карты нормалей — в таком случае лучше приготовить normal map с высокой битностью специально под запекание.
Теперь взглянем не на абстрактный пример, а на реальный рабочий ассет.
Запекание с высокой битностью помогло избавиться от артефактов, а последующая конвертация в 8-бит позволила вместить чуть больше полезной информации в меньший объем.
Для наглядности, в конце я оставил рендер меча с наложенными текстурами и 8-битной картой нормалей. Все артефакты, о которых я так волновался, пропали. Конечно, можно заметить некоторые проблемы, если знаешь, куда смотреть. В игре, глядя с адекватного расстояния на объект, игрок ничего не увидит.
И последний пример, который поможет лучше понять, что вообще происходит с картой нормалей при разных настройках запекания.
Даже после того, как я выкрутил интенсивность текстуры, 16-ти битная версия всё ещё смотрится выигрышнее 8-ми битной.
Теперь ты еще лучше понимаешь, как работают инструменты и программы, которые ты используешь каждый день, знаешь о причинах возникновения проблемы в работе и способы их решения.
В следующей статье мы разберем реальный пример, как битность карты нормалей может испортить финальные текстуры. Stay tuned.
Перевод статьи EarthQuake