Текстурный атлас по-разному отображается на другом компьютере - PullRequest
1 голос
/ 05 марта 2012

У меня проблема с простым 2d-движком на основе плиток, над которым я работаю.На моем домашнем компьютере (Windows 7 64bit, jogl 1.1.1) текстуры правильно привязываются к плиткам, но на моем ноутбуке (Windows Vidta 32bit, 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);
    }
}

Это код рендеринга:

    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");
    }

Я знаюПредполагается, что opengl не зависит от платформы, и, поскольку я использую одинаковые версии opengl для обеих версий, я предполагаю, что в моем коде, вероятно, есть ошибка.

Надеюсь, кто-то, имеющий больше опыта в этом, сможет мне помочьс этой проблемой.Спасибо!

РЕДАКТИРОВАТЬ: Вот изображение перекосов.спрайт ниже.

Это файл спрайта:

enter image description here

1 Ответ

2 голосов
/ 05 марта 2012

Проблема была вызвана автоматически сгенерированными мипмапами OpenGL.Изменение строки ниже, чтобы запретить автоматическое отображение, решает проблему.

textureAtlas = TextureIO.newTexture(new File("textures/" + name + ".png"), false);

Если кто-то хотел бы прокомментировать, как я должен создать свой файл спрайта, чтобы разрешить автоматическое отображение, или если это должно быть даже включено, пожалуйста,do:)

С отключенным мипмаппингом, когда я перемещаю персонажа, некоторые плитки получают черную линию под ними.Мне нужно будет выяснить, как сделать спрайт-изображение способным к mipmap.

РЕДАКТИРОВАТЬ: сделать файл квадратным с точностью до 2.

...