Carica una texture all'interno di OpenGL e LWJGL3 in Java


Sto seguendo un tutorial sul rendering del testo sullo schermo e non riesco a trovare un modo funzionante per caricare la trama del font. Ho provato la libreria slick, ma è outdatet: usa metodi di lwjgl2, non più esistenti in lwjgl3, quindi lancia un java.lang.NoSuchMethodError. In Internet ho scoperto che glfw (che è integrato in lwjgl) ha un metodo chiamato glfwLoadTexture2D, ma sembra che sia disponibile solo nella versione C++ di glfw. Ho anche trovato un metodo nelle utilità OpenGL chiamato gluBuild2DMipmaps, ma non sembra come lwjgl ha: le classi GLUtil e GLUtils esistono, ma non hanno alcun metodo simile, in realtà sono quasi vuote.

Sto cercando qualcosa che carichi la texture e mi restituisca l'ID della texture per un ulteriore utilizzo, possibilmente senza utilizzare la libreria esterna.

Author: Someone, 2017-01-27

1 answers

LWJGL3 non ha funzioni di caricamento delle texture pronte all'uso come con slick prima. Ma puoi usare le immagini png abbastanza facilmente e tutto ciò di cui hai bisogno è PNGLoader che puoi trovare qui: https://mvnrepository.com/artifact/org.l33tlabs.twl/pngdecoder/1.0

(Slicks PNG decoder anche basato su di esso)

Un metodo completamente funzionale per usarlo

public static Texture loadTexture(String fileName){

    //load png file
    PNGDecoder decoder = new PNGDecoder(ClassName.class.getResourceAsStream(fileName));

    //create a byte buffer big enough to store RGBA values
    ByteBuffer buffer = ByteBuffer.allocateDirect(4 * decoder.getWidth() * decoder.getHeight());

    //decode
    decoder.decode(buffer, decoder.getWidth() * 4, PNGDecoder.Format.RGBA);

    //flip the buffer so its ready to read
    buffer.flip();

    //create a texture
    int id = glGenTextures();

    //bind the texture
    glBindTexture(GL_TEXTURE_2D, id);

    //tell opengl how to unpack bytes
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    //set the texture parameters, can be GL_LINEAR or GL_NEAREST
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    //upload texture
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, decoder.getWidth(), decoder.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

    // Generate Mip Map
    glGenerateMipmap(GL_TEXTURE_2D);

    return new Texture(id); 
}

Questo metodo presuppone una classe di texture semplice come:

public class Texture{

    private int id;

    public Texture(int id){
        this.id = id;
    }

    public int getId(){
        return id;
    }
}

Se vuoi larghezza, i campi altezza decoder.getWidth() decoder.getHeight() lo faranno ti restituisce loro.

Infine si crea una texture come:

Texture texture = ClassName.loadTexture("/textures/texture.png");

E

texture.getId();

Ti darà l'ID texture corrispondente.

 1
Author: eldo, 2017-01-28 20:07:15