【问题标题】:Rendering and Cropping/Stretching an Image Using Slick/OpenGL (using getSubImage)使用 Slick/OpenGL 渲染和裁剪/拉伸图像(使用 getSubImage)
【发布时间】:2020-04-13 02:24:41
【问题描述】:

我正在尝试使用 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 的新手,所以关于如何解决这个问题的一些帮助会很棒。 此外,如果我将图像输入到使用getSubImageOpenGL renders the original image, rather than the sub image 获得的方法中。

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

【问题讨论】:

    标签: java opengl rendering slick2d


    【解决方案1】:

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

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

    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 获得的方法中,[...] 精灵本身取自 spritesheet [...]

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

    【讨论】:

    • 非常感谢您的回答!您的解释帮助我解决了我的第一个问题。但是,我不确定我是否了解如何解决第二个问题。我正在使用 getSubImage 从精灵表的图像中获取我的图像。当我直接在 subImage 上使用 draw() 方法时,它会完全按照我想要的方式呈现。即使使用这个新代码,阴影仍然显示原始图像。在扭曲后选择正确的区域似乎不合理,所以我一定在这里遗漏了一些东西。
    • “在扭曲之后选择正确的区域似乎不合理” - 为什么是“在”扭曲之后?你怎么画精灵?你能从 subImage 创建一个阴影吗?
    • 我通常通过在图像本身上调用 draw(x,y,width,height) 来绘制精灵。这适用于子图像。当我将 subImage 输入到渲染阴影的方法中时,它就好像我给了它原始图像而不是 subImage。这就是为什么我有点困惑。
    • 看来我已经完成了一些工作。由于某种原因,纹理大小是图像大小的 0.875。不知道为什么,但现在情况看起来不错。感谢您的帮助!
    猜你喜欢
    • 2017-05-08
    • 2012-04-10
    • 1970-01-01
    • 2012-10-31
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多