АртФорумМоделирование

Мульти материалы, очень ли плохо? И как объединять.

#0
0:11, 20 апр 2017

Делаю модель для мобильной платформы, поэтому оптимизация особенно актуальна. Начитался, что если материалы на модели используют один шейдер, то для оптимизации лучше иметь 1 материал на всю модель и по 1 типу каждой карты. У меня же, для удобства, несколько материалов и соответственно для каждого материала свой набор карт. Насколько это критично для производительности? И как проще объединить уже готовые мульти материальные модели и карты для них в модель с 1 материалом и 1 набором карт? Может есть утилита какая-то...
Моделил в Maya, текстуры делал в Substance Painter, если имеет значение.
Спасибо.

#1
8:38, 20 апр 2017

По идее есть такая штука как вызовы на отрисовку для видеокарты (drawcall). Их количество влияет на fps, если слишком много - будет тормозить.

Примитивно говоря (цифры примерные):
один объект с одним простым материалом = 1 drawcall
один объект с одним сложным матриалом = 3 drawcalls
один объект с 3 сложными материалами = 9 drawcalls

Если таких объектов в кадре много то вызовы на отрисовку вырастут в геометрической прогрессии. Поэтому лучше делать одним материалом один объект. Исключения объекты где скомбинированы очень разные материалы (стекло например) свойства которых нельзя передать в стандартном материале. Персонажи когда они сделаны модульно. Крупные объекты которых в кадре немного.


Объединить наверное запеканием. Лучше конечно заранее планировать.

#2
9:31, 20 апр 2017

Parhelion
>>один объект с 3 сложными материалами = 9 drawcalls

А три отдельных объекта с разными материалами?

#3
11:22, 20 апр 2017

> А три отдельных объекта с разными материалами?
3 drawcalls

три одинаковых объекта с разными материалами
3 drawcalls


три разных объекта с одним материалом имеют шансы попасть в батчинг и тогда отрисуются за
1 drawcall

поэтому очень желательно использовать один и тот же материал, особенно если шейдер на материалах тот же самый

#4
13:02, 20 апр 2017

То есть имелось ввиду "3 сложными материалами" - все материалы уникальные?
Я просто не мог понять почему умножаются драуколы.

+ Показать
#5
13:12, 20 апр 2017

В юнити это очень легко тестится. Там есть статистика по дроколам. Ставите камеру, объекты тестовые и смотрите что получается при разных вариантах. В других движках приличных наверняка подобное тоже есть.

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

#6
13:19, 20 апр 2017

alt3d
> То есть имелось ввиду "3 сложными материалами" - все материалы уникальные?
> Я просто не мог понять почему умножаются драуколы.

Нет уникальность это отдельное свойство. Сами материалы бывают рисуются в один проход, бывает в несколько. Это зависит от шейдера.
Например простейший шейдер типа shadeless рисуется в один проход, но он просто отображает текстуру, без освещения, не умеет принимать и отбрасывать тень, не умеет карты нормалей и спекуляра отображать, применяется в мобильных играх или в специфических местах типа гуи и интерфейса.
Более сложные шейдеры требуют несколько проходов. Зато дают бамп, PBR, тесселяцию, смешивание текстур по цвету вершин и т.д и т.п.

Т.е каждый отдельный материал может занимать как 1 так и несколько дроколов.

Умножаются дроколы потому что ты берешь крутой шейдер где уже несколько дроколов. Потом используешь не один материал на объект, а несколько. Потом умножажешь на количество разных объектов.
x - количество дроколов в шейдере
y - количество материалов в объекте
z - количество объектов в кадре

x*y*z=дофигища

#7
13:22, 20 апр 2017

каждый материал в любом случае потребует +1 drawcall (сейчас верно называть SetPass call) независимо находятся все материалы видимые в камере на одном объекте или на разных

дальше на SetPass влияют другие факторы модели

#8
16:23, 20 апр 2017

Большое спасибо за подробные ответы! Получается, что, это важно, значит буду решить проблему. Попробую объединить карты через Substance Designer, вроде, там это можно сделать более или менее удобно.

#9
18:42, 20 апр 2017

Если OGL ES 3.x или мобилка поддерживает Texture Arrays, то можно за один DIP вывести модель и с 32 материалами.

#10
9:57, 21 апр 2017

Parhelion

А вообще, батчатся-ли динамически объекты с мультматериалами?
Насколько я понимаю, геометрия объектов с одним материалом объединяются в один меш и отправляется на видеокарту.
И если есть два идентичных мульти-материальных объекта - получается они должны отправляться на рендеринг по частям.

А если так - то нет-ли тут лазейки для обхода ограничения в 300-900 вертексов. :)
Например: два одинаковых объекта по 500 вершин, с двумя материалами делящими объект на две части?
Каждая отдельная часть умещается в ограничении в 300 вершин и ее можно объеденить.

Или там тупо: на объекте больше вершин чем нужно - пошел вон со своим батчингом.
Короче надо посмотреть вечером, конечно, и проверить.
Но теория интересна )

#11
14:29, 21 апр 2017

alt3d
> Насколько я понимаю, геометрия объектов с одним материалом объединяются в один
> меш и отправляется на видеокарту.
Да

Дальше моих познаний не хватает. Тут лучше пояснят программисты. Или надо читать документацию к движку.

#12
18:26, 21 апр 2017

сам батчинг тоже потребляет ресурсы, сильно на него рассчитывать не стоит
сильно дробить объекты чтобы они батчились тоже не нужно, а вот объединять все в один меш — путь к оптимизации
один меш на 1500 вершинных значений легче отрисовать чем 1000 объектов по 15
с другой стороны меш с очень большим количеством вершин тоже плохо, для мобильных платформ оптимально держаться в пределах 1500 вершин на меш

100 объектов по 3 материала на каждом:
Изображение

АртФорумМоделирование

Тема в архиве.