Я перекрашиваю копию спрайта и растягиваю ее
Проблема в том, что вы растягиваете координаты текстуры, но область, которая покрывается спрайтом, остается прежней. Если тень превышает область, которая покрыта четырехъядерным примитивом, она обрезается.
Вы должны «растягивать» координаты вершины, а не координаты текстуры. Определите геометрию ромба c для тени и оберните текстуру на ней:
float distortionX = ...;
GL.glEnable(SGL.GL_TEXTURE_2D);
GL.glBegin(SGL.GL_QUADS);
//topleft
GL.glTexCoord2f(0f, 0f);
GL.glVertex2f(shape.getPoints()[0] + distortionX, shape.getPoints()[1]);
//topright
GL.glTexCoord2f(1f, 0f);
GL.glVertex2f(shape.getPoints()[2] + distortionX, shape.getPoints()[3]);
//bottom right
GL.glTexCoord2f(1f, 1f);
GL.glVertex2f(shape.getPoints()[4], shape.getPoints()[5]);
//btoom left
GL.glTexCoord2f(0f, 1f);
GL.glVertex2f(shape.getPoints()[6], shape.getPoints()[7]);
GL.glEnd();
[...], если я передам изображение в метод, полученный с помощью getSubImage , [...] сам спрайт взят из таблицы спрайтов [...]
Спрайт охватывает только небольшую прямоугольную область angular всей текстуры. Эта область определяется координатами текстуры. Вы должны использовать те же координаты текстуры, что и при рисовании самого спрайта.