【问题标题】:Texture Coordinates not Functioning Properly?纹理坐标无法正常运行?
【发布时间】:2015-08-23 15:50:55
【问题描述】:

我不知道我是不是……在这里没有看到什么。我已经为此工作了很长一段时间,试图让它发挥作用。我以前使用过精灵表和纹理坐标——所以我很熟悉它们。

我有一个 9 x 9 的精灵表(如图所示)。它是一个等距精灵表(因为我有等距图块)。总图像为 1152 x 576。

我计算出,根据尺寸,每个图块的宽度为128像素,高度为64像素。

每个图块占据的图像百分比为 0.111(纵向和高度 [128 / 1152 | 64 / 576])。

但是,我的代码不起作用。

代码和tilesheet的图像:http://i.imgur.com/JU4YYaB.png

原始代码:

@Override
public void drawTile(int tileX,  int tileY, Texture atlas) {

    int tileXcoord, tileYcoord;

    tileXcoord = (tileX - tileY) * (TILE_XHALF); 
    tileYcoord = (tileX + tileY) * (TILE_YHALF); 

    atlas.bind();


    //GL11.glColor3f(Red, Green, Blue); 

    GL11.glBegin(GL11.GL_QUADS);
    {
        setTextureCoordinates(1);
        GL11.glVertex2f(tileXcoord, tileYcoord);
        setTextureCoordinates(2);
        GL11.glVertex2f(tileXcoord + TILE_XHALF, tileYcoord + TILE_YHALF);
        setTextureCoordinates(3);
        GL11.glVertex2f(tileXcoord + (TILE_XHALF * 2), tileYcoord);
        setTextureCoordinates(4);
        GL11.glVertex2f(tileXcoord + TILE_XHALF, tileYcoord - TILE_YHALF);
    }
    GL11.glEnd();

}

//***** SET TEXTURE COORDINATES *****
    public void setTextureCoordinates(int pos) {
        Rectangle rect = textureAtlas.getTexture(ID);
        switch (pos) {
        case 1 :
            GL11.glTexCoord2f(0.0f, 0.0555f); // left-middle
            //GL11.glTexCoord2f(0.0f, 0.5f);
            break;

        case 2:
            GL11.glTexCoord2f(0.0555f, 0.111f); //top-middle
            //GL11.glTexCoord2f(0.5f, 1f);
            break;

        case 3:
            GL11.glTexCoord2f(0.111f, 0.0555f); // right-middle
            //GL11.glTexCoord2f(1f, 0.5f);
            break;

        case 4:
            GL11.glTexCoord2f(0.0555f, 0.0f); // bottom-middle
            //GL11.glTexCoord2f(0.5f, 0.0f);
            break;
        }

}

编辑:输出:http://i.imgur.com/YYKo37m.png

【问题讨论】:

    标签: java opengl


    【解决方案1】:

    您似乎在游戏中的每个渲染图块上获得了大约一个半图块的纹理。

    凭直觉,我猜你用来加载纹理的任何东西都是将图像填充到二的下一个幂 (2048 x 1024)。

    您的坐标将是(以像素坐标为单位):

    (0,     56.8 )
    (113.7, 113.7)
    (227.3, 56.8 )
    (113.7, 0    )
    

    这似乎与您的纹理接缝大致匹配。我不熟悉提供 OpenGL 绑定的 Java 库,但看到您明确使用 OpenGL 1.1,库会这样做是有道理的。当时的硬件(1997 年)无法处理不是 2 次方的纹理。 This was added as an extension in 2003.

    你可以:

    1. 自己将纹理填充到下一个 2 的幂,并为此使用适当的坐标(0.0625 而不是 0.111)
    2. 查看您正在使用的库的纹理加载文档,看看是否有强制非二次幂纹理的方法。如果没有,我会非常惊讶。

    一般来说,最好将纹理填充为 2 的幂,因为用于表示图块的浮点数将始终被精确表示。

    【讨论】:

    • @Namone 没问题 :) 如果您找到了完全回答您问题的答案,请记住将答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多