Java 纹理地图集在不同的计算机上呈现不同的效果

Java 纹理地图集在不同的计算机上呈现不同的效果,java,opengl,texture-mapping,Java,Opengl,Texture Mapping,我在使用一个简单的基于2d瓷砖的引擎时遇到了问题。在我的家用电脑(Windows 7 64位,jogl 1.1.1)上,纹理可以正确地绑定到瓷砖上,但在我的笔记本电脑(Windows Vidta 32位,jogl 1.1.1)上,纹理似乎已损坏 精灵图像为600x100(每个精灵为100x100) 这是我正在使用的textureManager类 public class TextureManager { private static Texture textureAtlas;

我在使用一个简单的基于2d瓷砖的引擎时遇到了问题。在我的家用电脑(Windows 7 64位,jogl 1.1.1)上,纹理可以正确地绑定到瓷砖上,但在我的笔记本电脑(Windows Vidta 32位,jogl 1.1.1)上,纹理似乎已损坏

精灵图像为600x100(每个精灵为100x100)

这是我正在使用的textureManager类

public class TextureManager {

    private static Texture textureAtlas;
    private static Map<String, TextureCoords> locations;
    private static String imageName;

    public TextureManager() {

        locations = new HashMap<String, TextureCoords>();
    }

    public static void loadAtlas(String name) {

        if(textureAtlas != null) {

            if(imageName == name) return;

            textureAtlas.dispose();
        }

        imageName = name;

        try {

            textureAtlas = TextureIO.newTexture(new File("textures/" + name + ".png"), true);
        }
        catch (GLException e) {

            e.printStackTrace();
        }
        catch (IOException e) {

            e.printStackTrace();
        }

        setAtlasLocations();
    }

    private static void setAtlasLocations() {

        locations.put("blank", textureAtlas.getSubImageTexCoords(0, 0, 100, 100));
        locations.put("tree1", textureAtlas.getSubImageTexCoords(100, 0, 200, 100));
        locations.put("tree2", textureAtlas.getSubImageTexCoords(200, 0, 300, 100));
        locations.put("tree3", textureAtlas.getSubImageTexCoords(300, 0, 400, 100));
        locations.put("rock", textureAtlas.getSubImageTexCoords(400, 0, 500, 100));
    }

    public static void bindTexture() {

        textureAtlas.bind();
    }

    public static TextureCoords getCoords(String name) {

        return locations.get(name);
    }
}
公共类TextureManager{
私有静态纹理纹理;
私有静态地图位置;
私有静态字符串imageName;
公共纹理管理器(){
位置=新的HashMap();
}
公共静态void loadAtlas(字符串名称){
如果(textureAtlas!=null){
if(imageName==name)返回;
textureAtlas.dispose();
}
imageName=名称;
试一试{
textureAtlas=TextureIO.newTexture(新文件(“textures/”+name+“.png”),true);
}
捕获(GLException e){
e、 printStackTrace();
}
捕获(IOE异常){
e、 printStackTrace();
}
setAtlasLocations();
}
私有静态void setAtlasLocations(){
locations.put(“空白”,textureAtlas.getSubImageTexCoords(0,0,100,100));
位置.put(“tree1”,textureAtlas.getSubImageTexCoords(100,02000100));
位置.put(“tree2”,textureAtlas.getSubImageTexCoords(200,0,300,100));
位置.put(“tree3”,textureAtlas.getSubImageTexCoords(300,0400100));
位置。放置(“岩石”,纹理图。getSubImageTexCoords(400,0,500,100));
}
公共静态void bindTexture(){
textureAtlas.bind();
}
公共静态TextureCoords getCoords(字符串名称){
返回位置。获取(名称);
}
}
这是渲染代码:

    public void draw(GL gl) {

        gl.glEnable(GL.GL_TEXTURE_2D);

        TextureManager.bindTexture();

        int width = map.width();
        int height = map.height();

        float x = InterfaceManager.mapX;
        float y = InterfaceManager.mapY;

        gl.glTranslatef(x, y - height, 0);

        gl.glBegin(GL.GL_QUADS);

        gl.glNormal3f(0.0f, 0.0f, 1.0f);
        gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

        for(int w = 0; w < width; w++) {

            for(int h = 0; h < height; h++) {

                TextureCoords coords = getCoord(map.getTileType(w, h));

                gl.glTexCoord2f(coords.left(), coords.bottom());
                gl.glVertex3i(w, h, 0);
                gl.glTexCoord2f(coords.right(), coords.bottom());
                gl.glVertex3i(w+1, h, 0);
                gl.glTexCoord2f(coords.right(), coords.top());
                gl.glVertex3i(w+1, h+1, 0);
                gl.glTexCoord2f(coords.left(), coords.top());
                gl.glVertex3i(w, h+1, 0);
            }
        }

        gl.glEnd();

        gl.glTranslatef(-x, -y + height, 0);

        gl.glDisable(GL.GL_TEXTURE_2D);
    }

    private TextureCoords getCoord(int tileType) {

        if(tileType == 0) return TextureManager.getCoords("blank");
        else if(tileType == 1) return TextureManager.getCoords("rock");
        else if(tileType == 2) return TextureManager.getCoords("tree1");
        else if(tileType == 3) return TextureManager.getCoords("tree2");
        else if(tileType == 4) return TextureManager.getCoords("tree3");
        else return TextureManager.getCoords("blank");
    }
公共作废提取(GL){
gl.glEnable(gl.gl\U纹理\U 2D);
TextureManager.bindTexture();
int width=map.width();
int height=map.height();
float x=InterfaceManager.mapX;
float y=InterfaceManager.mapY;
gl.glTranslatef(x,y-高度,0);
gl.glBegin(gl.gl_QUADS);
gl.glNormal3f(0.0f、0.0f、1.0f);
gl.glColor4f(1.0f,1.0f,1.0f,1.0f);
对于(int w=0;w
我知道opengl应该是独立于平台的,因为我在这两个平台上使用的是相同版本的opengl,所以我假设我的代码中可能有一个bug

希望有经验的人能帮我解决这个问题。谢谢

编辑:这是一张扭曲结果的图片

沿着顶部和右侧的树木实际上应该是下面精灵的岩石

这是精灵文件:


OpenGL自动生成的MIPMap导致了该问题。将下面的行更改为不允许自动mipmapping可修复此问题

textureAtlas = TextureIO.newTexture(new File("textures/" + name + ".png"), false);
如果有人想评论我应该如何创建我的sprite文件以允许自动mipmapping,或者如果这应该启用,请执行:)

禁用mipmapping后,当我移动角色时,一些平铺会在其下方得到一条黑线。我必须弄清楚如何使精灵图像可移植


编辑:使文件呈方形,并达到2的倍数。

它们如何显示为破损?你能放张照片吗?这将有助于诊断。我已经编辑了一些图像!嗯,对不起,还没想到什么。如果您当前没有检查,可能会抛出一个glGetError?我不知道这是否能捕捉到任何东西,但有时它可以帮助你发现一些奇怪的问题,这些问题会以奇怪的方式扰乱你的渲染。谢谢蒂姆。好吧,现在我感觉很糟糕。这是我在发布问题后第二次发现问题。我的精灵文件映射不正确。当我自动关闭mipmap时,它会工作。我必须弄清楚如何制作一个映射正确的sprite文件。谢谢你,蒂姆。