41 lines
922 B
Plaintext
41 lines
922 B
Plaintext
#include <metal_stdlib>
|
|
using namespace metal;
|
|
|
|
struct Uniforms {
|
|
float invert;
|
|
float mode; // 0 = alpha, 1 = binary
|
|
float2 padding;
|
|
};
|
|
|
|
struct FragmentIn {
|
|
float4 position [[position]];
|
|
float2 uv;
|
|
};
|
|
|
|
fragment float4 fragment_main(
|
|
FragmentIn in [[stage_in]],
|
|
constant Uniforms &uniforms [[buffer(0)]],
|
|
texture2d<float> content_tex [[texture(0)]],
|
|
texture2d<float> mask_tex [[texture(1)]],
|
|
sampler samp [[sampler(0)]]
|
|
) {
|
|
float4 content = content_tex.sample(samp, in.uv);
|
|
float4 mask = mask_tex.sample(samp, in.uv);
|
|
|
|
// Get mask value (use alpha channel)
|
|
float mask_value = mask.a;
|
|
|
|
// Binary mode: threshold at 0.5
|
|
if (uniforms.mode > 0.5) {
|
|
mask_value = mask_value > 0.5 ? 1.0 : 0.0;
|
|
}
|
|
|
|
// Invert if requested
|
|
if (uniforms.invert > 0.5) {
|
|
mask_value = 1.0 - mask_value;
|
|
}
|
|
|
|
// Apply mask to content alpha
|
|
return float4(content.rgb, content.a * mask_value);
|
|
}
|