OpenGL - разные текстуры на разных поверхностях одного и того же объекта - PullRequest
3 голосов
/ 22 июля 2011

Я пытаюсь нарисовать машину для игры, которую я делаю, используя OpenGL. Объект car хранится в файле .obj с сопровождающим файлом .mtl.

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

Ответы, которые я нашел на эту проблему, заключаются в том, чтобы привязать текстуру к определенному номеру текстуры (т. Е. GL_TEXTURE0, GL_TEXTURE1 и т. Д.) И передать Sampler2D фрагментному шейдеру, ссылающемуся на него. Тем не менее, я могу хранить более 50 текстур таким образом? Насколько я могу сказать, это идет к GL_TEXTURE32.

Кроме того, как бы я сказал шейдеру применить текстуру только к определенному лицу автомобильного объекта?

Ответы [ 3 ]

8 голосов
/ 22 июля 2011

Вы не можете визуализировать модель таким образом, когда вы связываете все текстуры одновременно. Фрагментный шейдер, даже для высококлассного оборудования класса GL 4.1, может получить доступ только к 16 текстурам. То есть он может иметь только 16 сэмплеров.

Общее количество текстур выше, потому что другие стадии шейдеров также могут использовать текстуры.

Правильный способ решения этой проблемы - выполнить одно из следующих действий:

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

# 3 - единственное решение, не требующее изменения данных. Но будьте осторожны: если вы визуализируете этот автомобиль часто (скажем, тысячи раз за кадр), накладные расходы на изменение состояния могут стать проблемой производительности. Некоторая комбинация № 1 и № 2 является обычно предпочтительным методом.

Кстати, если ваша модель имеет только несколько сотен граней, но 50 текстур, то, скорее всего, что-то пошло не так в процессе моделирования.

1 голос
/ 22 июля 2011

Невозможно использовать произвольное количество текстур просто так, просто так.

Существует в основном 3 решения:

  • Используйте меньше текстур
    • Упакуйте несколько отдельных текстур в атлас.Это требует от вас корректировки текстурных координат и осторожности при создании mipmap (хотя достойный инструмент сделает это автоматически).Возможно, вам придется позаботиться о том, чтобы оставить достаточную границу для анизотропной фильтрации.
    • Упакуйте несколько отдельных текстур в одну текстуру массива.Нет проблем с mipmaps и aniso, но требуется аппаратная поддержка (карты GL 3.1)
  • Разделите вашу модель
    • Больше вызовов отрисовки и еще больше изменения состояния и остановка трубопровода на машину (плохо для производительности)
    • Решение: Нарисуйте, например, все кузова автомобиля в одной партии, все шины в одной партии и все огни в другой, чтобы уменьшить изменения состояния
  • Использование текстурирования деталей и меньшее количество текстур "в целом с низкой детализацией"
    • аналогично тому, как вы делаете текстурирование на местности
    • , объединяемых в пиксельном шейдере дляпридать каждой машине индивидуальный вид
0 голосов
/ 22 июля 2011

Переключение 50 текстур для одного объекта быстро превратится в кошмар с низкой производительностью. Используйте текстурный атлас.

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

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

...