[LWJGL] Textur / File wieder freigeben

Times

Bekanntes Mitglied
Hallo Community,

beim freigeben einer Textur mittels OpenGL habe ich das Problem das die Textur-ID zwar freigegeben wird, aber die Datei auf der Platte weiterhin in Benutzung ist, solange wie das Spiel noch läuft.

Textur wird geladen mittels:
Java:
public int loadTexture(String fileName){
        try {
            Texture texture = TextureLoader.getTexture("PNG", new FileInputStream("res/textures/"+fileName+".png"));
            GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);
            GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
            GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.5f);
            int textureID = texture.getTextureID();
            this.textures.add(textureID);
            return textureID;
        } catch (IOException ex) {
            Logger.getLogger(ModelLoader.class.getName()).log(Level.SEVERE, null, ex);
        }
        return 0;
    }

Textur wird in OpenGL freigegeben mit:
Java:
public void unloadTexture(int id){
        GL11.glDeleteTextures(id);
        this.textures.remove(id);
    }

Hat jemand eine Idee oder vielleicht eine Lösung wie ich die Datei nun wieder freigeben kann? Am besten wäre wenn dies auch mittels der id gehen würde, sprich ohne Dateinamen.

Vielen Dank
 
Zuletzt bearbeitet von einem Moderator:
folgendes könnte vielleicht schon reichen:
Java:
FileInputStream fis = new FileInputStream("res/textures/"+fileName+".png");
Texture texture = TextureLoader.getTexture("PNG", fis);
// ...
fis.close();
return textureID;
 
Hallo,

vielleicht sowas wie :

Java:
import java.io.IOException;
import java.io.InputStream;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;
public class TextureExample {
  
  /** The texture that will hold the image details */
  private Texture texture;
  
  
  /**
  * Start the example
  */
  public void start() {
  initGL(800,600);
  init();
  
  while (true) {
  GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
  render();
  
  Display.update();
  Display.sync(100);
  if (Display.isCloseRequested()) {
  Display.destroy();
  System.exit(0);
  }
  }
  }
  
  /**
  * Initialise the GL display
  *
  * @param width The width of the display
  * @param height The height of the display
  */
  private void initGL(int width, int height) {
  try {
  Display.setDisplayMode(new DisplayMode(width,height));
  Display.create();
  Display.setVSyncEnabled(true);
  } catch (LWJGLException e) {
  e.printStackTrace();
  System.exit(0);
  }
  GL11.glEnable(GL11.GL_TEXTURE_2D);  
  
  GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  
  
  // enable alpha blending
  GL11.glEnable(GL11.GL_BLEND);
  GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
  
  GL11.glViewport(0,0,width,height);
  GL11.glMatrixMode(GL11.GL_MODELVIEW);
  GL11.glMatrixMode(GL11.GL_PROJECTION);
  GL11.glLoadIdentity();
  GL11.glOrtho(0, width, height, 0, 1, -1);
  GL11.glMatrixMode(GL11.GL_MODELVIEW);
  }
  
  /**
  * Initialise resources
  */
  public void init() {
  
  try {
  // load texture from PNG file
     InputStream resourceAsStream = ResourceLoader.getResourceAsStream("image.jpg");
  texture = TextureLoader.getTexture("JPG", resourceAsStream);
  
  System.out.println("Texture loaded: "+texture);
  System.out.println(">> Image width: "+texture.getImageWidth());
  System.out.println(">> Image height: "+texture.getImageHeight());
  System.out.println(">> Texture width: "+texture.getTextureWidth());
  System.out.println(">> Texture height: "+texture.getTextureHeight());
  System.out.println(">> Texture ID: "+texture.getTextureID());
  
  resourceAsStream.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
  /**
  * draw a quad with the image on it
  */
  public void render() {
  Color.white.bind();
  texture.bind(); // or GL11.glBind(texture.getTextureID());
  
  GL11.glBegin(GL11.GL_QUADS);
  GL11.glTexCoord2f(0,0);
  GL11.glVertex2f(100,100);
  GL11.glTexCoord2f(1,0);
  GL11.glVertex2f(100+texture.getTextureWidth(),100);
  GL11.glTexCoord2f(1,1);
  GL11.glVertex2f(100+texture.getTextureWidth(),100+texture.getTextureHeight());
  GL11.glTexCoord2f(0,1);
  GL11.glVertex2f(100,100+texture.getTextureHeight());
  GL11.glEnd();
  }
  

  public static void main(String[] argv) {
  TextureExample textureExample = new TextureExample();
  textureExample.start();
  }
}

Und die Zeile:

resourceAsStream.close();

ist das entscheidene. Getestet und für gut empfunden.
 
Zuletzt bearbeitet:
Guten Abend 🙂

Das hat doch auf anhieb funktioniert, vielen Dank 🙂
Finde es nur komisch das es mit dem FileInputStream nicht funktioniert!

Grüße
 

Neue Themen


Zurück
Oben