Charger une texture dans OpenGL et LWJGL3 en Java


Je suis un tutoriel sur le rendu du texte à l'écran, et je n'arrive pas à trouver un moyen fonctionnel de charger la texture de la police. J'ai essayé la bibliothèque lisse, mais c'est outdatet: elle utilise des méthodes de lwjgl2, n'existant plus dans lwjgl3, donc elle lance un java.lang.NoSuchMethodError. Sur Internet, j'ai trouvé que glfw (qui est intégré dans lwjgl) a une méthode appelée glfwLoadTexture2D, mais il semble qu'il ne soit disponible que dans la version C++ de glfw. J'ai également trouvé une méthode dans les utils OpenGL appelée gluBuild2DMipmaps, mais elle ne semble pas comme lwjgl l'a: les classes GLUtil et GLUtils existent, mais elles n'ont pas de méthode similaire, elles sont vraiment presque vides.

Je cherche quelque chose qui charge la texture et me redonne l'ID de la texture pour une utilisation ultérieure, peut-être sans utiliser de bibliothèque externe.

Author: Someone, 2017-01-27

1 answers

LWJGL3 n'a pas de telles fonctions de chargement de texture prêtes à l'emploi comme il l'a fait avec slick auparavant. Mais vous pouvez utiliser des images png assez facilement et tout ce dont vous avez besoin est PNGLoader, vous pouvez le trouver ici: https://mvnrepository.com/artifact/org.l33tlabs.twl/pngdecoder/1.0

(décodeur PNG Slicks également basé sur lui)

Une méthode entièrement fonctionnelle pour l'utiliser

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

Cette méthode suppose une classe de texture simple comme:

public class Texture{

    private int id;

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

    public int getId(){
        return id;
    }
}

Si vous voulez la largeur, les champs de hauteur decoder.getWidth() decoder.getHeight() seront vous renvoie d'eux.

Enfin, vous créez une texture comme:

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

Et

texture.getId();

Vous donnera l'id de texture correspondant.

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