我想加载一个图像作为使用LWJGL库的openGL的纹理。从我发现到目前为止,我需要将纹理作为ByteBuffer传递给openGL。我现在所拥有的是一些正确加载图像的代码,并将其存储在BufferedImage对象中。问题是,我不知道如何从一个BufferedImage一个字节缓冲区,其中包含了使用正确的格式用OpenGL数据获取(作为函数GL11.glTexImage2D输入())。 非常感谢帮助!如何使用LWJGL加载用作openGL纹理的图像?
5
A
回答
6
下面是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;
}
1
当施加作为纹理是不正确的,这意味着,接受的解决方案可能不会产生相同的结果对各种图像I使用由Ron但是图像的颜色上述方案。
试图修复与色彩的问题,我试图用原来的BufferedImage
的ColorModel
,它可以通过调用BufferedImage#getColorModel
访问。但是,它给了我一个例外,原始图像的ColorModel
与WritableRaster
对象不兼容。
我找了一个解决方案,我发现this之一。我不使用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;
}
相关问题
- 1. 加载纹理LWJGL
- 2. LWJGL,openGL多纹理
- 3. 如何使用LWJGL加载图像
- 4. OpenCV图像加载OpenGL纹理
- 5. 使用OpenGL ES的Android纹理加载
- 6. 使用Cocoa将图像加载到OpenGL纹理
- 7. 使用ObjectLoader加载纹理(图像)
- 8. 使用OpenCV加载OpenGL纹理
- 9. 使用SDL加载OpenGL纹理
- 10. 使用Boost.GIL加载opengl纹理
- 11. 使用OpenGL中的auxDIBImageLoad将纹理加载为纹理
- 12. 加载图像(使用他们的RGB(A)的像素数据)的OpenGL纹理
- 13. Opengl 3.2:如何使用纹理图集?
- 14. LWJGL +光滑的纹理不加载
- 15. OpenGL ES:使用纹理:空白而不是纹理图像
- 16. 如何使用Qt的OpenGL类加载和绑定纹理?
- 17. 如何使用Haskell中的JuicyPixels库加载OpenGL纹理
- 18. Java - LWJGL加载纹理,仅加载我加载的最新纹理
- 19. 如何在openGL中使用背景图像的纹理
- 20. 奇怪的LWJGL/OpenGL缩放纹理
- 21. 使用slick-util库的LWJGL(OpenGL)中的纹理问题
- 22. 使用openGL,图像加载图像
- 23. 使用着色器生成倾斜图像的LWJGL纹理
- 24. 如何使用GL图像加载纹理?
- 25. 如何使用OpenGL ES将纹理加载到圆上
- 26. opengl es 2.0纹理加载
- 27. 加载多个纹理openGL
- 28. 使用OpenGL进行纹理颜色处理(在使用Java的LWJGL中)
- 29. 纹理不绑定在OpenGL(LWJGL/Slick-util)
- 30. 如何在THREE.js中将预加载的图像作为纹理使用
我已经想通了,谢谢:) 我只是标记答案为答复的努力 – Bartvbl 2011-04-23 10:04:19