Pull to refresh

Comments 18

Очень полезная статья!
Выяснилось, что при рендере освещения в Unity возле объектов, имеющих дыры, то есть удалённые полигоны, появляются жесткие, хорошо заметные артефакты.

В Юнити 5 появилась возможность указывать двух сторонние тени для мешей. Не пробовали использовать для устранения проникновения теней сквозь односторонние поверхности?
Неплохая идея, спасибо, я попробую.

Вот покопался по левелам, нашёл пример этой проблемы. Как видите, в середине тени какой-то невнятный треугольник. Можно было сказать, что там где-то через меш проходят лучи света, но так треугольник другого цвета! Причём если я эти объекты с отсутствующими полигонами убираю и перезапекаю освещение — всё становится нормальным. Видимо, ситуации как эта сводят Enlighten с ума при попытке посчитать отражённый свет.

Под спойлером скриншот.

Скрытый текст
image

В целом так и есть. И хотя это лишние полигоны — двухсторонний материал по качеству освещения не равняется двустороннему мешу. Однако такие баги еще со времён Unity4. И что то мне кажется что к Enlighten это малое отношение имеет. Я и сейчас постоянно сталкиваюсь. Замкнутый меш, окей… даже сверху добавил специальный меш который смотрит нормалью на солнце (Внешняя часть стены отдельным мешом) — что б можно было его легко скрыть и работать с внутренностью. Но тем не менее не смотря на цельный меш — в местах Hard Edge проскакивают белые полосы света. Очевидно что это уже будет давать глюки при запекании.
Очень часто помогает один фокус — не давать мешам пересекатся. Желательно вообще везде)
А как делается освещение в играх со сменой времени суток? Я так понимаю, запекание в этом случае не подходит? В современных играх, например в Far Cry или том же The Forest, освещение довольно красиво и реалистично, как этого добиваются без запекания?
Я занимаюсь в основном мобилками, поэтому не приходилось тестировать производительность разных методов освещения под ПК и консоли. Тем не менее, могу предположить, что там сейчас делается полностью реалтаймовый свет.

Само по себе реалтаймовое освещение выглядит очень сухо, топорно и ненатурально. Поэтому добавляются различные фишечки типа атмосферного рассеяния, вольюмов цветокоррекции (грубо говоря, пока вы идёте по солнечной равнине, у вас на экране всё с жёлтым оттенком, а когда вы спускаетесь в тень в низину — цветокоррекция окрашивает всё в зеленоватый цвет) и прочего.
Amplify Motion и Color (LUT Color correction), AFS и другие прочие ассеты из ассет стора. Но на сколько я знаю в Forest юзают самую обычную динамику без GI. Просто ребята с хорошим вкусом, приправили все это сдобно сбалансированными фильтрами и туманом. Их работа еще раз подтверждает что графика зависит от не движка, а от прямых рук :)
В Юнити 5 тени очень экономные, так как их качество режется на расстоянии. По крайней мере я почти перестал замечать разницу между 500м и можно поставить хоть 2500м. Однако, если вы знаете, тени которые рендерятся кубемапой имеют ограниченное качество, что означает что чем меньше дистанция теней, тем лучше качество. Тени на 2500м мягко говоря… мммм… вещество коричневатого цвета))) В Unreal Engine с этим справились лучше. Они внедрили Distance Field по которому работает и АО статическое и другие интересные фишки — как Raytrace Shadows. Вот и простая комбинация — в близи на динамику рисуем обычные тени. В дали на статику Raytrace shadows.
Динамические тени, тонирование (общая подсветка, имитирующая свет неба) + АО-шка творят чудеса.
Огромное человеческое спасибо за столь подробную статью на актуальную для меня тему.
Самое замечательное для меня то, что вы не просто излагаете материал, но и приводите собственные значения, от которых можно оттолкнуться. Экспериментальным путем, естественно, можно было бы подобрать и самостоятельно, но на это пришлось бы потратить в разы больше времени.
Поэтому, еще раз спасибо! Однозначно в закладки.
Хорошая статья. Но у лайтмаппинга есть и обратная сторона медали. Полученные текстуры после выпекания прибавят весу конечному файлу APK (если речь идёт о мобильной игре). Для больших сцен размер карт лайтмапов может быть существенный. В идеале запекать все в 3D редакторе, сразу текстуры вместе с GI, АО и всеми тенями, к примеру спомощью Vray. Правда такой способ тоже не для всего подойдёт.
Запекание во внешнем редакторе увеличит количество текстур во много раз так, что вес лайтмапа покажется сказкой :) Грубо говоря, если у вас уровень собран из 100 копий одной стены, имеющей размер текстуры 512х512, то вы можете отделаться одним лайтмапом 1024х1024 на весь уровень. Если вы будете запекать свет прямо в текстуры во внешнем редакторе, то у вас будет 100 уникальных текстур каждая размером 512х512.
Ну, не совсем так. Можно собрать атлас 2048х2048 в 3D редакторе (к примеру с помощью Flatiron) на все 100 стен со всеми текстурами, светом, тенями, GI и т.д. Получится 1 текстура на все. Лайтмаппинг юнити сделат тоже самое. Соберет эти 100 стен и запихнет тени в один атлас с той лишь разницей, что дифузные карты тронуты не будут.
Только при этом объекты окажутся страшно размытыми, ведь на каждую из 100 стен в этом 2048 атласе будет выделено 20х20 пикселей. Лайтмап же позволяет сохранить качество текстур просто накладывая поверх них информацию об освещении.
Согласен, на больших сценах выпекать 3D редактором не самая лучшая идея. Но конечный результат все же лучше при выпекании через 3D редактор с использование внешнего рендера. В Unity результат не предсказуемый и частенько глючит.
А как во внешнем редакторе запечь свет со спекуляром? Везде, где я видел — запекается прям в дифуз, но потом по такому объекту не бегают блики.

В юнити же Directional-Specular режим позволяет и свет запечь и блики получить более-менее адекватные
По идее спекуляр в первую очередь зависит от шейдера. Если простой лайтмап положить на объект с шейдером, имеющим спекуляр и, опционально, спекуляр мапу, то он и будет блестеть.
Но он будет блестеть от света, блеск не будет запечен, так?
Правильно написали. Блики это свойство шейдера. Более того в редакторе нельзя запечь блики (только свет и все что с ним связано). Но можно запечь в редакторе карты типа Glossiness и положить в unity на Specular.
Простите, в терминологии не силен, но, Specular — это что-то вроде силы отражения, как и Metallness в базовом шейдере. Это само собой.

Тем не менее важен не только свет (который элементарно запекается в дифуз), но и то, какое направление этого света, откуда этот свет пришел, чтобы при правильном угле отобразить блик.

Ну чтобы получилось вроде такого (гифка):
image



Вот если просто запечь свет в дифуз, то он более-менее равномерно ляжет по поверхностям и никакого блика не будет. Unity позволяет запечь в отдельных картах не только свет, но и направления и будут что запеченный свет, что более-менее корректные блики.
Sign up to leave a comment.

Articles