使用Slick / OpenGL(使用getSubImage)渲染和裁剪/拉伸图像

问题描述 投票:1回答:1

我正在尝试使用Slick在项目中的某些2D精灵上重新创建阴影效果。为此,我正在为精灵的副本重新着色并使用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();
}

This gives the almost the desired effect, aside from the fact that the image is cropped a bit.

This becomes more extreme for higher distortions

我是使用OpenGL的新手,所以有关如何解决此问题的一些帮助将非常有用。此外,如果我将图像输入使用getSubImage获得的方法中,则OpenGL renders the original image, rather than the sub image

我不确定为什么会发生这种情况,因为精灵本身是使用getSubImage从精灵表格中获取的,并且呈现时没有问题。帮助将不胜感激!

java opengl rendering slick slick2d
1个回答
0
投票

我正在为精灵的副本重新着色并拉伸它

问题是您拉伸了纹理坐标,但是精灵覆盖的区域保持不变。如果阴影超出了四元图元覆盖的区域,则将对其进行裁剪。您必须“拉伸”顶点坐标而不是纹理坐标。为阴影定义菱形几何体并在其上包裹纹理:

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获得的方法中,则精灵本身是从精灵表中获取的。

精灵仅覆盖整个纹理的一小块矩形区域。该区域由纹理坐标定义。您必须使用与绘制精灵本身相同的纹理坐标。

© www.soinside.com 2019 - 2024. All rights reserved.