Need to combine a color, mask, and sprite layer in a shader
- by Donutz
My task: to display a sprite using different team colors. I have a sprte graphic, part of which has to be displayed as a team color. The color isn't 'flat', i.e. it shades from brighter to darker. I can't "pre-build" the graphics because there are just too many, so I have to generate them at runtime. I've decided to use a shader, and supply it with a texture consisting of the team color, a texture consisting of a mask (black=no color, white=full color, gray=progressively dimmed color), and the sprite grapic, with the areas where the team color shows being transparent.
So here's my shader code:
// Effect attempts to merge a color layer, a mask layer, and a sprite layer
// to produce a complete sprite
sampler UnitSampler : register(s0); // the unit
sampler MaskSampler : register(s1); // the mask
sampler ColorSampler : register(s2); // the color
float4 main(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
{
float4 tex1 = tex2D(ColorSampler, texCoord); // get the color
float4 tex2 = tex2D(MaskSampler, texCoord); // get the mask
float4 tex3 = tex2D(UnitSampler,texCoord); // get the unit
float4 tex4 = tex1 * tex2.r * tex3; // color * mask * unit
return tex4;
}
My problem is the calculations involving tex1 through tex4. I don't really understand how the manipulations work, so I'm just thrashing around, producing lots of different incorrect effects. So given tex1 through tex3, what calcs do I do in order to take the color (tex1), mask it (tex2), and apply the result to the unit if it's not zero?
And would I be better off to make the mask just on/off (white/black) and put the color shading in the unit graphic?