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


9

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

Ответы:


11

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

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

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

glGetFloatv (GL_MODELVIEW_MATRIX ,&g_TexCoordMat);

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

spritesheet uvs

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

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


Вау, спасибо! Идеальный ответ. Мне очень нравится это решение, и я вернусь к нему, как только вернусь с работы. :-) Если я застряну, я побеспокою вас еще несколькими вопросами.
Uggwar

Это, насколько я вижу, генерирует один вызов отрисовки для каждого спрайта. Есть ли способ пакетировать эти спрайты для более плавной реализации?
Уггвар

@uggwar Экземпляр рисования?
Notabene
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.