1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
#define THRESHOLD 0.5f
#define EPS 0.000000000001
uniform float4x4 ViewProj;
uniform texture2d image;
uniform texture2d blur_mask;
uniform texture2d blur_mask_inner;
uniform float2 texel_step;
uniform float stroke_thickness;
uniform float stroke_offset;
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 mainImageFilled(VertData v_in) : TARGET
{
float a = (blur_mask.Sample(textureSampler, v_in.uv)).a;
float stroke = step(EPS, 1.0 - a);
return float4(stroke, stroke, stroke, stroke);
}
float4 mainImageOffsetInline(VertData v_in) : TARGET
{
float a = (blur_mask.Sample(textureSampler, v_in.uv)).a;
float ratio = 0.5 * stroke_thickness/(stroke_offset+stroke_thickness);
float stroke = step(EPS, 1.0 - a) - step(ratio, 1.0 - a);
return float4(stroke, stroke, stroke, stroke);
}
float4 mainImageOffsetSubtract(VertData v_in) : TARGET
{
float a_outer = (blur_mask.Sample(textureSampler, v_in.uv)).a;
float a_inner = (blur_mask_inner.Sample(textureSampler, v_in.uv)).a;
float stroke = step(EPS, 1.0 - a_outer) - step(EPS, 1.0 - a_inner);
return float4(stroke, stroke, stroke, stroke);
}
technique Filled
{
pass
{
vertex_shader = mainTransform(v_in);
pixel_shader = mainImageFilled(v_in);
}
}
technique OffsetInline
{
pass
{
vertex_shader = mainTransform(v_in);
pixel_shader = mainImageOffsetInline(v_in);
}
}
technique OffsetSubtract
{
pass
{
vertex_shader = mainTransform(v_in);
pixel_shader = mainImageOffsetSubtract(v_in);
}
}
|