LibGDX Texture to ByteBuffer

Shamrock picture Shamrock · Feb 24, 2013 · Viewed 7.2k times · Source

I am trying to convert a Texture to a Pixmap in LibGDX so I can get all of the pixel data into a ByteBuffer for some experiments, and from what I can tell, I should be able to do this by doing the following :

Pixmap pixmap = textureName.getTexture().getTextureData().consumePixmap();
ByteBuffer data = pixmap.getPixels();

This does seem to return a properly sized Pixmap, and the ByteBuffer does seem to be created just fine, but it is filled entirely with zeros, resulting in a blank, transparent image. This, and a couple other tests, lead me to believe that the Pixmap itself is simply being created as a fully transparent image like that, but I cannot find what may be causing that to happen. Is there some sort of limitation preventing this from working, or am I simply missing something obvious?

Answer

P.T. picture P.T. · Feb 25, 2013

I believe that API (consumePixmap()) is meant for the Texture class to extract data out of a Pixmap when pushing the Pixmap up to the GPU.
A Libgdx Texture object represents texture data on the GPU, so getting the underlying data to the CPU isn't generally trivial (its the "wrong" direction for a rendering API). See http://code.google.com/p/libgdx/wiki/GraphicsPixmap

Additionally, the documentation on consumePixmap() says it requires a prepare() call before it will work.

To extract pixel information from a texture, you build a FrameBuffer object, render the texture to it, and then extract the pixels (see ScreenUtils).

Its not clear what you're trying to accomplish, but going the other direction (byte array -> Pixmap -> Texture) and then modifying the byte array and re-doing the transformation might work.