5f14f772038342e6dfae73ba5856e526.jpeg

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

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

5591554ff6d6f181c5e453ecadaab46b.jpeg

Для примера взял обычную сферу с модификатором «Hair and Fur».
Допустим, у нас уже есть нарисованная карта для уточнения плотности волос «Density», в моем случае это будет стандартная шахматная карта «Checker». Помещаю в нужный слот, результат на картинке. Далее собственно сам метод.

d1d73fdec43174b5a9ee9f7042950d12.jpeg

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) Тут можно посмотреть, как график влияет на саму маску. Ровный график – размытые границы, резкий – четкие границы. Левее – меньше видно, правее – больше.

Эта часть просто демонстрация немного усложненного вида. Допустим, вместо простого исчезновения, может подгружаться другая карта и т.п.

78f67e31fb8774a08a758f8f38ef3dfe.jpeg

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) Теперь при отдалении камеры уменьшается и общая плотность шерсти. Но регулировать её все же лучше вручную в самих модификаторах, а не таким способом.

a2eb85a4f0f3de35cbaf5c8b95c8cd28.jpeg

А вот и пример по замене карт.
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) Пояснение простой настройки:

211467128e34592ef046c054bd806ce5.jpeg

1. В «Surface scattering» подгружается основная карта «Composite».
2. В «Scale» подгружается дополнительная карта «Falloff» с такими настройками.

Опять же, это больше демонстрация, в большинстве задач проще настраивать вручную или анимировать по кадрам положение камер и плотности объектов…

Ладно, дальше сами тесты.

6edb4c534eb746ac82018d970ab7e66c.jpeg

Рендер по 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

Ну и, наверное, сама суть:

ca33af53e03ce6deaf54a4e7ff8295f9.jpeg

Попытка отрендерить сразу две сферы по 10 пассов.

1.Стандартный подход, без оптимизации.
Первая попытка рендера – вылет на 40-х минутах, вторая – очень долгая загрузка «Geometry», шла уже за час, пришлось просто выключить. Рендер так и не начался.
2. Средняя оптимизация.
Рендер начался примерно через две с половиной минуты.

Попытался осилить и кота. Если что, за котика извиняюсь : ) В любом случае можете полюбоваться на оригинал: https://3ddd.ru/3dmodels/show/cat_4_1

c446fd78a3b2c4c99434fb7c48d89dda.gif

(GIF) Суть настроек как в начале урока. Настраиваем «Falloff», только вместо «Checker», конечно, помещаем карту из архива «CAT 4_Density-texture» в «Map 1».

Тут нужно сказать, что результаты получались разными, но последний вариант теста с белым котом получился таким:

650e008c53e434e888a88c80cdf7f899.jpeg

Рендер по 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 пассов:

ac3c837f8594cc117b0e1d3b6b2f1fa5.jpeg

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:

92aaf08c8fb74bc3f7f9fc7af7883a41.jpeg