java - 如何获得适用于 LWJGL 的 ByteBuffer?

标签 java opengl lwjgl

我正在尝试使用 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 中,但我也不确定。

最佳答案

lwjgl 层告诉您您的缓冲区应该至少有 14309568 字节大,但您只提供了 3577392。这是因为您使用 GL_INT 作为格式 glTexImage2D 调用的参数,因此假定每个像素由 GL 中的 3 个 4 字节 整数值表示。

您只想对典型的每 channel 8 位图像内容使用 GL_UNSIGNED_BYTE,它精确映射到您当前提供的 3577392 字节。

关于java - 如何获得适用于 LWJGL 的 ByteBuffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32593132/

相关文章:

java - 使用 ps.setObject 而不是 SQL 准备语句的类型特定方法会影响性能吗?

java - 我们如何计算小于 1 的数字的对数值...?使用java

java - LWJGL - 显示列表不起作用

java - 找出立方体的哪一侧位于屏幕中央?

c++ - OpenGL:将 RGBA 颜色结构作为一个参数发送到 glColor*()?

java - 2D map 创建

java - opengl中z坐标的值是多少

java - 定期更新 Rome 的 RSS feed

java - 防止在 ElementListUnion 中包含空 ElementList 的空标记

windows - OpenGL 软件渲染替代方案