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

Java 使用Slick/OpenGL(使用getSubImage)渲染和裁剪/拉伸图像,java,opengl,rendering,slick2d,Java,Opengl,Rendering,Slick2d,我正在尝试使用Slick在项目中的一些2D精灵上重新创建阴影效果。为了做到这一点,我正在重新创建一个sprite副本,并使用Slick OpenGL使用以下方法对其进行拉伸: public static void getStretched(Shape shape, Image image) { TextureImpl.bindNone(); image.getTexture().bind(); SGL GL = Renderer.get(); GL.glEn

我正在尝试使用Slick在项目中的一些2D精灵上重新创建阴影效果。为了做到这一点,我正在重新创建一个sprite副本,并使用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
获得的方法中

我不确定为什么会发生这种情况,因为精灵本身是使用
getSubImage
从精灵表中获取的,渲染没有问题。 非常感谢您的帮助

我正在回忆一本《精灵》并将其展开

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

浮点失真x=。。。;
glEnable总图(SGL.Glu纹理图2D);
GL.glBegin(SGL.GL_QUADS);
//左上角
GL.glTexCoord2f(0f,0f);
GL.glVertex2f(shape.getPoints()[0]+扭曲x,shape.getPoints()[1]);
//右上角
GL.glTexCoord2f(1f,0f);
GL.glVertex2f(shape.getPoints()[2]+扭曲x,shape.getPoints()[3]);
//右下角
GL.glTexCoord2f(1f,1f);
GL.glVertex2f(shape.getPoints()[4],shape.getPoints()[5]);
//B左房间
GL.glTexCoord2f(0f,1f);
GL.glVertex2f(shape.getPoints()[6],shape.getPoints()[7]);
GL.glEnd();

[…]如果我将图像输入到使用getSubImage获得的方法中,[…]精灵本身是从精灵表中获取的[…]

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

我正在回忆一本《精灵》并将其展开

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

浮点失真x=。。。;
glEnable总图(SGL.Glu纹理图2D);
GL.glBegin(SGL.GL_QUADS);
//左上角
GL.glTexCoord2f(0f,0f);
GL.glVertex2f(shape.getPoints()[0]+扭曲x,shape.getPoints()[1]);
//右上角
GL.glTexCoord2f(1f,0f);
GL.glVertex2f(shape.getPoints()[2]+扭曲x,shape.getPoints()[3]);
//右下角
GL.glTexCoord2f(1f,1f);
GL.glVertex2f(shape.getPoints()[4],shape.getPoints()[5]);
//B左房间
GL.glTexCoord2f(0f,1f);
GL.glVertex2f(shape.getPoints()[6],shape.getPoints()[7]);
GL.glEnd();

[…]如果我将图像输入到使用getSubImage获得的方法中,[…]精灵本身是从精灵表中获取的[…]


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

非常感谢你的回答!你的解释帮助我解决了第一个问题。但是,我不确定我是否了解如何解决第二个问题。我使用getSubImage从精灵表的图像中获取图像。当我直接在子图像上使用draw()方法时,它会精确地呈现我想要的效果。即使使用新代码,阴影仍然显示原始图像。在失真之后选择正确的区域似乎不合理,因此我必须在这里遗漏一些东西。“在失真之后选择正确的区域似乎不合理”-“为什么”在“失真”之后?你怎么画雪碧?你能从子图像创建阴影吗?我通常通过调用图像本身的draw(x,y,width,height)来绘制精灵。这适用于子图像。当我将子图像输入到渲染阴影的方法中时,它的行为就好像我给了它原始图像而不是子图像一样。这就是我有点困惑的原因。看来我已经把事情做好了。出于某种原因,纹理大小是图像大小的0.875。不知道为什么,但现在情况看起来不错。谢谢你的帮助!非常感谢你的回答!你的解释帮助我解决了第一个问题。但是,我不确定我是否了解如何解决第二个问题。我使用getSubImage从精灵表的图像中获取图像。当我直接在子图像上使用draw()方法时,它会精确地呈现我想要的效果。即使使用新代码,阴影仍然显示原始图像。在失真之后选择正确的区域似乎不合理,因此我必须在这里遗漏一些东西。“在失真之后选择正确的区域似乎不合理”-“为什么”在“失真”之后?你怎么画雪碧?你能从子图像创建阴影吗?我通常通过调用图像本身的draw(x,y,width,height)来绘制精灵。这适用于子图像。当我将子图像输入到渲染阴影的方法中时,它的行为就好像我给了它原始图像而不是子图像一样。这就是我有点困惑的原因。看来我已经把事情做好了。出于某种原因,纹理大小是图像大小的0.875。不知道为什么,但现在情况看起来不错。谢谢你的帮助!