96 lines
2.5 KiB
HLSL
96 lines
2.5 KiB
HLSL
[[vk::binding(0, 0)]] SamplerState ClosestSampler;
|
|
[[vk::binding(1, 0)]] Texture2D Texture[];
|
|
|
|
struct VSInput
|
|
{
|
|
float2 Position : POSITION0;
|
|
float2 Texture : TEXCOORD0;
|
|
// per-instance
|
|
int2 Size : Size;
|
|
int2 TopLeft : TopLeft;
|
|
float4 Color : Color;
|
|
int TextureIndex : TextureIndex;
|
|
};
|
|
|
|
struct VSOutput
|
|
{
|
|
float4 Position : SV_POSITION;
|
|
float2 Texture : NORMAL0;
|
|
float4 Color : Color;
|
|
int TextureIndex : TextureIndex;
|
|
};
|
|
|
|
[shader("vertex")]
|
|
VSOutput VSMain(VSInput input)
|
|
{
|
|
float2 inversePixel = float2(1.0 / 1280.0, 1.0 / 720.0);
|
|
|
|
float2 size = abs(input.Size);
|
|
float2 texture = float2(input.Size.x < 0 ? 1.0 - input.Texture.x : input.Texture.x,
|
|
input.Size.y < 0 ? 1.0 - input.Texture.y : input.Texture.y);
|
|
|
|
VSOutput output = (VSOutput)0;
|
|
float2 position = (input.Texture * size + input.TopLeft) * inversePixel;
|
|
output.Position = float4(position * 2.0 - 1.0, 0, 1);
|
|
output.Texture = texture;
|
|
output.TextureIndex = input.TextureIndex;
|
|
output.Color = input.Color;
|
|
|
|
return output;
|
|
}
|
|
|
|
float4 PSGradient1(VSOutput input) : SV_TARGET
|
|
{
|
|
float a = smoothstep(0.05, 0.2, input.Texture.x);
|
|
float b = 1.0 - smoothstep(0.8, 0.95, input.Texture.x);
|
|
float c = smoothstep(0.05, 0.2, input.Texture.y);
|
|
float d = a * b * c * 0.5;
|
|
float3 color = float3(1.0, 1.0, 1.0);
|
|
return float4(color, d);
|
|
}
|
|
|
|
float4 PSGradient2(VSOutput input) : SV_TARGET
|
|
{
|
|
float a = smoothstep(0.05, 0.2, input.Texture.x);
|
|
float b = 1.0 - smoothstep(0.8, 0.95, input.Texture.x);
|
|
float d = a * b * 0.5;
|
|
float3 color = float3(1.0, 1.0, 1.0);
|
|
return float4(color, d);
|
|
}
|
|
|
|
float4 PSGradient3(VSOutput input) : SV_TARGET
|
|
{
|
|
float a = smoothstep(0.02, 0.1, input.Texture.x);
|
|
float b = 1.0 - smoothstep(0.9, 0.98, input.Texture.x);
|
|
float d = a * b * 0.5;
|
|
float3 color = float3(1.0, 1.0, 1.0);
|
|
return float4(color, d);
|
|
}
|
|
|
|
[shader("pixel")]
|
|
float4 PSMain(VSOutput input) : SV_TARGET
|
|
{
|
|
float4 color;
|
|
if (input.TextureIndex >= 0) {
|
|
color = Texture[input.TextureIndex].Sample(ClosestSampler, input.Texture);
|
|
} else if (input.TextureIndex == -1) {
|
|
color = float4(input.Color.xyz, 1.0);
|
|
} else if (input.TextureIndex == -2) {
|
|
return PSGradient1(input);
|
|
} else if (input.TextureIndex == -3) {
|
|
return PSGradient2(input);
|
|
} else if (input.TextureIndex == -4) {
|
|
return PSGradient2(input);
|
|
} else {
|
|
return float4(1, 0, 0, 1);
|
|
}
|
|
|
|
if (color.w == 0.0)
|
|
discard;
|
|
|
|
float gamma = 2.2;
|
|
color.xyz = pow(color.xyz, float3(gamma.xxx));
|
|
|
|
return float4(color.xyzw);
|
|
}
|