2012-08-15 14 views
5

Uso felicemente la classe SpriteBatch di LibGDX Framework. Il mio obiettivo è modificare la rappresentazione dello sprite attraverso uno shader.LibGDX SpriteBatch Multitexture possibile?

batch = new SpriteBatch(2, shaderProgram); 

Ho copiato lo shader di default dalla Classe SpriteBatch e ha aggiunto un altro uniforme Sampler 2d

+ "uniform sampler2D u_Texture2;\n"// 

C'è un modo che lavora per dare la consistenza allo shader. In questo modo, finisce sempre in una schermata 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(); 

Ogni trama da sola funziona. Disegnare manualmente con l'aiuto della classe mesh funziona come previsto. Quindi, cosa posso fare per usare la convenienza di SpriteBatch?

THX per la Guida

risposta

6

Credo che il problema non è legato alla attacchi di texture. SpriteBatch asumes che l'unità di struttura attiva sarà 0, quindi effettua una chiamata a

lastTexture.bind(); invece di lastTexture.bind(0);

Il problema è che l'unità attiva si stanno dando è 1 (come si chiama texture2.bind(1); nel codice). quindi, l'unità di trama 0 non è mai vincolata e potrebbe essere la causa dello schermo vuoto.

Ad esempio, aggiungerei un Gdx.GL20.glActiveTexture(0); prima delle chiamate draw. Non sono abbastanza sicuro che risolverà il problema, ma è un inizio!

MODIFICA: Provo la soluzione suggerita e funziona! : D. Per essere più chiaro, si dovrebbe fare questo:

 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

hey finalmente ho ricevuto una risposta, grazie! Hai ragione. È la causa del modo in cui la classe lega la trama. Devo dire che ho già creato la mia SpriteBatch Class personalizzata. SpriteBatch ha mostrato anche alcuni problemi nel rendering delle trame Framebuffer di dimensioni maggiori. E lego sempre TEXTURE0 prima. Ecco perché ho deciso di farlo a modo mio. Meno conveniente ma molto più flessibile. Ora ho uno Sprite Batch che gestisce solo la generazione dei vertici. Tutto intorno può essere personalizzato con i propri shader. – fky

+1

Tieni presente che SpriteBatch fa un po 'di più che generare i vertici, se non stai attento, ti imbatterai in problemi di prestazioni. SpriteBatch stesso ha alcuni problemi di "usabilità", ma è una decisione di progettazione. Ha lo scopo di semplificare le operazioni di disegno più comuni e, in qualche modo, fa male la flessibilità. Ad ogni modo, sono stato in grado di risolvere la maggior parte dei problemi che ho incontrato fino ad ora (la maggior parte delle volte abilita/disabilita i flag opengl appropriati prima di usarlo). Forse stasera cercherò di implementare il multitexture come hai fatto tu e farti sapere;) –

+1

sry per essere di nuovo in ritardo e grazie per il tuo supporto. Funziona come hai modificato. MA, non mi piace. Questo mi sembra pericoloso per me. Preferisco la mia versione specializzata che è anche la causa più veloce e migliore debuggable delle sue dimensioni più piccole. SpriteBatch sta cercando di rendere tutti felici. A mio avviso, non è davvero una Classe ottimizzata per le prestazioni. Ma comunque, grazie per aver chiarito che SpriteBatch utilizza la trama LAST BOUND e non solo TEXTURE0 – fky