2013-06-22 9 views
0

Я знаю, что немного опережаю libgdx, потому что это на самом деле больше 2D-библиотека, но я работаю над 3D-приложением, основанным на libgdx, и мне нужно написать текст на модели.libgdx написать текст на текстуре

Я уже зашел так далеко, что я могу динамически менять текстуру моей модели. Теперь мне нужно написать текст текстуры, чтобы применить эту текстуру к моей модели ... Возможно ли это с помощью libgdx? Если да, то как? До сих пор я нашел только учебники, как писать текст на экране остроумие BitmapFont, но только через SpriteBatch, и я не думаю, что будет возможность записать вывод SpriteBatch на текстуру ...

Заранее спасибо !

ответ

0

Вы можете отправить вывод SpriteBatch (или любой команды рисования OpenGL) в текстуру вместо отправки на экран. В Libgdx вы используете FrameBuffer object, чтобы выполнить это. Этот учебник охватывает основы и немного больше: https://github.com/mattdesl/lwjgl-basics/wiki/FrameBufferObjects

+0

Я думаю, что это работает ... На самом деле моя полная модель становится черной ... Есть ли способ проверить, как выглядит текстура с написанным текстом? Потому что я кое-что прочитал о проблемах с размером текста ... Может быть, это просто написано на большой ... –

+0

Хорошо, должна быть еще одна проблема. В целях тестирования я устанавливаю цвет BitmapFont после того, как новый битмапФонт() будет красным, а цвет spritebatch - синим перед batch.begin(), но модель останется черной. Если текстура будет содержать шрифт, модель не станет красной? –

+0

Также невозможно получить Pixmap и записать байты в файл ... Я всегда получаю «Pixmap уже настроенный» -Error, независимо от того, пытаюсь ли я получить его до или после FrameBuffer или SpriteBatch .end() –

0

С обычными растровыми шрифтами вы получаете pixmap ВСЕГО Glpths и можете делать растровые копии.

pixmap.drawPixmap(fontPixmap, x_place, (TILE_HEIGHT - aGlyph.height)/2, 
aGlyph.srcX, aGlyph.srcY, aGlyph.width, aGlyph.height); 

The only way (I have found) of drawing raster fonts (`.ttf`) is as follows: 

    Example framework: 
    ================== 
    package com.badlogic.gdx.tests.bullet; 

    /** 
    Question  : libgdx write text on texture 
    interpreted as : In libgdx, how to create dynamic texture? 
    Answer   : Use a private render function to draw in a private frame buffer and convert the frame buffer to Pixmap, create Texture. 
    Author : Jon Goodwin 
    **/ 

    import com.badlogic.gdx.graphics.Texture; 
    import com.badlogic.gdx.graphics.Pixmap; 
    ...//(ctrl-shift-o) to auto-load imports in Eclipse 


    public class BaseBulletTest extends BulletTest 
    { 
    //class variables 
    ================= 
    public Texture   texture  = null;//create this 
    public Array<Disposable> disposables = new Array<Disposable>(); 
    public Pixmap   pm   = null; 
    //--------------------------- 
     @Override 
     public void create() 
     { 
      init(); 
     } 
    //--------------------------- 
     public static void init() 
     { 
      if(texture == null) texture(Color.BLUE, Color.WHITE); 
      TextureAttribute ta_tex  = TextureAttribute.createDiffuse(texture); 
      final Material material_box = new Material(ta_tex, ColorAttribute.createSpecular(1, 1, 1, 1), 
                 FloatAttribute.createShininess(8f)); 
      final long attributes1  = Usage.Position | Usage.Normal | Usage.TextureCoordinates; 
      final Model boxModel = modelBuilder.createBox(1f, 1f, 1f, material_box, attributes1); 
      ... 
     } 
    //--------------------------- 
     public Texture texture(Color fg_color, Color bg_color) 
     { 
      Pixmap pm = render(fg_color, bg_color); 
      texture = new Texture(pm);//***here's your new dynamic texture*** 
      disposables.add(texture);//store the texture 
     } 
    //--------------------------- 
     public Pixmap render(Color fg_color, Color bg_color) 
     { 
      int width = Gdx.graphics.getWidth(); 
      int height = Gdx.graphics.getHeight(); 

      SpriteBatch spriteBatch = new SpriteBatch(); 

      m_fbo = new FrameBuffer(Format.RGB565, (int)(width * m_fboScaler), (int)(height * m_fboScaler), false); 
      m_fbo.begin(); 
      Gdx.gl.glClearColor(bg_color.r, bg_color.g, bg_color.b, bg_color.a); 
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
      Matrix4 normalProjection = new Matrix4().setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
      spriteBatch.setProjectionMatrix(normalProjection); 

      spriteBatch.begin(); 
      spriteBatch.setColor(fg_color); 
      //do some drawing ***here's where you draw your dynamic texture*** 
      font.draw(spriteBatch, "5\n6\n2016", width/4, height - 20);//multi-line draw 
      ... 
      spriteBatch.end();//finish write to buffer 

      pm = ScreenUtils.getFrameBufferPixmap(0, 0, (int) width, (int) height);//write frame buffer to Pixmap 

      m_fbo.end(); 
    //  pm.dispose(); 
    //  flipped.dispose(); 
    //  tx.dispose(); 
      m_fbo.dispose(); 
      m_fbo = null; 
      spriteBatch.dispose(); 
    //  return texture; 
      return pm; 
     } 
    //--------------------------- 
    }//class BaseBulletTest 
    //---------------------------