2012-08-15 13 views
5

Chętnie używam klasy SpriteBatch z LibGDX Framework. Moim celem jest modyfikowanie reprezentacji ikonki za pomocą modułu cieniującego.Multitekstura LibGDX SpriteBatch jest możliwa?

batch = new SpriteBatch(2, shaderProgram); 

skopiowane domyślny shader z klasy SpriteBatch i dodaje inny jednolitego Sampler 2d

+ "uniform sampler2D u_Texture2;\n"// 

Czy istnieje sposób stara się dać tekstury do shadera. Postępując w ten sposób, zawsze kończy się na ekranie 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(); 

Każda tekstura działa. Ręczne rysowanie przy pomocy klasy Mesh działa zgodnie z oczekiwaniami. Więc co mogę zrobić, aby skorzystać z wygody SpriteBatch?

THX Pomocy

Odpowiedz

6

Chyba problem nie jest związany z wiązaniami tekstur. SpriteBatch asumes że aktywna jednostka tekstura będzie 0, co oznacza, że ​​wezwanie do

lastTexture.bind(); zamiast lastTexture.bind(0);

Problem polega na tym, że aktywna jednostka dajesz Jest 1 (jak nazywają texture2.bind(1); w kodzie). więc jednostka tekstury 0 nigdy nie jest związana i może to być przyczyną pustego ekranu.

Na przykład powinienem dodać Gdx.GL20.glActiveTexture(0); przed wywołaniami draw. Nie jestem pewien, czy rozwiąże to problem, ale to dopiero początek!

EDYCJA: Próbuję moje sugerowane rozwiązanie i działa! :RE. Aby być bardziej zrozumiałym, powinieneś to zrobić:

 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

hej wreszcie dostałem odpowiedź, dzięki! Masz rację. Jest to spowodowane sposobem, w jaki klasa wiąże teksturę. Muszę powiedzieć, że stworzyłem już własną niestandardową klasę SpriteBatch. SpriteBatch wykazał również pewne problemy z renderowaniem większych rozmiarów tekstur bufora ramki. I zawsze wiążę TEXTURE0 wcześniej. To dlatego postanowiłem zrobić to po swojemu. Mniej wygodna, ale bardziej elastyczna. Teraz mam Partię Sprite, która obsługuje tylko generowanie wierzchołków. Wszystko wokół można dostosować za pomocą własnych shaderów. – fky

+1

Należy pamiętać, że funkcja SpriteBatch wykonuje trochę więcej niż generowanie wierzchołków, jeśli nie jest to ostrożne, wystąpią problemy z wydajnością. Sam SpriteBatch ma pewne problemy z użytecznością, ale jest to decyzja projektowa. Ma to na celu uproszczenie najpowszechniejszych operacji rysowania i w jakiś sposób to boli elastyczność. W każdym razie udało mi się rozwiązać większość problemów, na które natknąłem się dotychczas (większość czasu włącza/wyłącza odpowiednie flagi OpenGL przed użyciem). Może dziś wieczorem spróbuję zaimplementować multiteksturę, tak jak ty, i dam ci znać;) –

+1

sry za spóźnienie i dzięki za wsparcie. Działa tak, jak edytowaliście. ALE, nie podoba mi się to. To dla mnie niebezpieczne. Preferuję moją wyspecjalizowaną wersję, która jest również szybsza i lepiej debugowalna z powodu jej mniejszego rozmiaru. SpriteBatch stara się uszczęśliwić wszystkich. W mojej opinii nie jest to klasa zoptymalizowana pod kątem wydajności. Ale w każdym razie, dzięki za wyjaśnienie, że SpriteBatch używa tekstury LAST BOUND, a nie tylko TEXTURE0 – fky

Powiązane problemy