在Java中用OpenGL和LWJGL3加载纹理

时间:2017-01-27 19:20:21

标签: java opengl lwjgl

我正在按照有关在屏幕上呈现文字的教程,我似乎无法找到一种加载字体纹理的工作方式。我尝试了光滑的库,但是它已经过时了:它使用lwjgl2的方法,在lwjgl3中不再存在,所以它会抛出java.lang.NoSuchMethodError。在互联网上我发现glfw(集成在lwjgl中)有一个名为glfwLoadTexture2D的方法,但看起来它只能在glfw的C ++版本中使用。我还在openGL工具中找到了一个名为gluBuild2DMipmaps的方法,但它看起来并不像lwjgl那样:类GLUtilGLUtils存在,但它们并不存在有任何类似的方法,实际上它们几乎是空白的。

我正在寻找能够加载纹理的东西并将纹理的ID提供给我以供进一步使用,可能不需要使用外部库。

1 个答案:

答案 0 :(得分:2)

LWJGL3没有像以前那样使用纹理加载功能。但你可以很容易地使用png图像,你只需要PNGLoader就可以在这里找到它:https://mvnrepository.com/artifact/org.l33tlabs.twl/pngdecoder/1.0

(Slicks PNG解码器也基于它)

使用它的全功能方法

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

此方法假设一个简单的Texture类,如:

public class Texture{

    private int id;

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

    public int getId(){
        return id;
    }
}

如果你想要宽度,高度字段decoder.getWidth() decoder.getHeight()会返回它们。

最后,您可以创建一个纹理:

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

texture.getId();

会给你相应的纹理ID。