2015-08-09 39 views
0

嗨,我需要創建一個由覆蓋其他紋理組成的紋理。我試過使用pixmap,但它很慢。這個想法是創建一個對話框的「快照」,這樣它就可以在顯示和解除時動畫。請幫助libgdx在運行時生成紋理

這是我使用的代碼:我已經使用幀緩衝如下試圖

texture_dialog.getTextureData().prepare(); 
Pixmap pm1 = texture_dialog.getTextureData().consumePixmap(); 
btn_ok.getTexture().getTextureData().prepare(); 
Pixmap pm = btn_ok.getTexture().getTextureData().consumePixmap(); 
pm1.drawPixmap(pm, pm1.getWidth()/2 - pm.getWidth()/2, pm1.getHeight() - pm.getHeight() - 52); 
textureSnapShot = new Texture(pm1, true); 
pm1.dispose(); 
pm.dispose(); 

textureSnapShot.setFilter(TextureFilter.MipMapLinearLinear, TextureFilter.MipMapLinearLinear); 
spriteSnapShot = new Sprite(textureSnapShot); 

SpriteBatch sb = new SpriteBatch(); 
sb.setProjectionMatrix(camera.combined); 
FrameBuffer fbo = new FrameBuffer(Format.RGBA8888, texture_dialog.getWidth(), texture_dialog.getHeight(), false); 

fbo.begin(); 
sb.begin(); 
sb.draw(texture_dialog, 0, 0); 
sb.draw(btn_ok.getTexture(), texture_dialog.getWidth()/2 - btn_ok.getWidth()/2, 52); 
sb.end(); 
fbo.end(); 
sb.dispose(); 
textureSnapShot = fbo.getColorBufferTexture(); 

//textureSnapShot.setFilter(TextureFilter.MipMapLinearLinear, TextureFilter.MipMapLinearLinear); 
spriteSnapShot = new Sprite(textureSnapShot); 

結果如下: http://medialinestudio.co.za/screens.png

Left:Pixmap Right:FrameBuffer

Pixmap具有正確的結果,但速度太慢。 FrameBuffer速度更快但結果不正確

+0

查找到幀緩衝(一個libgdx類)。 – Tenfour04

+0

通過快照你的意思是截圖? 爲更快的表現我們runOnUiThread()程序 我不完全記得的程序,但我的意思是在somw其他線程dod快照 –

+0

它看起來像你試圖解決錯誤的問題。您不需要快照/ fbo/pixmap來爲對話框設置動畫效果。讓對話動畫,包括它所擁有的任何孩子。假設您使用的是對話框小部件,那麼這已經是默認行爲。否則,如果你喜歡,你可以加入一個羣組演員。 – Xoppa

回答

0

FBO絕對是您應該使用的。

閱讀這篇文章:libgdx SpriteBatch render to texture

你缺少的是:

  • 創建正確的寬度/高度和位置的攝像頭,以適應FBO視口(0,0,寬度,高度內繪圖)
  • 翻轉輸出紋理(m_fboRegion.flip(假,真))
+0

我正在使用當我設置投影矩陣合併時,生成的圖像被壓扁另一個與fbo有關的問題是,當在幀緩衝區的基礎紋理上將mipmap設置爲true時,產生空白紋理 – user5207217

+0

Fbo還需要重新創建紋理pixmap比較慢,但肯定不那麼麻煩 – user5207217

+0

我認爲你應該閱讀更多關於FBO的教程:你的矩陣設置可能是錯誤的,使用mipmap需要更多的工作和渲染紋理FBO有固定大小,所以你需要重新創建,如果你的紋理尺寸必須改變。 –