如何获得一个可以与LWJGL一起使用的ByteBuffer?

Uno*_*ome 1 java opengl lwjgl

我正在尝试glTexImage2D使用OpenGL库调用该函数.我正在使用LWJGL作为在Java中使用OpenGL的框架.

根据文档,此方法接受以下参数:

public static void glTexImage2D(int target,
            int level,
            int internalformat,
            int width,
            int height,
            int border,
            int format,
            int type,
            java.nio.ByteBuffer pixels)
Run Code Online (Sandbox Code Playgroud)

我的实现如下.

GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, 1092, 1092, 0, GL11.GL_RGB, GL11.GL_INT, imageData);
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个错误:

Exception in thread "main" java.lang.IllegalArgumentException: Number of remaining buffer elements is 3577392, must be at least 14309568. Because at most 14309568 elements can be returned, a buffer with at least 14309568 elements is required, regardless of actual returned element count
    at org.lwjgl.BufferChecks.throwBufferSizeException(BufferChecks.java:162)
    at org.lwjgl.BufferChecks.checkBufferSize(BufferChecks.java:189)
    at org.lwjgl.BufferChecks.checkBuffer(BufferChecks.java:230)
    at org.lwjgl.opengl.GL11.glTexImage2D(GL11.java:2855)
    at TextureLab.testTexture(TextureLab.java:100)
    at TextureLab.start(TextureLab.java:39)
    at TextureLab.main(TextureLab.java:20)
Run Code Online (Sandbox Code Playgroud)

我已经完成了大量的查询,并且我假设我为最后一个参数创建ByteBuffer的方法是导致问题的原因.

我获取ByteBuffer表单的代码实现如下:

img = ImageIO.read(file);
byte[] pixels = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();

ByteBuffer buffer = BufferUtils.createByteBuffer(pixels.length);
buffer.put(pixels);
buffer.flip();
buffer.rewind();
Run Code Online (Sandbox Code Playgroud)

我已经用width*height*4 代替缓冲区的长度,甚至硬编码到错误中包含的数字,一切都没有运气.我有什么想法我做错了吗?我认为这个问题出在我的ByteBuffer中,但即便如此,我也不确定.

der*_*ass 6

lwjgl层告诉你你的缓冲区应该至少14309568字节大,但你只提供3577392.这个的原因是你用作调用GL_INT格式参数glTexImage2D,所以假设每个像素由3 4表示GL的字节整数值.

您只想使用GL_UNSIGNED_BYTE典型的每通道8位图像内容,这些内容可以映射到您当前提供的3577392字节.