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

58 lines
1.3 KiB
HLSL

cbuffer ParamConstants : register(b0)
{
float4 ImageAColor;
float4 ImageBColor;
float ColorMode;
float AlphaMode;
}
struct vsOutput
{
float4 position : SV_POSITION;
float2 texCoord : TEXCOORD;
};
Texture2D<float4> ImageA : register(t0);
Texture2D<float4> ImageB : register(t1);
Texture2D<float4> Mask : register(t2);
sampler texSampler : register(s0);
float IsBetween( float value, float low, float high) {
return (value >= low && value <= high) ? 1:0;
}
float4 psMain(vsOutput psInput) : SV_TARGET
{
float4 tA = ImageA.Sample(texSampler, psInput.texCoord) * ImageAColor;
float2 uv = psInput.texCoord;
int height, width;
ImageA.GetDimensions(width, height);
float imageAAspect = (float)width / height;
ImageB.GetDimensions(width, height);
float imageBAspect = (float)width / height;
float2 uvB = imageAAspect < imageBAspect
? float2(
(uv.x - 0.5) * imageAAspect / imageBAspect + 0.5,
uv.y)
: float2(
uv.x,
(uv.y - 0.5) * imageBAspect / imageAAspect + 0.5);
float4 tB = ImageB.Sample(texSampler, uvB) * ImageBColor;
float4 mask = Mask.Sample(texSampler, uv);
tA.a = clamp(tA.a, 0,1);
tB.a = clamp(tB.a, 0,1);
return lerp(tA, tB, mask.r);
}