Поддержка цвета лица в glTF

У меня есть вопрос о материале граней glTF: в исходной модели он содержит тело сетки с двумя разными материалами граней. Как экспортировать различные материалы граней из одного тела исходной сетки в одну сетку glTF?

Пример: исходная модель представляет собой куб с красным и синим цветами граней с материалом текстуры. Файл glTF: куб с двумя примитивами под одной сеткой glTF. Для одного примитива установите красный цвет материала; для другого примитива установите его материальный цвет как синий. Это правильное и хорошее решение? Есть ли другой способ лучше?

введите здесь описание изображения  введите описание изображения здесь

введите здесь описание изображения


person JustinW    schedule 30.04.2020    source источник


Ответы (1)


Лучшим способом было бы использовать (очень маленькую) карту текстур для обозначения разных цветов лица.

Каждый материал glTF соответствует программе шейдера, стеку текстур и настройкам материала, используемым в одном вызове отрисовки. Если вы запрашиваете разные настройки, например разные значения baseColorFactor для некоторых полигонов, то типичному механизму рендеринга потребуется сделать более одного вызова отрисовки, чтобы визуализировать всю сетку.

В вашем примере с кубом это означает, что типичный механизм рендеринга, скорее всего, установит какое-то значение uniform на красный, затем загрузит только вершины красных граней куба в графический конвейер, а затем запустит весь конвейер. Подождите, пока вершинный шейдер сделает свое дело, растеризатор разрезает треугольники на фрагменты, фрагментный шейдер окрашивает все фрагменты в красный цвет, а пиксели выходят с другой стороны. Затем, как только весь этот конвейер очищается от данных и сбрасывается, только тогда значение uniform будет изменено с красного на синий. Теперь загрузите вершины для синих граней и перезапустите весь конвейер с самого начала. Ой. Слишком медленно.

Вместо этого поместите небольшую текстурную карту с красной и синей областями. Грани куба не имеют общих нормалей, а некоторые не имеют общих UV-разверток, поэтому на кубе будет 24 вершины. Механизм рендеринга загружает программу шейдера, загружает карту текстур, а затем выгружает все 24 вершины в графический конвейер и позволяет копировать. Таким образом, вся сетка может быть сделана из одного материала, используя один glTF primitive, что приведет к одному вызову отрисовки.

Эти большие усилия по оптимизации одного вызова отрисовки не стоят того в вакууме, но если это свидетельствует о шаблоне, который часто повторяется в модели, или сетка или модель создаются много раз, оптимизация становится стоит. Если на каждый кадр анимации приходится тысячи вызовов отрисовки, некоторые пользователи некоторых систем могут начать замечать задержку.

person emackey    schedule 30.04.2020
comment
Спасибо за подробное объяснение. Я добавил свою сетку файла glTF и сегменты материала в свой пост. Кажется, что примитив может ссылаться только на один материал glTF. Если использовать один примитив для представления всех шести граней, как мы можем добиться шести граней для отображения различных материалов в одном примитиве? Приносим извинения за то, что до сих пор не совсем ясно поняли, что такое карта текстуры. - person JustinW; 01.05.2020
comment
Да, по дизайну, один материал на примитив. Еще один вариант, о котором я забыл: вместо использования текстуры, вы можете назначать цвета с помощью атрибута вершины COLOR_0. Материал должен быть белым, а затем вы должны использовать красный и синий цвета в качестве атрибутов вершины. - person emackey; 02.05.2020
comment
Я пытаюсь понять ваш способ текстурной карты. В следующей ссылке он отвечает на вопрос, как применить разные изображения к каждой грани куба? Кажется, что третий ответ похож на ваш способ карты текстуры, верно? webglfundamentals.org /webgl/lessons/webgl-3d-textures.html - person JustinW; 06.05.2020
comment
Для использования COLOR_0 можно использовать примитив, если нет изображения текстуры для лиц. Если синие грани также присоединяют изображение текстуры 1, а красные грани присоединяют другое изображение текстуры 2, использование цвета вершин COLOR_0 по-прежнему может обеспечить только примитив для куба? - person JustinW; 06.05.2020