72 lines
1.5 KiB
HLSL
72 lines
1.5 KiB
HLSL
float4 BlendColors(float4 tA, float4 tB, int blendMode)
|
|
{
|
|
tA.a = saturate(tA.a);
|
|
tB.a = saturate(tB.a);
|
|
|
|
float a = tA.a + tB.a - tA.a * tB.a;
|
|
|
|
float normalRatio = saturate(tB.a * 2 - 1);
|
|
|
|
// float3 rgb = (1.0 - tB.a)*tA.rgb + tB.a*tB.rgb;
|
|
float3 rgbNormalBlended = (1.0 - tB.a) * tA.rgb + tB.a * tB.rgb;
|
|
float3 rgb = 1;
|
|
|
|
switch ((int)blendMode)
|
|
{
|
|
// normal
|
|
case 0:
|
|
rgb = rgbNormalBlended;
|
|
break;
|
|
|
|
// screen
|
|
case 1:
|
|
rgb = 1 - (1 - tA.rgb) * (1 - tB.rgb * tB.a);
|
|
break;
|
|
|
|
// multiply
|
|
case 2:
|
|
rgb = lerp(tA.rgb, tA.rgb * tB.rgb, tB.a);
|
|
break;
|
|
|
|
// overlay
|
|
case 3:
|
|
rgb = float3(
|
|
tA.r < 0.5 ? (2.0 * tA.r * tB.r) : (1.0 - 2.0 * (1.0 - tA.r) * (1.0 - tB.r)),
|
|
tA.g < 0.5 ? (2.0 * tA.g * tB.g) : (1.0 - 2.0 * (1.0 - tA.g) * (1.0 - tB.g)),
|
|
tA.b < 0.5 ? (2.0 * tA.b * tB.b) : (1.0 - 2.0 * (1.0 - tA.b) * (1.0 - tB.b)));
|
|
|
|
rgb = lerp(tA.rgb, rgb, tB.a);
|
|
break;
|
|
|
|
// difference
|
|
case 4:
|
|
rgb = abs(tA.rgb - tB.rgb) * tB.a + tB.rgb * (1.0 - tB.a);
|
|
break;
|
|
|
|
// use a
|
|
case 5:
|
|
rgb = tA.rgb;
|
|
break;
|
|
|
|
// use b
|
|
case 6:
|
|
rgb = tB.rgb;
|
|
break;
|
|
|
|
// colorDodge
|
|
case 7:
|
|
rgb = tA.rgb / (1.0001 - saturate( tB.rgb));
|
|
break;
|
|
|
|
// linearDodge
|
|
case 8:
|
|
rgb = tA.rgb + tB.rgb;
|
|
break;
|
|
case 9:
|
|
a = tA.a * tB.a;
|
|
break;
|
|
|
|
}
|
|
|
|
return float4(rgb, a);
|
|
} |