@engune
Разработчик сайтов и мобильных приложений

Один шейдер или под каждый спрайт свой в OpenGL ES2?

Вопрос такой, не могу сообразить. Есть приложение iOS в котором нужно выводить графику через OpenGL ES2 на С++. Инициализация, подгрузка текстур есть. Вопрос встал в следующем:

Есть несколько разных спрайтов с разными текстурами, все спрайты одной формы - квадрат (2 полигона).
Есть несколько полигональных спрайтов, где каждый спрайт - это несколько полигонов 3+.

Каждый спрайт может перемещаться по X,Y. Изменять маштаб. Делать нужно шейдеры vertex&fragment для каждого спрайта или можно сделать универсальный для обоих вариантов спрайтов?

Нужно поддерживать:

1. Маштаб (float)
2. Перемещение (float,float)
3. Размеры (float,float)
4. Координаты текстуры (float,float,float)

Как лучше в спрайте хранить координаты - массивом или отдельными переменными.
  • Вопрос задан
  • 373 просмотра
Пригласить эксперта
Ответы на вопрос 2
Ni55aN
@Ni55aN
Лучше использовать один, так как переключение шейдеров дорого обходится
Ответ написан
@engune Автор вопроса
Разработчик сайтов и мобильных приложений
Я создал буфер:
glGenBuffers(1, &vbo_object);
glBindBuffer(GL_ARRAY_BUFFER, vbo_object);
glBufferData(GL_ARRAY_BUFFER, size, data, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

сами спрайты находятся в классах у которых есть свои x,y (координаты) ,u,v (координаты текстуры) - я могу это преобразовать в массив. Спрайтов допустим 100 штук, как потом отдельных массивов float потом записать в один буфер VBO.

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float) * nSize * 4, &pVertex); -> так обновить?
glBufferData(GL_ARRAY_BUFFER, nSize, &pVertex[0], GL_DYNAMIC_DRAW); -> так обновить?

допустим на каждом фрейме нужно смещать координаты каждого спрайта в разное время. Каждый раз переписывать VBO или есть лучший способ? Возможно во все спрайты передать VBO буфер? Или каждый раз при рендеринге фрейма - обновлять VBO всегда?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы