【问题标题】:Displaying texture in spritesheet based on ID's根据 ID 在 spritesheet 中显示纹理
【发布时间】:2013-05-17 05:02:25
【问题描述】:

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

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

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,则从 spritesheet 中获取第三张图片,依此类推。

但我不知道我必须在哪里将 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);

但没有一个有效。

=== 编辑 ===

我几乎设法让它工作了。但只有奇数的blockID。如果 blockID 为 1,则显示第一个纹理,但如果为 2,则显示褐色(不在我的 spritesheet 上),如果 blockID 为 3,则在工作表上显示第二个纹理,依此类推。

【问题讨论】:

    标签: java opengl textures lwjgl sprite-sheet


    【解决方案1】:

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

    您需要计算您的精灵在图像中的距离(百分比),然后将其作为浮点数输入 TexCoord。

    我认为你应该使用:

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

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

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

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

    【讨论】:

    • 好的,我已经部分解决了这个问题。如果 BlockID 是奇数,它可以工作,但如果它是偶数,它会显示一个棕色的正方形,它甚至不在 spritesheet 上。知道是什么原因造成的吗?
    • 我会通过在调用之前进行数学运算并将它们打印到控制台/文本文件来调试它。然后直接看数字是怎么回事。使用调试器进行深入研究,拿起笔和纸,绘制坐标并手动运行数学。 OpenGL 方面似乎可以工作,现在只需要调整数字即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多