当前位置: 首页 > 知识库问答 >
问题:

在Java中加载OpenGL和LWJGL3中的纹理

梅逸清
2023-03-14

我正在学习一个关于在屏幕上渲染文本的教程,但我似乎找不到加载字体纹理的有效方法。我尝试了slick库,但它已经过时了:它使用lwjgl2的方法,lwjgl3中不再存在,因此它抛出了一个java。lang.NoSuchMethodError。在互联网上,我发现glfw(集成在lwjgl中)有一种称为glfwLoadTexture2D的方法,但它似乎只在glfw的C版本中可用。我还在openGL UTIL中找到了一个名为gluBuild2DMipmaps的方法,但看起来lwjgl没有:类GLUtil和GLUtil存在,但它们没有任何类似的方法,实际上它们几乎是空白。

我正在寻找加载纹理并返回纹理ID以供进一步使用的东西,可能不使用外部库。

共有1个答案

葛高澹
2023-03-14

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)纹理。 我做了一些测试:使用着色器 我在旧驱动程序(