有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java纹理坐标不能正常工作?

我不知道我是否只是。。。没看到什么。我已经为此工作了很长一段时间,试图让它发挥作用。我以前使用过雪碧片和纹理坐标,所以我对它们很熟悉

我有一张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


共 (1) 个答案

  1. # 1 楼答案

    看起来游戏中每个渲染的瓷砖上都有一块半的纹理

    凭直觉,我猜无论你用什么来加载纹理,都会将图像填充到下一个二次方(2048 x 1024)

    你的坐标将是(像素坐标):

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

    这似乎与你的纹理接缝大致匹配。我不熟悉提供OpenGL绑定的Java库,但鉴于您正在显式使用OpenGL 1.1,该库可以做到这一点是有道理的。当时(1997年)的硬件无法处理非二次幂的纹理This was added as an extension in 2003

    你可以:

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

    一般来说,最好将纹理叠加到二次方,因为用于表示平铺的浮标将始终精确表示