如何使用LWJGL加载图像以用作openGL纹理?

我正在尝试使用LWJGL库将图像作为openGL的纹理加载。 从我到目前为止发现的,我需要将纹理作为ByteBuffer传递给openGL。 我现在所拥有的是一些正确加载图像的代码,并将其存储在BufferedImage对象中。 问题是,我不知道如何从BufferedImage到包含正确格式的数据的ByteBuffer,以便与openGL一起使用(作为函数GL11.glTexImage2D()的输入)。 非常感谢帮助!

这是Space Invaders示例中的一个方法,可以满足您的需求。 (我认为)

/** * Convert the buffered image to a texture */ private ByteBuffer convertImageData(BufferedImage bufferedImage) { ByteBuffer imageBuffer; WritableRaster raster; BufferedImage texImage; ColorModel glAlphaColorModel = new ComponentColorModel(ColorSpace .getInstance(ColorSpace.CS_sRGB), new int[] { 8, 8, 8, 8 }, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, bufferedImage.getWidth(), bufferedImage.getHeight(), 4, null); texImage = new BufferedImage(glAlphaColorModel, raster, true, new Hashtable()); // copy the source image into the produced image Graphics g = texImage.getGraphics(); g.setColor(new Color(0f, 0f, 0f, 0f)); g.fillRect(0, 0, 256, 256); g.drawImage(bufferedImage, 0, 0, null); // build a byte buffer from the temporary image // that be used by OpenGL to produce a texture. byte[] data = ((DataBufferByte) texImage.getRaster().getDataBuffer()) .getData(); imageBuffer = ByteBuffer.allocateDirect(data.length); imageBuffer.order(ByteOrder.nativeOrder()); imageBuffer.put(data, 0, data.length); imageBuffer.flip(); return imageBuffer; } 

我使用Ron上面的解决方案但是当作为纹理应用时图像的颜色是不正确的,这意味着,所接受的解决方案可能不会对所有类型的图像产生相同的结果。

试图用颜色修复问题,我尝试使用原始BufferedImageColorModel ,可以通过调用BufferedImage#getColorModel来访问它。 但是,它给了我一个例外,原始图像的ColorModelWritableRaster对象不兼容。

我找到了解决方案,我找到了这个 。 我没有调用Raster.createInterleavedRaster来创建WritableRaster ,而是使用了ColorModel#createCompatibleWritableRaster

希望这可以帮助。 这是代码:

 public static ByteBuffer load(BufferedImage bufferedImage) { WritableRaster raster = bufferedImage.getColorModel().createCompatibleWritableRaster (bufferedImage.getWidth(), bufferedImage.getHeight()); BufferedImage textureImage = new BufferedImage(bufferedImage.getColorModel(), raster, true, new Hashtable<>()); Graphics graphics = textureImage.getGraphics(); graphics.setColor(new Color(0, 0, 0)); graphics.fillRect(0, 0, 256, 256); graphics.drawImage(bufferedImage, 0, 0, null); byte[] data = ((DataBufferByte) textureImage.getRaster().getDataBuffer()).getData(); ByteBuffer imageBuffer = ByteBuffer.allocate(data.length); imageBuffer.order(ByteOrder.nativeOrder()); imageBuffer.put(data, 0, data.length); imageBuffer.flip(); return imageBuffer; }