2013-02-24 2 views
4

Я пытаюсь преобразовать текстуру в Pixmap в LibGDX, поэтому я могу получить все данные пикселов в ByteBuffer для некоторых экспериментов, и из того, что я могу сказать, я должен быть в состоянии сделать это выполнив следующие действия:LibGDX Texture to ByteBuffer

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

Это, кажется, возвращают правильно подобранного PIXMAP и ByteBuffer, похоже, будет создан только штраф, но она полностью заполняться нулями, в результате чего чистый, прозрачный образ. Это и еще несколько тестов привели меня к мысли, что сам Pixmap просто создается как полностью прозрачный образ, но я не могу найти, что может быть причиной этого. Есть ли какие-то ограничения, препятствующие этому работать, или я просто пропускаю что-то очевидное?

ответ

7

Я считаю, что API (consumePixmap()) предназначен для класса Texture для извлечения данных из Pixmap при нажатии Pixmap на GPU.
Объект Libgdx Texture представляет данные текстуры на графическом процессоре, поэтому получение базовых данных в CPU обычно не является тривиальным (это «неправильное» направление для API визуализации). См. http://code.google.com/p/libgdx/wiki/GraphicsPixmap

Кроме того, в документации по адресу consumePixmap() указано, что он requires a prepare() call, прежде чем он будет работать.

Чтобы извлечь информацию о пикселях из текстуры, вы создаете объект FrameBuffer, визуализируете его текстуру и извлекаете пиксели (см. ScreenUtils).

Непонятно, что вы пытаетесь выполнить, но переходите в другое направление (массив байтов ->Pixmap ->Texture), а затем может быть изменен массив байтов и повторное выполнение преобразования.

+0

Текстура создается пользователем в приложении в простом графическом интерфейсе, поэтому у меня нет данных перед началом работы. Если бы я мог извлечь информацию из FrameBuffer, которую я использую, чтобы создать текстуру, которая была бы идеальной, однако у меня создалось впечатление, что вы можете сделать это только из стандартного FrameBuffer, который рисует на экране. В моем случае текстура может выйти за пределы разрешения экрана, поэтому она отключит или исказит изображение, идущее по этому маршруту. К сожалению, использование самих Pixmaps для чертежа также не является вариантом. – Shamrock

7

У меня возникла аналогичная проблема, когда я хотел создать PNG уровня, созданного в моем редакторе уровней. Уровень выполнен из плиток, размещаемых создателем, тогда весь уровень сохраняется как .png, который будет использоваться в игре.

Решает это так, как П.Т. объясняет. Я надеюсь, что это полезно для других, которые сталкиваются с той же проблемой.

И в вашей конфигурации приложения: cfg.useGL20 = true; GL20 требуется, чтобы быть в состоянии построить фреймбуфера

 public boolean exportLevel(){ 

      //width and height in pixels 
      int width = (int)lba.getPrefWidth(); 
      int height = (int)lba.getPrefHeight(); 

      //Create a SpriteBatch to handle the drawing. 
      SpriteBatch sb = new SpriteBatch(); 

      //Set the projection matrix for the SpriteBatch. 
      Matrix4 projectionMatrix = new Matrix4(); 

      //because Pixmap has its origin on the topleft and everything else in LibGDX has the origin left bottom 
      //we flip the projection matrix on y and move it -height. So it will end up side up in the .png 
      projectionMatrix.setToOrtho2D(0, -height, width, height).scale(1,-1,1); 

      //Set the projection matrix on the SpriteBatch 
      sb.setProjectionMatrix(projectionMatrix); 

      //Create a frame buffer. 
      FrameBuffer fb = new FrameBuffer(Pixmap.Format.RGBA8888, width, height, false); 

      //Call begin(). So all next drawing will go to the new FrameBuffer. 
      fb.begin(); 

      //Set up the SpriteBatch for drawing. 
      sb.begin(); 

      //Draw all the tiles. 
      BuildTileActor[][] btada = lba.getTiles(); 
      for(BuildTileActor[] btaa: btada){ 
       for(BuildTileActor bta: btaa){ 
        bta.drawTileOnly(sb); 
       } 
      } 

      //End drawing on the SpriteBatch. This will flush() any sprites remaining to be drawn as well. 
      sb.end(); 

      //Then retrieve the Pixmap from the buffer. 
      Pixmap pm = ScreenUtils.getFrameBufferPixmap(0, 0, width, height); 

      //Close the FrameBuffer. Rendering will resume to the normal buffer. 
      fb.end(); 

      //Save the pixmap as png to the disk. 
      FileHandle levelTexture = Gdx.files.local("levelTexture.png"); 
      PixmapIO.writePNG(levelTexture, pm); 

      //Dispose of the resources. 
      fb.dispose(); 
      sb.dispose(); 

Примечания: Я новичок в LibGDX так что это не может быть опрятным способом сделать это.

+0

Это именно то, что я искал. Спасибо Тост. – LukTar

 Смежные вопросы

  • Нет связанных вопросов^_^