2012-08-15 73 views
5

我很高興地使用LibGDX框架的SpriteBatch類。 我的目標是通過着色器修改精靈的表示。LibGDX SpriteBatch Multitexture可能嗎?

batch = new SpriteBatch(2, shaderProgram); 

我複製從SpriteBatch類的默認渲染,加上另一個 均勻採樣2D

+ "uniform sampler2D u_Texture2;\n"// 

有沒有一種工作方式給紋理着色器。 這樣做,allways結束了一個ClearColor屏幕。

batch.begin(); 
    texture2.bind(1); 
    shaderProgram.setUniformi("u_Texture2", 1); 
    batch.draw(spriteTexture,positions[0].x,positions[0].y); 
    batch.draw(spriteTexture,positions[1].x,positions[1].y); 
batch.end(); 

單獨使用每個紋理都可以。在網格類的幫助下手動繪製按預期工作。那麼我能做些什麼來使用SpriteBatch的便利?

THX for Help

回答

6

我猜這個問題與紋理綁定有關。 SpriteBatch asumes的活動紋理單元將是0,所以它對

lastTexture.bind();而不是lastTexture.bind(0);

問題一個電話是你給它的活躍單位爲1(如你在你的代碼中調用texture2.bind(1); )。所以,紋理單元0永遠不會被綁定,並且可能會導致黑屏。

例如,我會在draw調用之前添加一個Gdx.GL20.glActiveTexture(0);。我不太確定它會解決問題,但這是一個開始!

編輯: 我盡我所建議的解決方案,它的工作原理! :d。要更清楚,你應該這樣做:

 batch.begin(); 
     texture2.bind(1); 
     shaderProgram.setUniformi("u_Texture2", 1); 
     Gdx.gl.glActiveTexture(GL10.GL_TEXTURE0);//This is required by the SpriteBatch!! 
      //have the unit0 activated, so when it calls bind(), it has the desired effect. 
     batch.draw(spriteTexture,positions[0].x,positions[0].y); 
     batch.draw(spriteTexture,positions[1].x,positions[1].y); 
    batch.end(); 
+0

嘿最後我得到了答案,謝謝! 你說得對。這是類綁定紋理的原因。我需要說我已經制作了我自己的自定義SpriteBatch類。 SpriteBatch在渲染更大尺寸的Framebuffer紋理時也顯示了一些問題。我之前總是綁定TEXTURE0。這就是爲什麼我決定按照自己的方式去做。不太方便,但方式更靈活。現在我有一個Sprite Batch,它只處理頂點的生成。所有東西都可以用自己的着色器進行定製。 – fky 2012-09-07 16:20:09

+1

請注意,SpriteBatch只會生成頂點,如果您不小心,會遇到性能問題。 SpriteBatch本身有一些「可用性」問題,但這是一個設計決定。它旨在簡化最常見的繪圖操作,並以某種方式傷害靈活性。無論如何,我已經能夠解決目前爲止我遇到的大多數問題(大多數情況下,在使用之前啓用/禁用適當的opengl標誌)。也許今晚我會嘗試像你一樣實施多紋理,並讓你知道;) – 2012-09-07 17:33:18

+1

謝謝你的支持。它像你編輯的一樣工作。但是,我不喜歡它。這對我來說看起來很危險。我更喜歡我的專用版本,因爲它的體積更小,因此也更快,更好的調試。 SpriteBatch正在努力讓每個人都開心。在我看來,這不是真正的性能優化類。但無論如何,感謝您澄清SpriteBatch使用最後綁定紋理而不僅僅是TEXTURE0 – fky 2012-09-17 15:26:11