16x16 Текстура слишком большая, Java openGL

Я делаю игру на основе тайлов, а текстуры для тайлов - 16х16. Всякий раз, когда я пытаюсь загрузить текстуру, чтобы она могла быть визуализирована, я получаю эту ошибку:

java.io.IOException: Attempt to allocate a texture to big for the current hardware
at org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.java:292)
at org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.java:231)
at org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.java:184)
at org.newdawn.slick.opengl.TextureLoader.getTexture(TextureLoader.java:64)
at org.newdawn.slick.opengl.TextureLoader.getTexture(TextureLoader.java:24)
at main.Tile.loadTexture(Tile.java:124)
at main.Draw.drawMap(Draw.java:282)
at main.Draw.render(Draw.java:324)
at main.LaunchWindow.main(LaunchWindow.java:65)
Exception in thread "main" java.lang.NullPointerException
at main.Draw.drawMap(Draw.java:284)
at main.Draw.render(Draw.java:324)
at main.LaunchWindow.main(LaunchWindow.java:65)

Теперь я знаю, что мой GPU может справиться с этим, потому что это карта на 1 ГБ.

Я побежал

GL11.glGetInteger(GL11.GL_MAX_TEXTURE_SIZE)

и получил 16384.

Вот код для загрузки текстуры:

public void loadTexture(String a){
    try {
        texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream(a));
        System.out.println(texture.getTextureRef());

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

И код вызывается, когда он должен быть представлен:

public void drawMap(Map b){
    Color.white.bind();
    glBegin(GL_QUADS);

    b.divideMap(10);
    Tile[][] t = b.makeMap(b.getK());

    for(int y = 0; y < b.tiles.length; y++){
        for(int x = 0; x < b.tiles[y].length; x++){
            Texture a;
            t[y][x].loadTexture(t[y][x].getLocation());
            a = t[y][x].getTexture();
            System.out.println(a.getTextureRef());
            a.bind();
            glTexCoord2f(0,0);
            glVertex2f(x,y);
            glTexCoord2f(1,0);
            glVertex2f(x + a.getWidth(), y);
            glTexCoord2f(1,1);
            glVertex2f(x + a.getWidth(), y +  a.getHeight());
            glTexCoord2f(0,1);
            glVertex2f(x, y +  a.getHeight());
        }
    }

    glEnd();
}

1 ответ

Решение

Не знаю основы, но из кода я вижу, что вы загружаете все текстуры в каждом кадре и никогда не выпускаете их. Через несколько кадров у вас не осталось памяти.

Другие вопросы по тегам