HexCardsClient/shaders/sprite_masked.emsl
2021-05-23 15:32:50 +02:00

66 lines
No EOL
1.4 KiB
Text

input View {
mat4 mvp,
mat4 proj,
mat4 proj_inverse,
mat4 view,
mat4 world, //geometry.world atm
float2 fov, //fov.x, fov.y
float2 resolution,
float4 target_region,
float4 target_region_size
}
input MaskedSprite {
float4 uv,
float4 color,
float2 skew,
bool2 uv_flip,
#0 image2D image,
#1 image2D mask
// bool flipy
}
stage vertex vert(
input { View view, MaskedSprite sprite },
vertex in { #0 float4 pos, #1 float4 color, #2 float2 uv },
fragment out { float4 color, float2 uv})
{
out.color = in.color;
out.uv = in.uv;
mat4 skew = mat4(
float4(1,input.sprite.skew.x,0,0),
float4(input.sprite.skew.y,1,0,0),
float4(0,0,1,0),
float4(0,0,0,1)
);
stage.pos = input.view.mvp * (skew * float4(in.pos.xyz, 1.0));
}
stage fragment frag(
input { MaskedSprite sprite },
fragment in { float4 color, float2 uv })
{
float4 uv = input.sprite.uv;
if(input.sprite.uv_flip.x) {
uv.x = input.sprite.uv.z; //left
uv.z = input.sprite.uv.x; //right
}
if(input.sprite.uv_flip.y) {
uv.y = input.sprite.uv.w; //top
uv.w = input.sprite.uv.y; //bottom
}
float4 color = texture(input.sprite.image, uv.xy + (in.uv.xy * (uv.zw - uv.xy)));
color.a *= texture(input.sprite.mask, in.uv.xy).a;
if(color.a <= 0.0) {
discard;
return;
}
stage.color[0] = color * in.color * input.sprite.color;
}