-
Notifications
You must be signed in to change notification settings - Fork 5
/
draw.effect
100 lines (89 loc) · 2.54 KB
/
draw.effect
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
uniform float4x4 ViewProj;
uniform texture2d image;
uniform texture2d frame;
uniform texture2d overlay;
uniform bool desaturate = false;
uniform bool hsv = false;
sampler_state textureSampler {
Filter = MIN_MAG_MIP_POINT;
AddressU = Border;
AddressV = Border;
};
struct VertDataIn {
float4 pos : POSITION;
float2 uv : TEXCOORD0;
};
struct VertDataOut {
float4 pos : POSITION;
float2 dst : TEXCOORD0;
float2 src : TEXCOORD1;
};
VertDataOut VSDefault(VertDataIn vi) {
// Display and overlay sizes (must be synchronized with src/horus/eye.hpp).
static const float dw = 2560.0; // display width
static const float dh = 1080.0; // display height
static const float sw = 1024.0; // scan width
static const float sh = 1024.0; // scan height
// Scan offset to display (horizontal).
static const float sx = round((dw - sw) / 2.0);
// Scan offset to display (vertical).
static const float sy = round((dh - sh) / 2.0);
VertDataOut vo;
vo.pos = mul(float4(vi.pos.xyz, 1.0), ViewProj);
vo.dst = vi.uv;
vo.src = vi.uv;
vo.src.x *= dw / sw;
vo.src.y *= dh / sh;
vo.src.x -= sx / sw;
vo.src.y -= sy / sh;
return vo;
}
float4 PSColorMask(VertDataOut vi) : TARGET {
float4 dst = frame.Sample(textureSampler, vi.src);
if (dst.a == 0.0) {
dst = image.Sample(textureSampler, vi.dst);
}
if (hsv) {
const float min = dst.r < dst.g ? (dst.r < dst.b ? dst.r : dst.b) : (dst.g < dst.b ? dst.g : dst.b);
const float max = dst.r > dst.g ? (dst.r > dst.b ? dst.r : dst.b) : (dst.g > dst.b ? dst.g : dst.b);
float h = 0; // 0 - 360°
float s = 0; // 0 - 100%
float v = max * 100; // 0 - 100%
if (max > 0 && max - min > 0) {
s = (max - min) / max * 100;
if (max == dst.r) {
h = 60 * ((dst.g - dst.b) / (max - min));
} else if (max == dst.g) {
h = 60 * ((dst.b - dst.r) / (max - min)) + 120;
} else {
h = 60 * ((dst.r - dst.g) / (max - min)) + 240;
}
}
if (h < 0) {
h += 360;
}
dst.r = h / 510;
dst.g = s / 100;
dst.b = v / 100;
}
if (desaturate) {
const float c = dst.r * 0.299 + dst.g * 0.587 + dst.b * 0.114;
dst.r = c;
dst.g = c;
dst.b = c;
}
const float4 src = overlay.Sample(textureSampler, vi.src);
if (src.a > 0.0) {
const float m = 1.0 - src.a;
dst.r = dst.r * m + src.r * src.a;
dst.g = dst.g * m + src.g * src.a;
dst.b = dst.b * m + src.b * src.a;
}
return dst;
}
technique Draw {
pass {
vertex_shader = VSDefault(vi);
pixel_shader = PSColorMask(vi);
}
}