Просто чтобы уточнить, VBO может содержать текстурные координаты, но не знает, какие текстуры будут применены к нему.
Оставьте VBO независимым от текстур и вычислите текстурные координаты в фрагментном / пиксельном шейдерев соответствии с анимацией / индексом кадра.Предполагая, что у вас есть квадроциклы в вашем VBO, вы устанавливаете координаты текстуры, чтобы они просто отображали всю текстуру.Затем в своем шейдере вы масштабируете и переводите координаты текстуры, чтобы отобразить один кадр на текстурном атласе.Затем вы можете задать индекс анимации, количество кадров в атласе и т. Д. Как единые значения для шейдера.
Редактировать (для дальнейшего уточнения):
Текстуракоординаты для квада
(0,1) (1,1)
x-------------x
| |
| |
| |
| |
| |
x-------------x
(0,0) (1,0)
Это соответствует отображению всей текстуры в этот один квад.
Допустим, ваша текстура удобно разбита на 16x16 "кадров", расположенных в столбце-строкезакажите в вашем текстурном атласе.Следовательно, размер одного кадра составляет 1/16 в текстурных координатах в u и v соответственно.Это ваше движущееся окно.Теперь в вашем шейдере вы передаете номер «кадра» для вашей анимации, а координата текстуры для каждой вершины в вашем квадре - это ее координата текстуры, масштабированная на 16, а затем переведенная в кадр (целое число на основе 0):
float scale = 0.0625 // 1/16.
texCoord *= scale;
texCoord += float2(scale*frame%16, scale*(frame/16))
Теперь я записываю это здесь изо всех сил, чтобы могли быть незначительные ошибки.также этот код предполагает, что texCoord является текстурной координатой фрагмента на кваде.Обратите внимание, что вычисление 1/16 один раз намного дешевле, чем повторное деление на 16, я могу добавить на пиксель.Строка float2 (scale * frame% 16, scale * (frame / 16)) может сбить вас с толку, если вы еще не подписаны на меня.Более простой случай:
(with a total of 64 frames in an 8x8 grid)
frame 0 1 2 3 4 5 6 7 8 9 10 11 12
x = frame%8 0 1 2 3 4 5 6 7 0 1 2 3 4
y = frame/8 0 0 0 0 0 0 0 0 1 1 1 1 1
(note integer division)