Есть функция glTexSubImage2D. Для нее надо будет вырезать из массива пикселей исходного изображения нужную тебе часть в отдельный массив и передать его в качестве последнего параметра.
Другой вариант, создать одну текстуру, но для разных спрайтов использовать кастомные текстурные координаты.
Если есть текстура размером (width, height), а тебе надо натянуть на спрайт фрагмент с координатами диагонали (x1, y1) и (x2, y2), причем x2 > x1 и y2 > y1, то текстурные координаты расчитываются следующим образом:
float s_min = x1 / width;
float s_max = x2 / width;
float t_min = y1 / height;
float t_max = y2 / height;
tex_coords[0] = s_min; tex_coords[1] = t_max;
tex_coords[2] = s_min; tex_coords[3] = t_min;
tex_coords[4] = s_max; tex_coords[5] = t_max;
tex_coords[6] = s_max; tex_coords[7] = t_min;
// ...
glBindTexture(GL_TEXTURE_2D, ...);
glVertexPointer(...);
glTexCoordPointer(2, GL_FLOAT, 0, tex_coords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
Порядок следования s_min, s_max, t_min и t_max может быть другим, в зависимости от того, как ты задаешь координаты вершин. А их вычисление от этого порядка не зависит.