Files
2026-07-13 13:13:17 +08:00

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);
}