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:
[...] 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?
Sie benötigen keinen benutzerdefinierten Shader dafür, der Standard-SpriteBatch-Shader unterstützt bereits die Abtönung. – Xoppa