Спрайт листов с буферными объектами и шейдерами

9

Каков «лучший» способ обработки листов спрайтов с помощью шейдеров и буферов? В непосредственном режиме легко изменить текстовые координаты спрайта, когда он отрисовывается, но я не знаю, как это сделать с современным opengl. Должен ли я сохранить все текскорды в буфере и изменить указатель для каждого спрайта, или есть лучший способ?

uggwar
источник

Ответы:

11

Вы всегда можете повторить буфер loong "vertex; texcoord". И просто используйте индексы, как вы сказали. Вероятно, это наиболее просто и похоже на то, что вы знаете.

Если вы хотите сэкономить память. Существует довольно изящное решение, и оно состоит в том, чтобы иметь один спрайт в буфере с unite texcoords и создать матрицу преобразования UVs и отправить ее в ваш шейдер и умножить с ней texcoords (в ​​вершинном шейдере).

Вам не нужно создавать матрицы самостоятельно, если вас это не устраивает. Вы можете просто использовать обычные функции GL, а затем читать матрицу с glGetFloatvфункцией. Нравится:

glGetFloatv (GL_MODELVIEW_MATRIX ,&g_TexCoordMat);

Я создал изображение, чтобы описать его лучше. glTranslate и glScale выглядят так, как будто они просто движутся с ультрафиолетовым пространством.

spritesheet uvs

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

Редактировать: Добавлен рисунок
(источник для спрайт-листа, который я использовал: funorb.com )

NotaBene
источник
Вау, спасибо! Идеальный ответ. Мне очень нравится это решение, и я вернусь к нему, как только вернусь с работы. :-) Если я застряну, я побеспокою вас еще несколькими вопросами.
Uggwar
Это, насколько я вижу, генерирует один вызов отрисовки для каждого спрайта. Есть ли способ пакетировать эти спрайты для более плавной реализации?
Уггвар
@uggwar Экземпляр рисования?
Notabene