vulkan/shader/renpy_composite.hlsl

73 lines
1.7 KiB
HLSL

[[vk::binding(0, 0)]] SamplerState ClosestSampler;
[[vk::binding(1, 0)]] Texture2D Texture[];
struct PushConstant {
float DissolveLerp;
float TextLerp;
float Width;
float Height;
};
[[vk::push_constant]] PushConstant PushConstant;
struct VSInput
{
float2 Position : POSITION0;
float2 Texture : TEXCOORD0;
};
struct VSOutput
{
float4 Position : SV_POSITION;
float2 Texture : NORMAL0;
float DissolveLerp : DissolveLerp;
float TextLerp : TextLerp;
};
float4 mix(float4 x, float4 y, float a)
{
return x * (1 - a) + y * a;
}
[shader("vertex")]
VSOutput VSMain(VSInput input)
{
VSOutput output = (VSOutput)0;
float2 canonicalSize = float2(1280, 720);
float2 size = float2(PushConstant.Width, PushConstant.Height);
int scaleFactor = 1;
while (canonicalSize.x * (scaleFactor + 1) <= size.x && canonicalSize.y * (scaleFactor + 1) <= size.y) {
scaleFactor += 1;
}
float2 inverseSize = 1.0 / size;
float2 scale = canonicalSize * scaleFactor * inverseSize;
output.Position = float4(input.Position * scale, 0, 1);
output.Texture = input.Texture;
output.DissolveLerp = PushConstant.DissolveLerp;
output.TextLerp = PushConstant.TextLerp;
return output;
}
[shader("pixel")]
float4 PSMain(VSOutput input) : SV_TARGET
{
float4 color0 = Texture[0].Load(int3(input.Texture * float2(1280, 720), 0));
float4 color = float4(0, 0, 0, 0);
if (input.DissolveLerp >= 0) {
float4 color1 = Texture[1].Load(int3(input.Texture * float2(1280, 720), 0));
float4 color01 = mix(color0, color1, input.TextLerp);
float4 color2 = Texture[2].Load(int3(input.Texture * float2(1280, 720), 0));
color = mix(color01, color2, input.DissolveLerp);
} else {
color = color0;
}
return float4(color.xyzw);
}