Рендеринг и кадрирование / растяжение изображения с помощью Slick / OpenGL (с использованием getSubImage) - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь воссоздать эффект тени на некоторых 2D-спрайтах в проекте, используя Slick. Для этого я перекрашиваю копию спрайта и растягиваю ее, используя Slick OpenGL, используя этот метод:

public static void getStretched(Shape shape, Image image) {

    TextureImpl.bindNone();
    image.getTexture().bind();

    SGL GL = Renderer.get();

    GL.glEnable(SGL.GL_TEXTURE_2D);
    GL.glBegin(SGL.GL_QUADS);

    //topleft
    GL.glTexCoord2f(0f, 0f);
    GL.glVertex2f(shape.getPoints()[0], shape.getPoints()[1]);

    //topright
    GL.glTexCoord2f(0.5f, 0f);
    GL.glVertex2f(shape.getPoints()[2], shape.getPoints()[3]);

    //bottom right
    GL.glTexCoord2f(1f, 1f);
    GL.glVertex2f(shape.getPoints()[4], shape.getPoints()[5]);

    //btoom left
    GL.glTexCoord2f(0.5f, 1f);
    GL.glVertex2f(shape.getPoints()[6], shape.getPoints()[7]);

    GL.glEnd();
    GL.glDisable(SGL.GL_TEXTURE_2D);
    TextureImpl.bindNone();
}

Это дает практически желаемый эффект, за исключением того факта, что изображение немного обрезается.

Это становится более экстремальным для более высоких искажений

Я новичок в использовании OpenGL, поэтому некоторая помощь относительно того, как это исправить, была бы полезной. Более того, если я передаю изображение в метод, полученный с использованием getSubImage, OpenGL отображает исходное изображение, а не вспомогательное изображение .

Я не уверен, почему это происходит, так как сам спрайт взят из таблицы спрайтов с использованием getSubImage и не имеет проблем с рендерингом. Помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 13 апреля 2020

Я перекрашиваю копию спрайта и растягиваю ее

Проблема в том, что вы растягиваете координаты текстуры, но область, которая покрывается спрайтом, остается прежней. Если тень превышает область, которая покрыта четырехъядерным примитивом, она обрезается.
Вы должны «растягивать» координаты вершины, а не координаты текстуры. Определите геометрию ромба 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 всей текстуры. Эта область определяется координатами текстуры. Вы должны использовать те же координаты текстуры, что и при рисовании самого спрайта.

...