//Version 2.0.0 (2025-04-03) //Made by twitch.tv/Egglyberts (creator of Keysight) //Integrates with Mask Mode Plus in Keysight to provide perfect semi-transparency //Works best if implemented as two sources, with glow additive blended and geometry normal blended //See guide for more info: https://egglyberts.live/keysight/wiki/guide_adv_mask_mode/ uniform bool Show_geometry = true; uniform bool Show_glow = true; uniform bool Use_opacity_on_glow = true; uniform float Menu_opacity = 1.0; float4 mainImage( VertData v_in ) : TARGET { //Threshold is halfway between multiply value in Keysight and 0.5 float threshold = 0.4975; float mult = 0.495; float menu_pixels = 2.0; float4 raw = image.Sample(textureSampler, v_in.uv); float3 base = (raw.rgb); float mask; float alpha = 1.0; float add; //Set additive mode bool as easy variable to call if(Use_opacity_on_glow == true) add = 0.0; else add = 1.0; //This is dumb but hey, it works float4 menu_sample = image.Sample(textureSampler, uv_pixel_interval); float menu = menu_sample.r; //Force point-sampling to avoid outlines due to masking resampling float2 intuv = (v_in.uv + (uv_pixel_interval * 0.5)) * (1/uv_pixel_interval); intuv = round(intuv); intuv = (intuv * uv_pixel_interval) - (uv_pixel_interval * 0.5); //Remove the menu square by sampling adjacent to it for that little patch float2 menu_hide_uv; if((intuv.x <= (uv_pixel_interval.x * menu_pixels * 2.0)) && (intuv.y <= (uv_pixel_interval.y * menu_pixels * 2.0))) menu_hide_uv = (intuv + (uv_pixel_interval.x * menu_pixels * 2.0, uv_pixel_interval.y * menu_pixels)); else menu_hide_uv = intuv; base = image.Sample(textureSampler, menu_hide_uv); //Extract mask if(base.r >= threshold) mask = 0.0; else mask = 1.0; //Bypass masking if menu is open if(menu >= 0.5) alpha = Menu_opacity; else //Begin masking { base = base + (0.5 * mask); base = base - (0.5); base = base * (1 / mult); } //Get max-brightness version float bright_alpha = max(base.r, max(base.g, base.b)); bright_alpha = clamp(bright_alpha - mask, 0.0, 1.0); float pix_mult = 1.0/bright_alpha; float3 bright = base * pix_mult; //Get glow with additive behaviour float3 glow = lerp(bright, base, add); if(Show_glow == false) glow = (glow * 0.0); bright_alpha = clamp((bright_alpha + add), 0.0, 1.0); if(Show_glow == false) bright_alpha = (bright_alpha * 0.0); glow = clamp(glow, 0.0, 1.0); //Get geometry float3 geo = base * mask; geo = clamp(geo, 0.0, 1.0); if(Show_geometry == false) geo = geo * 0.0; //Mix glow and geo float3 mix = (geo + glow); float final_alpha = (Show_geometry * mask) + bright_alpha; //Do menu switching mix = lerp(mix, base, menu); final_alpha = lerp(final_alpha, Menu_opacity, menu); return float4(mix, (final_alpha)); }