当前位置: 首页 > 面试题库 >

在LWJGL中将glTexImage2D与ByteBuffer一起使用时纹理为空

东郭瀚玥
2023-03-14
问题内容

我刚刚使用floats
数组在我的LWJGL代码中工作了一个测试纹理。但是,现在,我需要从文件加载图像并将其存储在纹理中。我已经加载了图像并将数据放入一个ByteBuffer对象,但是当我这样使用时glTexImage2D

GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB,
    4, 4, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, buffer);

纹理为空,将呈现为完全黑色。我已经看过其他人如何做到这一点,但似乎无济于事…函数调用也与float数组相同,除了 类型
参数外。是的,我的图像是RGB,是的4x4。我可能没有得到一些 非常 简单的信息,因此可以提供任何帮助。

完整的工作测试程序:

static org.lwjgl.system.MemoryUtil.NULL;

import java.nio.ByteBuffer;

import org.lwjgl.glfw.GLFW;
import org.lwjgl.opengl.GL;
import org.lwjgl.opengl.GL11;

public class Example {

    public static void main(String[] args) {
        if (!GLFW.glfwInit()) {
            throw new IllegalStateException("Unable to initialize GLFW");
        }

        // Create a window as the GL context
        long window = GLFW.glfwCreateWindow(100, 100, "", NULL, NULL);

        if (window == NULL) {
            GLFW.glfwTerminate();
            throw new RuntimeException("Failed to create the GLFW window");
        }

        GLFW.glfwMakeContextCurrent(window);

        GL.createCapabilities();

        // Generate the texture and set parameters
        int textureID = GL11.glGenTextures();
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);

        // A byte array of 4x4 RBG values
        byte[] data = new byte[] {
                127, 127, 0, 127, 127, 0, 127, 127, 0, 127, 127, 0,
                127, 127, 0, 127, 127, 0, 127, 127, 0, 127, 127, 0,
                127, 127, 0, 127, 127, 0, 127, 127, 0, 127, 127, 0,
                127, 127, 0, 127, 127, 0, 127, 127, 0, 127, 127, 0,
        };
        ByteBuffer buffer = ByteBuffer.wrap(data);

        // Load the data to the texture
        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, 4, 4, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, buffer);
        // glGetError returns 0.

        // Test if the buffer data is correctly stored in the texture.
        // I have unrelated problems while getting the data using a
        // ByteBuffer, so it's a float array for debug purposes.
        float[] floats = new float[data.length];
        GL11.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, GL11.GL_FLOAT, floats);
        // glGetError returns 0.

        for (float f : floats) {
            System.out.println(f);
        }
        // Expected output is 16 times the following:
        //   0.5
        //   0.5
        //   0.0
        // Actual output: Random (garbage?) values
        // Examples:
        //   0.003921569
        //   0.87843144
        //   1.0
    }
}

这为我重现了问题。为此需要通常的LWJGL库(lwjgl,opengl和glfw)。如代码注释中所述,glGetError在每个GL调用之后返回零。


问题答案:

如果您使用

ByteBuffer buffer = ByteBuffer.wrap(data);

缓冲区不是“
direct”的

您必须使用BufferUtils.createByteBuffer

ByteBuffer buffer = BufferUtils.createByteBuffer(data.length);
buffer.put(data);
buffer.flip();

说明:

BufferUtils.createByteBuffer 分配具有指定容量的直接按本机排序的字节缓冲区。

put(vboData)从当前位置(在这种情况下为缓冲区的开始)开始,将数据传输到缓冲区。缓冲区位置增加数据的大小。因此,新的缓冲区位置在新数据的末尾。

flip() 将缓冲区的限制(长度)设置为当前位置,然后将该位置设置为零。



 类似资料:
  • 我正在尝试制作一个2D基础游戏;有点像泰拉瑞亚,主要是提高我的openGL知识(使用Java和LWJGL)。 目前,我正在四边形上绘制纹理,一切都很好,但是,我似乎不能让这个窗口滚动(据我所知,这应该是由glTranslate完成的.. 代码: 绘制方法 在没有纹理的情况下,它可以很好地工作,但我不能让它工作以拯救我的生命。代码被临时设置为游戏循环,以尝试在按下空格键时进行一些基本翻译 我需要使用

  • 假设我有一个金字塔…我知道如何绘制它,我知道如何为整个金字塔设置纹理,但如何为每面墙设置不同的纹理? 我通过在 我试图通过添加<code>GL11.glBindTexture(GL11.GL_TEXTURE_2D,TEXTURE.getTextureID())来绑定纹理 后,但

  • 问题内容: 我遵循了一个教程,用于读取图片并从中创建纹理,但是,渲染时它会上下翻转。图像是2的幂。 主班 } 纹理加载器 代码是否有问题,还是必须在创建纹理之前翻转图像? 问题答案: 大多数图像格式从上到下存储数据。除非您在加载图像时重新整理数据,否则这也是读取图像后在内存中的顺序。 从加载的图像创建OpenGL纹理时,除非明确更改顺序,否则将维持此内存顺序。因此,纹理内存中的顺序仍然是从上到下。

  • 我正在绘制一个纹理四边形,但使用的纹理是以前绑定的纹理,即使我试图绑定一个新纹理。 在GuiHandler中创建纹理。Java语言 渲染代码 有人知道为什么使用先前绑定的纹理而不是正确的纹理吗?P、 我正在使用LWJGL

  • 在过去的一个小时左右,我一直在尝试修复一个错误,使我尝试渲染的纹理只是单一颜色。奇怪的是,这种加载纹理的方法以前对我来说非常有效,没有这样的问题。这是我如何加载纹理(来自BufferedImage): 这就是纹理如何绘制到屏幕上: 上面的代码在显示列表中。任何想法可能导致四边形呈现为单一颜色?

  • 我试图弄清楚为什么我不能用LWJGL 3渲染任何纹理。我尝试了多种加载(PNGDecoder、STB、BufferedImage)和渲染纹理的方法。但结果总是一个白色的四边形。 主要类: 加载方法: 渲染方法: ModelTexture类只是存储一些现在不使用的信息,blue.png是16x16的png文件。 这是我在启动程序时得到的输出: