Оптимизация шерсти.
Всем привет. Причиной написания данного блога послужило обычное теоретическое рассуждение на тему оптимизации шерсти у недавно загруженного кота для слабых систем (как у меня). Да и в целом оптимизации любой зверушки, игрушки, кактуса или любого другого предмета, имеющего модификатор шерсти или скаттера, и проработку со всех сторон. Из всех доступных и простых способов могу показать только этот. Извиняюсь, если похожий прием уже где-то был, но в сети я не нашел.
Также, наверное, имеет смысл сказать, что этот способ рассматривался не как попытка сокращения времени рендера и т.п., а вообще, как сама возможность использования тяжелых моделей, с максимальным сохранением качества…
Для примера взял обычную сферу с модификатором «Hair and Fur».
Допустим, у нас уже есть нарисованная карта для уточнения плотности волос «Density», в моем случае это будет стандартная шахматная карта «Checker». Помещаю в нужный слот, результат на картинке. Далее собственно сам метод.
1-2. Добавляем нашу текстуру в карту «Falloff» в «Map 1».
3. Меняем местами каналы, текстура сверху, черный цвет снизу.
4. Ставим «Falloff Type» -> Towards/Away, «Falloff Direction» -> Object.
5. Выбираем как объект нашу камеру.
6. Добавляем две дополнительные точки и настраиваем график примерно таким образом.
7. Помещаем нашу новую карту «Falloff» в слот «Density» как Instance.
«Falloff Direction» можно оставить и стандартный «Viewing Direction», тогда маска будет работать из любой камеры и перспективы, просто так нагляднее настройка. «Towards/Away» означает, что ближняя часть модели к камере будет белая, самая дальняя – черная. Черный цвет блокирует, белый (в котором текстура) – работает. Резкий график делает эту границу четкой. Так и происходит маскирование. Стоит ли говорить, что если камера отвернута от объекта, шерсть никуда не пропадет полностью, её модификатор нужно будет выключить вручную? Вот и сказал.
(GIF) Теперь можно увидеть, как при вращении камеры вокруг сферы задняя часть шерсти, невидимая для объекта (камеры), скрывается.
(GIF) Тут можно посмотреть, как график влияет на саму маску. Ровный график – размытые границы, резкий – четкие границы. Левее – меньше видно, правее – больше.
Эта часть просто демонстрация немного усложненного вида. Допустим, вместо простого исчезновения, может подгружаться другая карта и т.п.
1. Добавляем нашу прежнюю карту «Falloff» в карту «Composite» в первый слой.
2. В карте «Composite» добавляем второй слой.
3. Ставим ему тип наложения «Multiply».
4. Создаем новую (или копируем старую) карту «Falloff», и подключаем ко второму слою.
5. Настраиваем. Черный сверху, белый снизу. Ставим «Falloff Type» -> Distance Blend, «Falloff Direction» -> Object.
6. Как объект оставляем все ту же камеру.
7. Выставляем параметры ближней и дальней дистанции от 50 до 300 мм.
8. Редактируем график.
9. Или такой, это график для более равномерного уменьшения плотности.
10. Помещаем получившуюся карту «Composite» в слот «Density» как Instance.
Кстати, во вьюпорте не хотел отображаться результат, пока я не выбрал карту «Composite» в самом редакторе материалов двойным кликом.
(GIF) Теперь при отдалении камеры уменьшается и общая плотность шерсти. Но регулировать её все же лучше вручную в самих модификаторах, а не таким способом.
А вот и пример по замене карт.
1. Самая первая карта «Falloff» для вращения, но уже чистая без текстур.
2-3. Вторая наша карта «Falloff» с дистанцией от 50 до 300 мм. В неё подгружаем старую шахматную текстуру во второй (белый) канал, и новую текстуру, более крупную в первый (черный) канал.
4. Создаем новый, третий, слой в карте «Composite», тип наложения тоже «Multiply».
5. Третья карта «Falloff» для исчезновения, подключаем к третьему слою. Она идентична второй, только настройки дистанции уже от 200 до 500 мм и без текстур.
(GIF) Вот что получается. До 50 работает только первая текстура, 50-300 вторая, и 200-500 третья. Этот способ можно комбинировать, например, с размером волосков или размером травы, в зависимости от задачи. Меньше плотность - больше размер, и наоборот.
(GIF) Пояснение простой настройки:
1. В «Surface scattering» подгружается основная карта «Composite».
2. В «Scale» подгружается дополнительная карта «Falloff» с такими настройками.
Опять же, это больше демонстрация, в большинстве задач проще настраивать вручную или анимировать по кадрам положение камер и плотности объектов…
Ладно, дальше сами тесты.
Рендер по 100 пассов, разрешение 800x800. В настройках шерсти было выставлено 200 тысяч волосков, каждый из которых множился на 10, и имея по 12 сегментов. Итого:
1. Стандартный подход, без оптимизации.
Primitives: 2.000.960 |Scene parsing: 0:01:13 |Geometry: 0:01:34 |Общее время: 0:32:57
2. Средняя оптимизация.
Primitives: 944.427 | Scene parsing: 0:00:36 | Geometry: 0:00:25 | Общее время: 0:14:46
3. Максимальная, так как можно уже заметить явные потери по краям.
Primitives: 499.726 | Scene parsing: 0:00:23 | Geometry: 0:00:10 | Общее время: 0:13:00
4. Ради шутки.
Primitives: 121.169 | Scene parsing: 0:00:13 | Geometry: 0:00:03 | Общее время: 0:08:40
Ну и, наверное, сама суть:
Попытка отрендерить сразу две сферы по 10 пассов.
1.Стандартный подход, без оптимизации.
Первая попытка рендера – вылет на 40-х минутах, вторая – очень долгая загрузка «Geometry», шла уже за час, пришлось просто выключить. Рендер так и не начался.
2. Средняя оптимизация.
Рендер начался примерно через две с половиной минуты.
Попытался осилить и кота. Если что, за котика извиняюсь : ) В любом случае можете полюбоваться на оригинал: https://3ddd.ru/3dmodels/show/cat_4_1
(GIF) Суть настроек как в начале урока. Настраиваем «Falloff», только вместо «Checker», конечно, помещаем карту из архива «CAT 4_Density-texture» в «Map 1».
Тут нужно сказать, что результаты получались разными, но последний вариант теста с белым котом получился таким:
Рендер по 60 пассов, разрешение 800x800. В настройках шерсти только увеличил с 2 до 2,5 миллионов волосков. Материал шерсти короновский, почти стандартный. Итого:
1. Стандартный подход, без оптимизации.
Primitives: 1.362.441 |Scene parsing:0:07:37 |Geometry: 0:00:13 |Общее время: 0:57:20
2. Средняя оптимизация.
Primitives: 849.151 | Scene parsing: 0:07:20 | Geometry: 0:00:06 | Общее время: 0:55:33
3. Максимальная, так как можно уже заметить явные потери.
Primitives: 573.853 | Scene parsing: 0:07:04 | Geometry: 0:00:04 | Общее время: 0:49:36
Тут вышла другая разница, но лично у меня со стандартным подходом выкидывало из программы чаще :)
Ну и разница двух моделей сразу, рендер 20 пассов:
1. Стандартный подход, без оптимизации. (Третьего котика уже не потянет XD )
Primitives: 2.724.880 | Scene parsing: 0:15:20 | Geometry: 0:01:10 | Общее время: 0:35:05
2. Средняя оптимизация. (Потянет)
Primitives: 1.536.119 | Scene parsing: 0:14:42 | Geometry: 0:00:16 | Общее время: 0:30:22
Конечно, на таких сложных моделях при одном графике с разных ракурсов модель может оптимизироваться по-разному. Если смотреть спереди на кота, то будет оптимизирован только небольшой задний участок, и немного лапы, а если смотреть сбоку, то оптимизируется половина.
Из недостатков, можно заметить голый задок в зеркале.
Из плюсов, оптимизация в некоторых местах может быть выше 50%.
Тестировалось на i5 3.10 GHz, 8гб памяти + 16 подкачка с жесткого.
Спасибо всем, кто дочитал. Может кому-то когда-то пригодится.
Отдельное спасибо MastaMan за помощь в настройке gif анимации :)
P. S. Напомню еще раз, что «Falloff Direction» можно оставить стандартный «Viewing Direction», тогда маска будет работать из любой камеры/перспективы, это удобно и не возникнет проблем с Batch render:
Комментарии (44)
Y.O.U.
3Delli
nanaktaev
breezeshaman
Dima110
breezeshaman
Dima110
freezemaximus
Nataniella
breezeshaman
freezemaximus
Dima110
Yehat
Dima110
Uraken
banderas2780
3d-andrew
Nataniella
tokin
amfk
andy@
DDDen
alexfmos
Zom6ie
sorter
ProPainterX
paz
RadionovAS1
Pasha06062007
booka80
asmodeus88
CG/ARTEMY
Drantya
Dima110
Drantya
Hokmunigr
bysochi
MastaMan
GreatWhiteShark
voin
tameplan
Gabrielle
c3dm
Юра_И.