uniform float4x4 ViewProj; uniform texture2d image; uniform texture2d filtered_image; uniform float circle_radius; uniform float feathering; uniform float2 center; uniform float2 uv_scale; uniform bool inv = false; sampler_state textureSampler{ Filter = Linear; AddressU = Clamp; AddressV = Clamp; MinLOD = 0; MaxLOD = 0; }; struct VertData { float4 pos : POSITION; float2 uv : TEXCOORD0; }; VertData mainTransform(VertData v_in) { v_in.pos = mul(float4(v_in.pos.xyz, 1.0), ViewProj); return v_in; } float4 mainImage(VertData v_in) : TARGET { float2 uv_prime = v_in.uv * uv_scale; float2 center_prime = center * uv_scale; float dist = distance(uv_prime, center_prime); if (dist > circle_radius) { return !inv ? image.Sample(textureSampler, v_in.uv) : filtered_image.Sample(textureSampler, v_in.uv); } if(feathering > 0.0 && circle_radius > 0.0){ float distance_factor = dist / circle_radius; if (distance_factor > (1.0 - feathering)) { float feathering_effect = (distance_factor - (1.0 - feathering)) / feathering; if(inv){ feathering_effect = 1.0 - feathering_effect; } return ((image.Sample(textureSampler, v_in.uv) * feathering_effect) + (filtered_image.Sample(textureSampler, v_in.uv) * (1.0-feathering_effect))); } } return inv ? image.Sample(textureSampler, v_in.uv) : filtered_image.Sample(textureSampler, v_in.uv); } technique Draw { pass { vertex_shader = mainTransform(v_in); pixel_shader = mainImage(v_in); } }