java - 根据 ID 在 spritesheet 中显示纹理

标签 java opengl textures lwjgl sprite-sheet

我一直在尝试在屏幕上显示 block ,每个 block 都有不同的纹理。我已经设置了 Sprite 表和代码。但我无法在 Sprite 表中获取特定坐标,无法将其他任何内容显示为第一张图像。

我已经设置了这个渲染函数:

public static void render(int texture, int blockID) {
    float xPos = (float)blockID;
    float yPos = 0;

    while(xPos > 9) {
        xPos -= 10;
        yPos++;
    }

    glBindTexture(GL_TEXTURE_2D, texture);

    glPushMatrix();
        glBegin(GL_TRIANGLES);
            glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(16, 0);
            glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(0, 0);
            glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(0, 16);

            glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(0, 16);
            glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(16, 16);
            glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(16, 0);
        glEnd();
    glPopMatrix();
}

它决定从 blockID 中获取哪个纹理,因此如果 blockID 为 1,则从 spritesheet 获取第二个图像,如果为 2,则获取第三个图像,依此类推。

但我不知道必须在哪里将 xPos 和 yPos 变量乘以 glTexCoord2f。我尝试过不同的方法,例如:

glTexCoord2f(xPos / 128f, 0f / 128f); glVertex2i(16, 0);
glTexCoord2f(0f / 128f, yPos / 128f); glVertex2i(0, 16);

glTexCoord2f((0f / 128f) * xPos, 0f / 128f; glVertex2i(16, 0);
glTexCoord2f(0f / 128f, (8f / 128f)) * yPos; glVertex2i(0, 16);

甚至

glTexCoord2f(0f / 128f, 0f / 128f); glVertex2i(16 * xPos, 0);
glTexCoord2f(0f / 128f, 8f / 128f); glVertex2i(0, 16 * yPos);

但没有任何效果。

===编辑===

我几乎已经让它工作了。但仅限于奇数 block ID。如果 blockID 为 1,则显示第一个纹理,但如果为 2,则显示棕色(不在我的 spritesheet 上),如果 blockID 为 3,则在工作表上显示第二个纹理,等等。

最佳答案

纹理坐标存在于以下范围内:0.0f --> 1.0f

您需要计算 Sprite 沿图像的距离(以百分比表示),然后将其作为 float 输入到 TexCoord 中。

我认为你应该使用:

   (8.0f / 128.0f) * xPos             (you should cache the float once it works)

如果这不起作用,请确保以下两件事:

  • 硬编码值有效(证明您的纹理已加载并初始化良好)
  • 正在您的渲染方法中计算正确的值

或者,不要忘记使用 glColor(1.0f, 1.0f, 1.0f) 渲染三角形,以确保应用程序中的其余渲染工作正常。

关于java - 根据 ID 在 spritesheet 中显示纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16686772/

相关文章:

java - midi 键盘不适用于所有平台

android - andengine 中的微不足道的纹理加载

opengl - OpenGL-将纹理坐标数组与索引数组而不是顶点数组相关联?

c++ - OpenGL 顶点缓冲对象不起作用

opengl - 在 GLSL 中访问多个 FBO 纹理以创建另一个纹理

java - 如何使用 java 从 RGB 像素值创建有效图像

java - 实现重写 toString 方法的继承

java - BaseFoo 不能用不同的参数 : <T, X.Bar<T>> 和 <T,X.Foo<T>> 继承

c++ - 将Qt4移植到Qt5,为OpenGL调用获取未解析的外部符号

java - JOGL FBObject 多重采样