Делаю модель для мобильной платформы, поэтому оптимизация особенно актуальна. Начитался, что если материалы на модели используют один шейдер, то для оптимизации лучше иметь 1 материал на всю модель и по 1 типу каждой карты. У меня же, для удобства, несколько материалов и соответственно для каждого материала свой набор карт. Насколько это критично для производительности? И как проще объединить уже готовые мульти материальные модели и карты для них в модель с 1 материалом и 1 набором карт? Может есть утилита какая-то...
Моделил в Maya, текстуры делал в Substance Painter, если имеет значение.
Спасибо.
По идее есть такая штука как вызовы на отрисовку для видеокарты (drawcall). Их количество влияет на fps, если слишком много - будет тормозить.
Примитивно говоря (цифры примерные):
один объект с одним простым материалом = 1 drawcall
один объект с одним сложным матриалом = 3 drawcalls
один объект с 3 сложными материалами = 9 drawcalls
Если таких объектов в кадре много то вызовы на отрисовку вырастут в геометрической прогрессии. Поэтому лучше делать одним материалом один объект. Исключения объекты где скомбинированы очень разные материалы (стекло например) свойства которых нельзя передать в стандартном материале. Персонажи когда они сделаны модульно. Крупные объекты которых в кадре немного.
Объединить наверное запеканием. Лучше конечно заранее планировать.
Parhelion
>>один объект с 3 сложными материалами = 9 drawcalls
А три отдельных объекта с разными материалами?
> А три отдельных объекта с разными материалами?
3 drawcalls
три одинаковых объекта с разными материалами
3 drawcalls
три разных объекта с одним материалом имеют шансы попасть в батчинг и тогда отрисуются за
1 drawcall
поэтому очень желательно использовать один и тот же материал, особенно если шейдер на материалах тот же самый
То есть имелось ввиду "3 сложными материалами" - все материалы уникальные?
Я просто не мог понять почему умножаются драуколы.
В юнити это очень легко тестится. Там есть статистика по дроколам. Ставите камеру, объекты тестовые и смотрите что получается при разных вариантах. В других движках приличных наверняка подобное тоже есть.
Про батчинг очень дельно заметили. Если есть набор неких статичных объектов (особенно небольших) то их очень даже неплохо текстурить мини-атласом. Например некая модульная система, мебель, заборы, всякая мелкая утварь на столах, ассеты с проводами, вентиляционные короба и т.д. Всякий декор короче. Тогда такие вещи движок сможет объединить в один объект и отрисовать в один проход. Там есть исключения когда это не получится, но оставлять такую возможность будет нелишним.
alt3d
> То есть имелось ввиду "3 сложными материалами" - все материалы уникальные?
> Я просто не мог понять почему умножаются драуколы.
Нет уникальность это отдельное свойство. Сами материалы бывают рисуются в один проход, бывает в несколько. Это зависит от шейдера.
Например простейший шейдер типа shadeless рисуется в один проход, но он просто отображает текстуру, без освещения, не умеет принимать и отбрасывать тень, не умеет карты нормалей и спекуляра отображать, применяется в мобильных играх или в специфических местах типа гуи и интерфейса.
Более сложные шейдеры требуют несколько проходов. Зато дают бамп, PBR, тесселяцию, смешивание текстур по цвету вершин и т.д и т.п.
Т.е каждый отдельный материал может занимать как 1 так и несколько дроколов.
Умножаются дроколы потому что ты берешь крутой шейдер где уже несколько дроколов. Потом используешь не один материал на объект, а несколько. Потом умножажешь на количество разных объектов.
x - количество дроколов в шейдере
y - количество материалов в объекте
z - количество объектов в кадре
x*y*z=дофигища
каждый материал в любом случае потребует +1 drawcall (сейчас верно называть SetPass call) независимо находятся все материалы видимые в камере на одном объекте или на разных
дальше на SetPass влияют другие факторы модели
Большое спасибо за подробные ответы! Получается, что, это важно, значит буду решить проблему. Попробую объединить карты через Substance Designer, вроде, там это можно сделать более или менее удобно.
Если OGL ES 3.x или мобилка поддерживает Texture Arrays, то можно за один DIP вывести модель и с 32 материалами.
Parhelion
А вообще, батчатся-ли динамически объекты с мультматериалами?
Насколько я понимаю, геометрия объектов с одним материалом объединяются в один меш и отправляется на видеокарту.
И если есть два идентичных мульти-материальных объекта - получается они должны отправляться на рендеринг по частям.
А если так - то нет-ли тут лазейки для обхода ограничения в 300-900 вертексов. :)
Например: два одинаковых объекта по 500 вершин, с двумя материалами делящими объект на две части?
Каждая отдельная часть умещается в ограничении в 300 вершин и ее можно объеденить.
Или там тупо: на объекте больше вершин чем нужно - пошел вон со своим батчингом.
Короче надо посмотреть вечером, конечно, и проверить.
Но теория интересна )
alt3d
> Насколько я понимаю, геометрия объектов с одним материалом объединяются в один
> меш и отправляется на видеокарту.
Да
Дальше моих познаний не хватает. Тут лучше пояснят программисты. Или надо читать документацию к движку.
сам батчинг тоже потребляет ресурсы, сильно на него рассчитывать не стоит
сильно дробить объекты чтобы они батчились тоже не нужно, а вот объединять все в один меш — путь к оптимизации
один меш на 1500 вершинных значений легче отрисовать чем 1000 объектов по 15
с другой стороны меш с очень большим количеством вершин тоже плохо, для мобильных платформ оптимально держаться в пределах 1500 вершин на меш
100 объектов по 3 материала на каждом:

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