Как мне сказать frag-shader, какую текстуру (из многих ранее загруженных текстур) использовать для каждой вершины внешнего сгенерированного 3D-файла? - PullRequest
0 голосов
/ 13 февраля 2012

Я пытаюсь найти наилучший способ загрузки текстурированной 3D-модели в мое приложение webGL, но у меня возникли некоторые проблемы с этим. Мои 3D-модели имеют более 1 текстуры, и я не знаю, как сказать шейдеру, какую текстуру использовать для каждой вершины, поскольку эта информация, похоже, не включена в 3D-файлы, которые я изучал до сих пор. Я приведу пример: я смоделировал деревянный стул с кожаным сиденьем / подушкой в ​​Blender. В какой формат следует экспортировать кресло, чтобы его было легко и эффективно извлечь: - положения вершин; - информация о лицах / индексах, определяющая, какая вершина принадлежит каждой грани. - УФ координаты; - нормальные - имя / расположение текстурных файлов. - какую текстуру использовать для каждой вершины.

Я предполагаю, что, когда у меня есть пара vertex-textureID в моем JS, я мог бы передать ее шейдеру как атрибут (на основе каждой вершины), сообщив ему, какую текстуру использовать для этой конкретной вершины (используя drawElements для ее рисования) сразу) но я не знаю, как получить эту информацию для начала.

Все статьи, инструкции и руководства, которые я нашел в Интернете, загружают модели только с 1 текстурой. Я также заметил, что three.js, похоже, уже решил эту проблему, но я хотел, чтобы она работала напрямую с webGL, прежде чем переходить в одну из этих библиотек (например, three.js, glge, scene.sj, spiderGL и т. Д.). .

Любая помощь, ссылки или предложения будут наиболее ценными.

1 Ответ

2 голосов
/ 13 февраля 2012

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

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

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

Более распространенная практика - провести одну отрисовкувызов для каждого материала (материал == текстура в вашем случае).Поэтому, если у вас есть стул с деревянной рамой и кожаная подушка сиденья, как вы описали, вы должны связать текстуру дерева, отобразить весь каркас, затем связать текстуру подушки сиденья и визуализировать подушку отдельно.Это дает вам возможность далее использовать различные шейдеры для каждого типа материала, чтобы вы могли увеличить зеркальность на кожаных деталях, оставляя дерево красивым и матовым.Может показаться, что делать несколько вызовов отрисовки для каждого объекта дорого, но в большинстве случаев это не большая проблема, если вы не имеете дело с некоторыми действительно сложными сценами.

...