纹理坐标无法正常运行?

时间:2015-08-23 15:50:56

标签: java opengl

我不知道我是不是......在这里看不到什么。我一直在研究这个问题已经有一段时间了,试图让它运转起来。我之前使用过精灵表和纹理坐标 - 所以我对它们很熟悉。

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

我计算出,根据尺寸,每个瓷砖的宽度为128像素,高度为64.

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

然而,我的代码无效。

代码和图块表的图像:webNavigation

原始代码:

@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/JU4YYaB.png

1 个答案:

答案 0 :(得分:1)

看起来你在游戏中每个渲染的瓷砖上都会得到一块瓦片和一半的纹理。

在预感中,我会猜测无论你使用什么来加载纹理,都要将图像填充到下一个2的幂(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. 查看您正在使用的库的纹理加载文档,看看是否有办法强制使用非二次幂纹理。如果没有,我会非常惊讶。
  3. 一般情况下,将纹理填充到2的幂是很好的,因为用于表示图块的浮动将始终被精确表示。