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.
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.