我正在按照有关在屏幕上呈现文字的教程,我似乎无法找到一种加载字体纹理的工作方式。我尝试了光滑的库,但是它已经过时了:它使用lwjgl2的方法,在lwjgl3中不再存在,所以它会抛出java.lang.NoSuchMethodError
。在互联网上我发现glfw(集成在lwjgl中)有一个名为glfwLoadTexture2D
的方法,但看起来它只能在glfw的C ++版本中使用。我还在openGL工具中找到了一个名为gluBuild2DMipmaps
的方法,但它看起来并不像lwjgl那样:类GLUtil
和GLUtils
存在,但它们并不存在有任何类似的方法,实际上它们几乎是空白的。
我正在寻找能够加载纹理的东西并将纹理的ID提供给我以供进一步使用,可能不需要使用外部库。
答案 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。