2011-09-26 30 views
30

¿Es posible renderizar texturas usando SpriteBatch en libGdx (motor Java para Android/Desktop)? Si es así, ¿cómo?libgdx SpriteBatch renderizar a la textura

Básicamente quiero renderizar todo en una región de 320 x 240 de una textura de 512 x 256 y en una región de escala para adaptarla a la pantalla (en modo horizontal). De esta forma, quiero eliminar los artefactos que ocurren cuando escalo las texturas alfa combinadas de forma independiente. Si hay alguna otra forma de eliminar dichos artefactos, indíquelos :)

¿Y hay alguna documentación en línea para libGdx?

+0

Estoy interesado en tal función. Sin embargo, después de echar un vistazo al código de 'SpriteBatch', no creo que sea trivial implementar tal característica, y que implicaría recompilar la biblioteca. Agregué algunas funciones a 'Pixmap' (en el lado nativo) en el pasado, pero esto parece más engorroso. – huff

Respuesta

59

Este fragmento me fue dado en el foro de LibGDX y funciona sin problemas.

private float m_fboScaler = 1.5f; 
private boolean m_fboEnabled = true; 
private FrameBuffer m_fbo = null; 
private TextureRegion m_fboRegion = null; 

public void render(SpriteBatch spriteBatch) 
{ 
    int width = Gdx.graphics.getWidth(); 
    int height = Gdx.graphics.getHeight(); 

    if(m_fboEnabled)  // enable or disable the supersampling 
    {     
     if(m_fbo == null) 
     { 
      // m_fboScaler increase or decrease the antialiasing quality 

      m_fbo = new FrameBuffer(Format.RGB565, (int)(width * m_fboScaler), (int)(height * m_fboScaler), false); 
      m_fboRegion = new TextureRegion(m_fbo.getColorBufferTexture()); 
      m_fboRegion.flip(false, true); 
     } 

     m_fbo.begin(); 
    } 

    // this is the main render function 
    my_render_impl(); 

    if(m_fbo != null) 
    { 
     m_fbo.end(); 

     spriteBatch.begin();   
     spriteBatch.draw(m_fboRegion, 0, 0, width, height);    
     spriteBatch.end(); 
    } 
} 
+3

Genial, gracias! – huff

+6

El punto de utilizar un TextureRegion envuelto alrededor del frame buffer por el bien de mantener la textura invertida es muy apreciado aquí. Los recién llegados toman nota. –

+0

Tengo algunos problemas al implementar esto: http://i.gyazo.com/7329707597bf94974dfd76fc1f33285d.gif Si dibujo mi spriteBatch, todo se ve bien, pero cuando intento capturar cosas en un FBO, tengo problemas con el FBO dibujando todo lo que previamente se había renderizado también. ¿Algunas ideas? – Daryl

3

Por el momento, le recomendaría que use Pixmap s. Como ve, no hay muchas funciones escritas para ellos, pero aparentemente puede escribir un Pixmap (con canal alfa) en otro (pm1.drawPixmap(pm2, srcx, srcy, w, h, ...)), siempre que no desee escalarlo (puede escalar la composición más adelante, pero la proporción de las imágenes utilizadas en la composición no se redimensionará ... a menos que escriba una función de cambio de tamaño).

Si usted quiere hacer cosas más complejas (como escribir una cadena usando un BitmapFont en un Texture para la manipulación posterior, o escribiéndolo en una Pixmap y luego subirlo a la memoria de vídeo), entonces ... entonces dime si tienes éxito (ya que quiero ir en esa dirección para optimizar). Creo que lo mejor sería agregar las funciones necesarias a libgdx ...

De todos modos, no tome nada de lo que escribí aquí como una verdad innegable: si voy más allá, lo actualizaré.

La documentación que encontré es algo limitada -Estoy seguro de que ya la has superado. Hay información en el blog de badlogic y en la página del proyecto de googlecode, y también hay un libro relativamente bueno escrito por Mario, "Beginning Android Games". Además, hay algunos videos (muy básicos). Y no se olvide que usted puede consultar la fuente y los bellos ejemplos ...

Además, siempre se puede pedir en el foro: http://badlogicgames.com/forum/

ACTUALIZACIÓN: Su respuesta utilizando el FrameBuffer y TextureRegion es sin lugar a dudas mucho mejor. Dejo este solo porque menciona la documentación.

Cuestiones relacionadas