Оптимизация шерсти.

Всем привет. Причиной написания данного блога послужило обычное теоретическое рассуждение на тему оптимизации шерсти у недавно загруженного кота для слабых систем (как у меня). Да и в целом оптимизации любой зверушки, игрушки, кактуса или любого другого предмета, имеющего модификатор шерсти или скаттера, и проработку со всех сторон. Из всех доступных и простых способов могу показать только этот. Извиняюсь, если похожий прием уже где-то был, но в сети я не нашел.

Также, наверное, имеет смысл сказать, что этот способ рассматривался не как попытка сокращения времени рендера и т.п., а вообще, как сама возможность использования тяжелых моделей, с максимальным сохранением качества…

Для примера взял обычную сферу с модификатором «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» означает, что ближняя часть модели к камере будет белая, самая дальняя – черная. Черный цвет блокирует, белый (в котором текстура) – работает. Резкий график делает эту границу четкой. Так и происходит маскирование. Стоит ли говорить, что если камера отвернута от объекта, шерсть никуда не пропадет полностью, её модификатор нужно будет выключить вручную? Вот и сказал.

4a000b2776cd8ef00a3bc09ca9245ba0.gif

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

8c3f47a760c7927fa00dd463a1a50dbb.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» в самом редакторе материалов двойным кликом.

1c352eba40de9eae368fe515bf4a5458.gif

(GIF) Теперь при отдалении камеры уменьшается и общая плотность шерсти. Но регулировать её все же лучше вручную в самих модификаторах, а не таким способом.

А вот и пример по замене карт.
1. Самая первая карта «Falloff» для вращения, но уже чистая без текстур.
2-3. Вторая наша карта «Falloff» с дистанцией от 50 до 300 мм. В неё подгружаем старую шахматную текстуру во второй (белый) канал, и новую текстуру, более крупную в первый (черный) канал.
4. Создаем новый, третий, слой в карте «Composite», тип наложения тоже «Multiply».
5. Третья карта «Falloff» для исчезновения, подключаем к третьему слою. Она идентична второй, только настройки дистанции уже от 200 до 500 мм и без текстур.

105c37062b1bfa1da7e81abb87a2020e.gif

(GIF) Вот что получается. До 50 работает только первая текстура, 50-300 вторая, и 200-500 третья. Этот способ можно комбинировать, например, с размером волосков или размером травы, в зависимости от задачи. Меньше плотность - больше размер, и наоборот.

a758e7566dd3d3ce2eb9a057756bfe55.gif

(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 

c446fd78a3b2c4c99434fb7c48d89dda.gif

(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)

+109
Y.O.U.
Матерь божья, да я только за превью ставлю пятюню XD
+4
3Delli
аналогично, только про превью хотел сказать))
+5
nanaktaev
Вот это изобретательность! Люблю 3d за такие вещи.
+5
breezeshaman
А слабо на превью поменять на Алису?
0
Dima110
Кто это?) Забанят еще)
+3
breezeshaman
Нет же. Это же звезда 3дддhttps://3ddd.ru/3dmodels/show/alisa_idiet_v_dush 
+23
Dima110
XD Могу сделать только, чтобы при приближении появлялась шерсть
+11
freezemaximus
Жуткое будет зрелище)
0
Nataniella
Алиска в душе уже побрилась )) а поскольку она не живая - новая шерсть уже не нарастет )
0
breezeshaman
Комментарий удален
+1
freezemaximus
Здорово, молодец! Интересный способ, мне такое в голову не приходило. Правильно, что сделал урок, думаю, многим будет полезно.
+1
Dima110
Спасибо) буду рад, если так))
+3
Yehat
Купи новый Райзен, харэ страдать на калькуляторе.
0
Dima110
XD Пока не до этого просто
+1
Uraken
еще и кошек мучает!
+2
banderas2780
это же Чуи в молодости =) вон даже не полностью оброс!
+3
3d-andrew
Ну что вы, право слово, какой Чуи? Это же эвок)
+2
Nataniella
прикольная голая жопка у мишки )))))))))))))
+3
tokin
Очень полезный урок друг мой +5
+1
amfk
Превью топ
+1
andy@
красава, спасибо , и мои 5 копеек
+1
DDDen
Класс !
+5
alexfmos
Кстати в превью к уроку, есть совет, когда урок применять не стоит :-) А вообще здорово, что вы комбинируете разные области. Включаете воображение. Tmin, думаю это оценит.
0
Zom6ie
Топовая статья!
Спасибо!
+3
sorter
Это августовский вин.
-1
ProPainterX
В закладки однозначно. Теперь я видел всё!
+1
paz
за эвока + 5 :)
0
RadionovAS1
Это божественно!
+1
Pasha06062007
После этого урока, да кто нибуть - да придумает скрипт на эту тему)))
0
booka80
Хорошо. Но, всё таки прислушайтесь к коменту про Райзен)))
+1
asmodeus88
Отличный урок!
0
CG/ARTEMY
Шикарный урок спасибо !!!
0
Drantya
Большое спасибо автору, как то можно еще придумать, да бы, применить эффект к нескольким камерам, для того что бы рендерить батчем?
+1
Dima110
Можно все же попробовать оставить «Falloff Direction» на «Viewing Direction», это направление взгляда, тогда должно из любой камеры/перспективы работать, но я не тестировал. Как будет время нужно попробовать.
+1
Drantya
Спасибо - должно сработать!
+1
Hokmunigr
Спасибо очень полезный урок!
+1
bysochi
а так можно было? 0_о
0
MastaMan
Очень оригинально, люблю такие не стандартные уроки. Спасибо ;)
0
GreatWhiteShark
Однозначно в закладки!
0
voin
даже подумать не мог о такой оптимизации. Ну надо же без потерь такое замутить. БРАво!
+1
tameplan
Это - топ! Обязательно воспользуюсь. Большое спасибо!
+1
Gabrielle
Очень полезно, больше спасибо автору))))
0
c3dm
Гениален сам принцип применения ... Т.е. методология.
0
Юра_И.
"голый задок в зеркале" - оригинально. Урок отличный. Спасибо.