Shaders con varias texturas en OpenGL ES 2.0

Buenas, estoy iniciándome con opengl es 2.0, mediante libglx en vistas de usarlo en Android, pero soy un poco zoquete... Al menos hasta que un amigo me deje un libro cuando vuelva de las vacaciones... No encuentro mucha información, aunque creo que el problema es que no la sé buscar.

Bueno, lo que quiero hacer. Tengo 2 texturas, estas 2:

Imagen

Quiero dibujarlas a la vez en el mismo shader (creo que esto no es descabellado), pintando cada una de un color. Es decir, obtener algo así:

Imagen

Pero lo que obtengo es esto (ignorad la forma, he puesto la textura en un "soft body" y tengo que ajustarla):

Imagen

No sé si el problema lo tengo sólo en el shader, o tengo que activar alguna opción de blending (imagino que sí, porque parecer que ignora la transparencia). En fin, pongo lo que he hecho a ver si alguien sabe ayudarme.

En la función de dibujado:
base_texture.bind(0);
spots_texture.bind(1);

shader.begin();
shader.setUniformi("base_texture", 0);
shader.setUniformi("spots_texture", 1);
shader.setUniformf("base_color", new Color(255, 0, 0, 255));
shader.setUniformf("spots_color", new Color(0, 255, 0, 255));
mesh.render(shader, GL20.GL_TRIANGLE_FAN);
shader.end();


El vertex shader, aunque aquí creo que no tiene que ver:
attribute vec4 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;

void main()
{
   v_texCoord = a_texCoord;
   gl_Position = a_position;
}


Y el fragment shader:
#ifdef GL_ES
precision mediump float;
#endif

varying vec2 v_texCoord;

uniform sampler2D base_texture;
uniform sampler2D spots_texture;
uniform vec4 base_color;
uniform vec4 spots_color;

void main()
{
   gl_FragColor = base_color * texture2D(base_texture, v_texCoord) + spots_color * texture2D(spots_texture, v_texCoord);
}


Si alguien sabe algo o dónde buscar información, se lo agradeceré eternamente, llevo horas atascado.


Edito

Bueno, lo tengo medio solucionado. He cambiado el fragment shader por esto (que me parece rebuscado, pero es lo único que se me ha ocurrido, tiene que haber una forma mejor):

#ifdef GL_ES
precision mediump float;
#endif

varying vec2 v_texCoord;

uniform sampler2D base_texture;
uniform sampler2D spots_texture;
uniform vec4 base_color;
uniform vec4 spots_color;

void main()
{
   vec4 base_pixel = texture2D(base_texture, v_texCoord);
   vec4 spots_pixel = texture2D(spots_texture, v_texCoord);
   
   gl_FragColor = base_pixel*base_color*vec4(base_pixel.a-spots_pixel.a) + spots_pixel*spots_color*vec4(spots_pixel.a);
}


Así maneja las transparencias de las 2 texturas, el problema es que donde las 2 texturas son transparentes queda negro en vez de transparente, pero bueno, algo es algo.

Imagen

A ver si me dejan el libro pronto porque si no lo llevo claro :P
Mira si algo de aquí te vale tiene sobre API OpenGL y sobre Shaders, el módulo 2 programación gráfica.
http://cedv.morcy.es/index.php?sec=material
En efecto, me faltaba activar el blending:

Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);


luciferfran escribió:Mira si algo de aquí te vale tiene sobre API OpenGL y sobre Shaders, el módulo 2 programación gráfica.
http://cedv.morcy.es/index.php?sec=material


Muchas gracias, lo miraré, tiene buena pinta.

Edito:

Por si a alguien le hiciera falta, para tener 2 texturas coloreadas una encima de la otra:

#ifdef GL_ES
precision mediump float;
#endif

varying vec2 v_texCoord;

uniform sampler2D base_texture;
uniform sampler2D spots_texture;
uniform vec4 base_color;
uniform vec4 spots_color;

void main(){
   vec4 base_pixel = texture2D(base_texture, v_texCoord) * base_color;
   vec4 spots_pixel = texture2D(spots_texture, v_texCoord) * spots_color;
   
   gl_FragColor = mix(base_pixel, spots_pixel, spots_pixel.a);
}
2 respuestas