2014-11-18 2 views
1

Мне нужно немного объяснить, как применять текстуры к различным объектам. Я понимаю, что может быть только одна связанная текстура за раз. Итак, если у меня есть много объектов, которые используют разные текстуры, как я могу применить текстуру к сущности, рендеринга объекта, а затем привязать следующий, чтобы применить к следующему объекту.Текстурирование нескольких объектов с OpenGL ES 2.0 на Android

Я предполагаю, что я смущен относительно времени применения текстуры к сущности и рендеринга ее с правильной текстурой. Я планирую использовать текстурные атласы для подобных спрайтов, анимаций и т. Д. Но я не знаю, как текстура или часть текстуры (текстурный атлас) сохраняются в сущности перед рендерингом, поэтому я могу перейти к применению следующей текстуры к другим объектам.

Аналогично, если у меня есть атлас текстуры, загружаемый и использующий его для анимации одного объекта, но также нужен другой объект для анимации, который использует другой атлас текстуры, мне нужно, чтобы игра загружала другой атлас и применяла его для достижения другой анимации?

Я знаком с opengl es 2.0 api. Мне просто нужна помощь по его применению.

ответ

0

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

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

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

  • Конструкторы по мере необходимости: с размером (FBO), с именем (из файла)
  • Bind (связывает текстуру)
  • размер текстуры
  • размер изображения на текстуре (в тех случаях, когда нанесение нон POT изображения в ПОТЕ текстуру)
  • Явных очистки (удаляет текстура)

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

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

  • текстура с именем (возвращает структуру с определенным именем либо из кэша или создает новый класс текстуры с таким именем и магазинами она)
  • явная очистка (просто удалить всю текстуру и очистить кэш-память)

После этого вы создаете класс модели, который содержит все данные, необходимые для быть нарисован. Он либо имеет идентификатор буфера вершин, либо может генерировать все данные вершин «на лету». Кроме того, он содержит текстуры (ссылки), которые захватываются из класса пула текстур. На данный момент есть два способа рисования этой модели.Один из них - сделать все это в вашем основном способе рисования, который я отговариваю, но это быстро сделать. Другой - реализовать метод класса модели, как в «draw with shader», к которому вы передаете свой собственный шейдерный класс, а сама модель содержит код для рисования. Трубопровод, который что-то вроде:

  • Bind связаны текстуры
  • Получить и связать координаты текстуры из текстуры (или атласного подкласса)
  • Получить и связать координаты положения от модели
  • Есть ли какие-либо дополнительные настройки, необходимые в затенении
  • Draw

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

Кроме того, этот подход будет иметь минимальный объем памяти для вашего приложения, если данные текстуры пройдут. А поскольку сами модели идут, их ресурсы незначительно малы, например каждая из них содержит некоторую структуру фрейма с 4 плавающими значениями и указатель на текстуру из пула.

Надеюсь, это объяснение поможет вам.

+0

Большое спасибо за этот ответ. После публикации моего оригинального сообщения я попробовал метод, но он не работал. Я мог только рисовать один объект за раз. Ваш ответ должен отправить меня в правильном направлении. Еще раз спасибо! –

+0

Я пытаюсь применить то, что вы предложили, но мне трудно понять, как сделать класс Texture. Есть ли способ получить размер текстуры/изображения? –

+0

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

Смежные вопросы