我试图使用OpenGL库调用glTexImage2D
函数。我使用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)
我的实现如下。
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, 1092, 1092, 0, GL11.GL_RGB, GL11.GL_INT, imageData);
然而,我收到一个错误:
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)
我已完成分配查询,我假设我为最后一个参数创建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();
我已经用width
* height
* 4替换缓冲区的长度,甚至硬编码到错误中包含的数字,一切都没有运气。我有什么想法,我做错了什么?我认为这个问题出在我的ByteBuffer中,但即便如此,我也不确定。
答案 0 :(得分:6)
lwjgl层告诉您缓冲区应至少为14309568字节,但您只提供3577392.原因是您使用GL_INT
作为格式参数调用glTexImage2D
,因此假设每个像素由GL <3> 4字节整数值表示。
您只想将GL_UNSIGNED_BYTE
用于典型的每通道8位图像内容,这些内容可以映射到您当前提供的3577392字节。