2016-09-24 2 views
0

Je veux rendre de nombreux sprites, et je veux colorer chaque sprite dans une couleur (pour un effet arc en ciel) en utilisant un shader. (La texture Sprite est initialement en niveaux de gris)Définir la couleur par sprite en utilisant SpriteBatch et la couleur vertex?

D'abord je l'ai fait avec un uniforme, où j'ai passé une couleur, que j'ai calculée en dehors du shader. Cela a bien fonctionné, mais c'était trop lent. Puis j'ai découvert que c'était trop lent parce que je mettais cet uniforme plusieurs fois par image. J'ai trouvé ce qui suit:

https://gamedev.stackexchange.com/questions/83145/set-color-by-uniform-per-sprite-using-libgdx-spritebatch

[...] teinter une image-objet OpenGL peut facilement être fait en définissant les couleurs des sommets. Puisque les sommets dans ce cas sont définis par SpriteBatch.draw(), vous devez définir la couleur avec SpriteBatch.setColor(). [...]

Et j'ai essayé de le faire:

en render():

 batch.setShader(shader); 
     batch.setColor(.5f, .3f, 1, 1); 
     sprite.draw(batch); 
     batch.setColor(1, 1, 1, 1); 
     batch.setShader(null); 

vertex shader:

void main() { 
v_color = a_color; 
v_texCoords = a_texCoord0; 
gl_Position = u_projTrans * a_position; 
} 

fragment shader:

void main() { 
    v_color = a_color*gl_Color*2.0; 
    gl_FragColor = v_color * texture2D(u_texture, v_texCoords); 
} 

Ok, je ne suis pas très familier avec les shaders GLSL, et c'est peut-être pourquoi maintenant ça ne dessine rien. Je suppose qu'il me manque quelque chose et je n'arrive pas à comprendre quoi.

Comment puis-je colorer une image-objet dans une couleur? Pour que ça marche vite?

+0

Vous n'avez pas besoin de shader personnalisé pour cela, le shader SpriteBatch par défaut supporte déjà la teinture. – Xoppa

Répondre

1

Il y a une grande différence entre la classe Sprite et la classe TextureRegion. Les sprites stockent leurs propres données de vertex, donc vous les colorez en appelant setColor sur le Sprite au lieu du SpriteBatch. Les sprites ignorent la couleur définie sur le lot. Textures et TextureRegions, d'autre part, utilisent la dernière couleur qui a été définie sur le lot.

De même, vous ne pouvez pas utiliser les variables d'attribut vertex dans le fragment shader. Vous avez déjà copié a_color à v_color dans votre vertex shader, vous utilisez donc v_color dans votre fragment shader. Je n'ai aucune idée de ce que vous essayez de faire avec gl_Color là.

+0

Très bien, merci! – red1575