【问题标题】:How would I read a sprite sheet in LWJGL?我将如何阅读 LWJGL 中的精灵表?
【发布时间】:2012-07-31 11:27:54
【问题描述】:

我目前使用 LWJGL 纹理在屏幕上绘制图像。我想从精灵表中读取纹理*。我正在使用 slick 的 TextureLoader 类来加载纹理。

我绘制了一个 LWJGL 形状并将纹理绑定到它上面。

例如:

我在画一幅画:

    Texture texture = ResourceManager.loadTexture("Images/Tests/test.png");

    GL11.glBegin(GL11.GL_QUADS);
    {
      GL11.glTexCoord2f(0, 0);
      GL11.glVertex2f(0, 0);
      GL11.glTexCoord2f(0, texture.getHeight());
      GL11.glVertex2f(0, height);
      GL11.glTexCoord2f(texture.getWidth(), texture.getHeight());
      GL11.glVertex2f(width,height);
      GL11.glTexCoord2f(texture.getWidth(), 0);
      GL11.glVertex2f(width,0);
    }
    GL11.glEnd();

我认为有一种方法可以在调用 glTexCoord2f 时给它一个精灵偏移量,然后将精灵表加载到纹理中,

例如一个电话会是这样的:

      GL11.glTexCoord2f(0+spriteXOffset, texture.getHeight()-spriteYOffset);

但我真的很想知道是否有更简单的方法,例如从单个纹理中提取纹理,就像他们在这里所做的那样:

Reading images from a sprite sheet Java

只是代替 BufferedImage,Texture 对象。

感谢您的帮助!

【问题讨论】:

    标签: java textures lwjgl sprite-sheet


    【解决方案1】:

    GL_TEXTURE_2D 的纹理坐标,由 Slick 纹理加载器在内部使用,需要归一化纹理坐标。也就是说,坐标范围从 0.0 到 1.0。所以 (0,0) 是纹理的左上角, (1,1) 是右下角。假设您手头有像素坐标中的精灵坐标,那么您必须将 x 坐标除以纹理宽度,将 y 坐标除以纹理高度,从而得到归一化的纹理坐标。然后,您将使用 glTexCoord 将这些坐标提供给 OpenGL。

    glTexCoord2f(spriteX / textureWidth, spriteY / textureHeight);
    glVertex2f(coordinateX, coordinateY);
    glTexCoord2f(spriteX+spriteWidth / textureWidth, spriteY / textureHeight);
    glVertex2f(coordinateX2, coordinateY);
    // Et cetera
    

    不过,还有一种更简单的方法可以做到这一点。看看this video(我创建了它),看看如何将像素坐标用于纹理而不是标准化的。

    【讨论】:

    • 感谢您的回答!我已经观看了您的视频,除了 LWJGL 和 slick util 之外,我不想再添加任何罐子,我找到了更容易的方法,但我按照您所说的和图片做了不显示这是我的渲染代码:
    • GL11.glTexCoord2f(spriteX/width, spriteY/height); GL11.glVertex2f(0, 0); GL11.glTexCoord2f(spriteX/width, spriteY+cellSize/height); GL11.glVertex2f(0, 32); GL11.glTexCoord2f(spriteX+cellSize/width, spriteY+cellSize/height); GL11.glVertex2f(32,32); GL11.glTexCoord2f(spriteX+cellSize/width, spriteY/width); GL11.glVertex2f(32,0);
    • sprite x 是 32 sprite y 是 0 宽度是 96 高度是 128,我绑定的纹理是工作表,什么都没有显示...单元格大小是 32
    • 我注意到在一个纹理调用中我将 y 除以宽度,更改了它,但它仍然没有显示出来。
    • 尝试将纹理坐标存储在四个浮点数中并将它们打印到控制台。
    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多