Java LWJGL赢得';不能使用bytebuffer,但可以使用浮点数组

Java LWJGL赢得';不能使用bytebuffer,但可以使用浮点数组,java,opengl,lwjgl,Java,Opengl,Lwjgl,我正在尝试通过LWJGL显示纹理: glBindTexture(GL_TEXTURE_2D, textureId); BufferedImage img = null; img = ImageIO.read(new File(filePath)); Raster imgRaster = img.getData(); DataBufferByte imgBuffer = (DataBufferB

我正在尝试通过LWJGL显示纹理:

glBindTexture(GL_TEXTURE_2D, textureId);

            BufferedImage img = null;

            img = ImageIO.read(new File(filePath));

            Raster imgRaster = img.getData();

            DataBufferByte imgBuffer = (DataBufferByte) imgRaster.getDataBuffer();

            ByteBuffer byteBuffer = ByteBuffer.wrap(imgBuffer.getData());

            //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1,1, 0, GL_RGB, GL_FLOAT, new float[]{1f,0f,1f});
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.getWidth(), img.getHeight(), 0,
                         GL_RGB, GL_UNSIGNED_BYTE, byteBuffer);

            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
但是,纹理是完全黑色的(据我所知没有错误)。在调试器中,我验证了bytebuffer中确实存在数据(足以解释我提供的大小的纹理),因此我至少应该看到一些东西

但是,如果我在数组中快速抛出几个浮点数,并将其传递给glTexImage2D:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1,1, 0, GL_RGB, GL_FLOAT, new float[]{1f,0f,1f});
屏幕上的形状突然变成洋红色

我在过去遇到过这些*缓冲区的问题,用数组替换它们似乎总是可行的


我是否需要对ByteBuffer执行某些操作才能使其正常工作?

将数据放入ByteBuffer后,是否尝试翻转缓冲区以将其重置为可读?另一个问题,您确定要从光栅中检索的数据缓冲区的数据类型是3字节RGB格式吗?我猜您的意思是
byteBuffer.flip()
(就在调用wrap()之后)?似乎没有帮助。而且,如果我使用了错误的格式,我至少应该看到一些东西,对吗?不仅仅是一个黑色正方形?不确定是否是最佳的,但是当我通过BuffereImage加载图像时,我首先创建图像宽度*高度的int[]数组,然后使用img.getRGB(0,0,宽度,高度,数据,0,宽度)读取。然后,因为我加载的图像是ARGB格式的,所以我将alpha字节移到末尾,使其成为RGBA。然后我创建一个宽*高*4大小的字节缓冲区,设置ByteOrder.BIG_ENDIAN,然后执行buffer.asIntBuffer().put(数据)。最后我做了一个buffer.flip()。我使用glTexImage2D(GL_纹理_2D,0,GL_RGBA8,宽度,高度,0,GL_RGBA,GL_无符号_字节,缓冲区)创建图像;这真是太难看了,我最后做的就是这样。我只是迭代了所有x/y坐标,并将其更改为LWJGL直接接受的类型的数组。不过,我还是不明白为什么ByteByfer不能工作。在您将数据放入ByteByfer后,是否尝试翻转缓冲区以将其重置回可读状态?另一个问题,您确定要从光栅中检索的数据缓冲区的数据类型是3字节RGB格式吗?我猜您的意思是
byteBuffer.flip()
(就在调用wrap()之后)?似乎没有帮助。而且,如果我使用了错误的格式,我至少应该看到一些东西,对吗?不仅仅是一个黑色正方形?不确定是否是最佳的,但是当我通过BuffereImage加载图像时,我首先创建图像宽度*高度的int[]数组,然后使用img.getRGB(0,0,宽度,高度,数据,0,宽度)读取。然后,因为我加载的图像是ARGB格式的,所以我将alpha字节移到末尾,使其成为RGBA。然后我创建一个宽*高*4大小的字节缓冲区,设置ByteOrder.BIG_ENDIAN,然后执行buffer.asIntBuffer().put(数据)。最后我做了一个buffer.flip()。我使用glTexImage2D(GL_纹理_2D,0,GL_RGBA8,宽度,高度,0,GL_RGBA,GL_无符号_字节,缓冲区)创建图像;这真是太难看了,我最后做的就是这样。我只是迭代了所有x/y坐标,并将其更改为LWJGL直接接受的类型的数组。不过,我不明白为什么Bytebyfer不起作用。