2012-08-15 4 views
5

Я с радостью использую класс SpriteBatch для платформы LibGDX. Моя цель - изменить представление спрайта через шейдер.LibGDX SpriteBatch Возможно использование нескольких меток?

batch = new SpriteBatch(2, shaderProgram); 

Я скопировал шейдер по умолчанию из класса SpriteBatch и добавил еще один единообразного Sampler 2d

+ "uniform sampler2D u_Texture2;\n"// 

Есть ли рабочий способ придать текстуру в затенение. Выполнение этого так, всегда заканчивается на экране 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(); 

Работает только одна текстура. Рисование вручную с помощью класса Mesh работает так, как ожидалось. Итак, что я могу сделать, чтобы использовать удобство SpriteBatch?

THX за помощью

ответ

6

Я предполагаю, что проблема существует связано с креплениями текстуры. SpriteBatch asumes, что активный блок текстура будет 0, так что это делает вызов

lastTexture.bind(); вместо lastTexture.bind(0);

Проблема в том, что активный блок, вы даете это 1 (как вы называете texture2.bind(1); в вашем коде). поэтому блок текстуры 0 никогда не связан, и может быть, что вызывает пустой экран.

Например, я бы добавил Gdx.GL20.glActiveTexture(0); перед вызовами draw. Я не совсем уверен, что это решит проблему, но это начало!

EDIT: Я пробую свое предложенное решение, и оно работает! : 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 раньше. Вот почему я решил сделать это по-своему. Менее удобный, но более гибкий. Теперь у меня есть пакет спрайтов, который обрабатывает только генерацию вершин. Все arround можно настроить с помощью собственных шейдеров. – fky

+1

Помните, что SpriteBatch делает немного больше, чем генерирование вершин, если вы не будете осторожны, вы столкнетесь с проблемами производительности. У самого SpriteBatch есть некоторые проблемы «удобства использования», но это дизайнерское решение. Он предназначен для упрощения самых распространенных операций рисования и, как-то, что ущемляет гибкость. Во всяком случае, я смог решить большинство проблем, с которыми я столкнулся до сих пор (в большинстве случаев он включает/отключает соответствующие флажки opengl перед его использованием). Может быть, сегодня вечером я попытаюсь реализовать мультитекстури, как вы это делали, и сообщит вам об этом;) –

+1

sry за опоздание и спасибо за вашу поддержку. Он работает так, как вы его редактировали. НО, мне это не нравится. Это выглядит для меня опасным. Я предпочитаю свою специализированную версию, которая также быстрее и лучше отлаживается из-за ее меньшего размера. SpriteBatch пытается сделать всех счастливыми. На мой взгляд, это не действительно оптимизированный по производительности класс. Но в любом случае, спасибо за то, что ясно, что SpriteBatch использует текстуру LAST BOUND, а не только TEXTURE0 – fky

Смежные вопросы