Appliquer un shader sur un sprite Batch
Bonjour,
Je programme un jeu avec libGDX. Je souhaite rendre tous les pixels d'un sprite en blanc (un peu comme le flash du L-cancel dans Project M). Le premier problème c'est que la fonction Sprite.setColor(Color.WHITE) ne le met pas en blanc mais enlève toutes applications de couleur.
J'ai un peu recherché et je suis tombé sur les fameux shaders.
Voici le fichier vs :
Code:
1 2 3 4 5 6 7 8 9 10
|
attribute vec4 a_position;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
void main()
{
v_texCoords = a_texCoord0;
gl_Position = u_projTrans * a_position;
} |
et voici le fichier fs :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
#ifdef GL_ES
precision lowp float; //since the only value we're storing is part of a color
#endif
varying vec2 v_texCoords;
uniform sampler2D u_texture;
void main()
{
float alpha = texture2D(u_texture, v_texCoords).a;
gl_FragColor = vec4(1.0, 1.0, 1.0, alpha);
} |
J'ai d'abord initialisé le vertex et le fragment shader avec ces trois lignes (GameManager étant ma classe principale du jeu) :
Code:
1 2 3 4 5 6
|
ShaderProgram.pedantic = false;
GameManager.defaultShader = SpriteBatch.createDefaultShader();
GameManager.shaderWhiteTexture = new ShaderProgram(Gdx.files.internal("vertexShader.vs").readString(),Gdx.files.internal("fragShader.fs").readString()); |
ensuite lorsque j'applique shaderWhiteTexture à mon spritebatch, il ne le met pas en blanc mais en transparent....
Pourtant, il me semble que la ligne de code
Code:
gl_FragColor = vec4(1.0, 1.0, 1.0, alpha);
met en blanc les pixels... Je ne comprends pas.
J'appelle donc à votre aide!
:help:
1 pièce(s) jointe(s)
Enfin! J'ai trouvé ce que je voulais!
Suite à quelques bidouillages, j'ai changé le vertex shader
Avant c'était comme ça le code :
Code:
1 2 3 4 5 6 7 8 9 10
|
attribute vec4 a_position;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
void main()
{
v_texCoords = a_texCoord0;
gl_Position = u_projTrans * a_position;
} |
Et maintenant c'est :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
varying vec4 v_color;
varying vec2 v_texCoords;
void main() {
v_color = a_color;
v_texCoords = a_texCoord0;
gl_Position = u_projTrans * a_position;
} |
Et le résultat marche comme attendu!
Pièce jointe 296378
Comme on peut le voir, je suis parvenu à "colorier" mes sprites en blanc.
Mais j'aimerais bien avoir, s'il vous plaît, quelques clarifications à propos des programmes utilisées. Comment le code ne colorie pas les pixels transparents, où est la condition qui gère la transparence?
Cordialement