2012-08-15 9 views
5

Ich bin glücklich mit der SpriteBatch-Klasse des LibGDX Framework. Mein Ziel ist es, die Darstellung des Sprites durch einen Shader zu ändern.LibGDX SpriteBatch Multitexture möglich?

batch = new SpriteBatch(2, shaderProgram); 

Ich kopierte den Standard Shader aus der Spritebatch-Klasse und hat eine andere Uniform Sampler 2d

+ "uniform sampler2D u_Texture2;\n"// 

Gibt es eine funktionierende Weg, um die Textur auf den Shader zu geben. So geht es immer in einem ClearColor-Bildschirm.

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(); 

Jede Textur allein funktioniert. Das manuelle Zeichnen mit Hilfe der Mesh-Klasse funktioniert wie erwartet. Was kann ich tun, um den Komfort von SpriteBatch zu nutzen?

THX für Hilfe

Antwort

6

ich das Problem denke, es ist in Bezug auf Textur Bindungen. Spritebatch asumes, dass die aktive Textureinheit 0 sein wird, so ist es ein Aufruf an

lastTexture.bind(); statt lastTexture.bind(0);

Das Problem ist, dass die aktive Einheit Sie es geben 1 ist (wie Sie texture2.bind(1); in Ihrem Code aufrufen). Die Textureinheit 0 wird also niemals gebunden, und dies kann den leeren Bildschirm verursachen.

Zum Beispiel würde ich eine Gdx.GL20.glActiveTexture(0); vor der draw Anrufe hinzufügen. Ich bin mir nicht ganz sicher, ob es das Problem lösen wird, aber es ist ein Anfang!

EDIT: Ich versuche meine vorgeschlagene Lösung und es funktioniert! : D. Um klarer zu sein, sollten Sie das tun:

 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 endlich bekam ich eine Antwort, danke! Sie haben Recht. Es ist der Grund dafür, wie die Klasse die Textur bindet. Ich muss sagen, dass ich bereits meine eigene SpriteBatch Klasse daraus gemacht habe. SpriteBatch hat auch einige Probleme beim Rendern von größeren Framebuffer-Texturen gezeigt. Und ich bin immer TEXTURE0 vorher binden. Deshalb habe ich beschlossen, es auf meine Art zu tun. Weniger praktisch, aber viel flexibler. Jetzt habe ich einen Sprite Batch, der nur die Generierung der Vertices behandelt. Alles kann mit eigenen Shadern angepasst werden. – fky

+1

Beachten Sie, dass SpriteBatch ein wenig mehr als das Generieren der Vertices ausführt. Wenn Sie nicht vorsichtig sind, treten Leistungsprobleme auf. SpriteBatch selbst hat einige Usability-Probleme, aber es ist eine Designentscheidung. Es soll die gebräuchlichsten Zeichenoperationen vereinfachen, und irgendwie schadet das der Flexibilität. Wie auch immer, ich war in der Lage, die meisten der Probleme zu lösen, die ich bisher kennengelernt habe (in den meisten Fällen aktiviert/deaktiviert es entsprechende OpenGL-Flags, bevor es verwendet wird). Vielleicht werde ich heute Nacht versuchen, Multitextur zu implementieren, wie du es getan hast, und dich wissen lassen;) –

+1

sry, dass du wieder zu spät bist und Danke für deine Unterstützung. Es funktioniert so, wie du es bearbeitet hast. ABER, ich mag es nicht. Das sieht irgendwie gefährlich für mich aus. Ich bevorzuge meine spezialisierte Version, die wegen ihrer kleineren Größe auch schneller und besser debuggbar ist. SpriteBatch versucht, alle glücklich zu machen. Es ist meiner Meinung nach keine wirklich leistungsoptimierte Klasse. Aber wie auch immer, danke, dass SpriteBatch LAST BOUND Textur verwendet und nicht nur TEXTURE0 – fky

Verwandte Themen