2012-08-15 38 views
5

Estoy felizmente usando la clase SpriteBatch de LibGDX Framework. Mi objetivo es modificar la representación del sprite a través de un sombreador.LibGDX SpriteBatch Multitexture posible?

batch = new SpriteBatch(2, shaderProgram); 

Copié el sombreado por defecto de la clase SpriteBatch y ha añadido otra Sampler uniforme 2d

+ "uniform sampler2D u_Texture2;\n"// 

¿Hay una manera de trabajar para dar la textura al sombreado. Haciéndolo así, siempre termina en una pantalla 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(); 

Cada textura solo está funcionando. Dibujar manualmente con la ayuda de Mesh Class funciona como se esperaba. Entonces, ¿qué puedo hacer para utilizar la conveniencia de SpriteBatch?

THX para Ayuda

Respuesta

6

Supongo que el problema no está relacionado con los enlaces de textura. SpriteBatch asumes que la unidad de textura activo será 0, por lo que hace un llamado a

lastTexture.bind(); en lugar de lastTexture.bind(0);

El problema es que la unidad activa que está dando es 1 (como se llama a texture2.bind(1); en su código) entonces, la unidad de textura 0 nunca está ligada, y puede ser que eso esté causando la pantalla en blanco.

Por ejemplo, agregaría un Gdx.GL20.glActiveTexture(0); antes de las llamadas draw. No estoy seguro de que vaya a resolver el problema, ¡pero es un comienzo!

EDIT: ¡Intento mi solución sugerida y funciona! :RE. Para ser más claro, deberías estar haciendo esto:

 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

¡Hola, finalmente recibí una respuesta, gracias! Tienes razón. Es la causa de la forma en que la clase ata la textura. Debo decir que ya hice mi propia Clase de SpriteBatch personalizada. SpriteBatch también ha mostrado algunos problemas al renderizar texturas Framebuffer de mayor tamaño. Y siempre ato TEXTURE0 antes. Por eso decidí hacerlo a mi manera. Menos conveniente pero mucho más flexible. Ahora tengo un lote de Sprite que maneja solo la generación de los vértices. Todo alrededor se puede personalizar con sombreadores propios. – fky

+1

Tenga en cuenta que SpriteBatch hace un poco más que generar los vértices, si no tiene cuidado se encontrará con problemas de rendimiento. SpriteBatch tiene algunos problemas de 'usabilidad', pero es una decisión de diseño. Su intención es simplificar las operaciones de dibujo más comunes, y de alguna manera eso perjudica la flexibilidad. De todos modos, he podido resolver la mayoría de los problemas que encontré hasta ahora (la mayoría de las veces está habilitando/deshabilitando indicadores OpenGL apropiados antes de usarlo). Tal vez esta noche trate de implementar multitexture como lo hizo y le deje saber;) –

+1

sry por llegar tarde otra vez y gracias por su apoyo. Funciona como editó. PERO, no me gusta. Esto parece algo peligroso para mí. Prefiero mi versión especializada que también es más rápida y mejor debido a su menor tamaño de depuración. SpriteBatch está tratando de hacer felices a todos. En mi opinión, no es realmente una clase optimizada para el rendimiento. Pero de todos modos, gracias por dejar claro que SpriteBatch está usando textura LAST BOUND y no solo TEXTURE0 – fky