我正在学习一个关于在屏幕上渲染文本的教程,但我似乎找不到加载字体纹理的有效方法。我尝试了slick库,但它已经过时了:它使用lwjgl2的方法,lwjgl3中不再存在,因此它抛出了一个java。lang.NoSuchMethodError。在互联网上,我发现glfw(集成在lwjgl中)有一种称为glfwLoadTexture2D的方法,但它似乎只在glfw的C版本中可用。我还在openGL UTIL中找到了一个名为gluBuild2DMipmaps的方法,但看起来lwjgl没有:类GLUtil和GLUtil存在,但它们没有任何类似的方法,实际上它们几乎是空白。
我正在寻找加载纹理并返回纹理ID以供进一步使用的东西,可能不使用外部库。
LWJGL3没有像以前使用slick那样的现成纹理加载功能。但是你可以很容易地使用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);
}
该方法假设一个简单的纹理类,如:
public class Texture{
private int id;
public Texture(int id){
this.id = id;
}
public int getId(){
return id;
}
}
如果需要宽度、高度字段解码器。getWidth()解码器。getHeight()
将返回它们。
最后你创建一个纹理,比如:
Texture texture = ClassName.loadTexture("/textures/texture.png");
和
texture.getId();
将为您提供相应的纹理id。
在理想情况下,如果屏幕分辨率为1024x768,那么在给定时刻只需要786432 texel,2兆字节的内存就足够了。但在现实世界中,有管理成本,所以纹理需要更多的内存。 纹理流可以降低纹理的内存成本,也就是说,在给定时刻并不需要所有纹理的mipmap。纹理需要0级mipmap,因为它靠近相机,如果它离当前相机很远,5到11级mipmap可能就足够了。相机在场景中移动一段时间,一些mipmap可以
嘿,我不能让我的纹理出现,我不知道怎么了。辅导没有帮助。这是我的代码: spriteX=0,spriteY=0,spriteW=400,spriteL=400,x=0,y=0 这是我得到的输出:输出窗口 正如你所见,黑色三角形显示得很好,但没有纹理
我一直试图让纹理在opengl 3.1下工作,在ubuntu 13.04上运行的intelHD图形2000/3000显卡上。我遇到的问题是纹理要么不加载,我试图纹理的基本三角形变成黑色,要么纹理中的一些颜色会加载,但不会加载整个图像。我使用原始图像文件作为源或使用libjpeg加载jpeg得到相同的结果。 我的着色器如下所示: 创建纹理glGenTexture(1, 还有渲染功能 几何和纹理坐标
我正在尝试渲染一个简单的3D场景。它基本上是一个包裹在纹理中的表面。我在4台设备上测试了它,只有一台(Galaxy Note 4)正确渲染了纹理。其他三款手机(HTC Evo 3D、LG G2、索尼Xperia Z1)用一种颜色渲染所有纹理,这似乎是纹理的平均颜色。例如:原始图像和渲染纹理。 我的第一个猜测是我的碎片着色器有问题。但它非常基本,是从《Android版OpenGL ES 2》一书中复
我有一个从路径创建纹理的类,但当我尝试加载具有3个通道(rgb)的纹理时,它会在运行这一行时出现读取访问冲突异常 我试图改变stbi加载函数中的参数,但是没有用。 当我加载图像时,它设置了正确的宽度、高度和通道数据,所以我不知道我做错了什么 指向数据的指针也不是nullptr
在我的程序中,我使用了2种纹理:t0和t1。t1是附加的,仅在某些情况下需要: 绘图着色器: 它的工作原理很好:第二个纹理在需要时首先重叠。假设使用glBindTexture(..,0)返回零纹理(0,0,0,0),但在将NVidia驱动程序更新到314.07后,我的代码会出现黑屏,比如glBindTexture(..,0)返回(0,0,0,1)纹理。 我做了一些测试:使用着色器 我在旧驱动程序(