2016-09-24 3 views
0

Ich möchte viele Sprites rendern, und ich möchte jedes Sprite in einer Farbe (für einen Regenbogen-Effekt) mit einem Shader tönen. (Sprite Textur ist zunächst in Graustufen)Farbe pro Sprite mit SpriteBatch und Vertexfarbe einstellen?

Zuerst habe ich es mit einer Uniform, wo ich eine Farbe, die ich außerhalb des Shaders berechnet passiert. Das hat gut funktioniert, aber es war zu langsam.

Dann fand ich heraus, dass es zu langsam ist, weil ich diese Uniform viele Male pro Frame eingestellt habe. Ich fand das folgende:

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

[...] Abtönen ein Sprite in OpenGL kann einfach durch die Definition der Vertexfarben erfolgen. Da die Scheitelpunkte in diesem Fall von SpriteBatch.draw() definiert werden, sollten Sie den Farbton mit SpriteBatch.setColor() festlegen. [...]

Und ich versuchte, so zu tun:

in 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, ich bin nicht so vertraut mit GLSL Shadern, und das ist vielleicht der Grund, warum es jetzt nichts zeichnet. Ich denke, ich vermisse etwas und ich kann nicht herausfinden, was.

Wie kann ich ein Sprite in einer Farbe färben? Damit es schnell geht?

+0

Sie benötigen keinen benutzerdefinierten Shader dafür, der Standard-SpriteBatch-Shader unterstützt bereits die Abtönung. – Xoppa

Antwort

1

Es gibt einen großen Unterschied zwischen der Sprite-Klasse und der TextureRegion-Klasse. Sprites speichern ihre eigenen Vertex-Daten, so dass Sie sie färben, indem Sie setColor auf dem Sprite anstelle des SpriteBatch aufrufen. Sprites ignorieren, welche Farbe im Batch eingestellt ist. Texturen und TexturRegionen hingegen verwenden die neueste Farbe, die im Stapel eingestellt wurde.

Außerdem können Sie keine Vertex-Attributvariablen im Fragment-Shader verwenden. Sie haben bereits a_color in Ihren Vertex-Shader zu v_color kopiert, so dass Sie v_color in Ihrem Fragment-Shader verwenden. Ich habe keine Ahnung, was Sie mit gl_Color dort tun wollen.

+0

Alles klar, danke! – red1575

Verwandte Themen