2017-01-27 3 views
0

Ich bin ein Tutorial über das Rendern von Text auf dem Bildschirm folgen, und ich kann nicht finden, eine funktionierende Möglichkeit zum Laden der Schriftart Textur. Ich habe die Slick-Bibliothek ausprobiert, aber es ist outdatet: Es verwendet Methoden von lwjgl2, nicht mehr in lwjgl3, so dass es eine java.lang.NoSuchMethodError wirft. Im Internet habe ich gefunden, dass glfw (das in lwjgl integriert ist) eine Methode namens glfwLoadTexture2D hat, aber es sieht so aus, als ob es nur in der C++ - Version von glfw verfügbar ist. Ich habe auch eine Methode in den OpenGL-Utilities namens gluBuild2DMipmaps gefunden, aber es sieht nicht aus wie lwjgl es hat: Klassen GLUtil und GLUtils existieren, aber sie haben keine ähnliche Methode, wirklich sind sie fast leer.Laden Sie eine Textur in OpenGL und LWJGL3 in Java

Ich bin auf der Suche nach etwas, das die Textur lädt und mir die ID der Textur für weitere Verwendung zurückgibt, möglicherweise ohne externe Bibliothek zu verwenden.

+0

Haben Sie 'glTexImage2D' versucht? Möchten Sie stattdessen C++ ausprobieren? – ybungalobill

Antwort

1

LWJGL3 verfügt nicht über solche Funktionen zum Laden von Texturen, wie es schon bei Slick der Fall war. Aber man kann ganz leicht PNG-Bilder verwenden, und alles, was Sie brauchen, ist PNGLoader Sie es hier finden: https://mvnrepository.com/artifact/org.l33tlabs.twl/pngdecoder/1.0

(Slicks PNG-Decoder auch auf ihr basiert)

Eine voll funktionsfähige Methode, es zu benutzen

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

Dieses Verfahren nimmt eine einfache Textur-Klasse wie:

public class Texture{ 

    private int id; 

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

    public int getId(){ 
     return id; 
    } 
} 

Wenn Sie Breite wollen, Höhe Felder decoder.getWidth() decoder.getHeight() wird zurückkehrt du sie.

Schließlich erstellen Sie eine Textur wie:

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

und

texture.getId(); 

finden Sie die entsprechende Textur-ID geben.

+0

Haben Sie Probleme mit dem richtigen Pfad ... "./res/fonts/verdana.png" funktioniert nicht, "/res/fonts/verdana.png" oder "res/fonts/verdana.png" entweder, es wirft a NullPointerException – Someone

+0

nur "/fonts/verdana.png" – eldo

+0

versucht "/fonts/verdana.png", "./fonts/verdana.png", "fonts/verdana.png" ... es wirft eine NullPointerException – Someone