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
|
#include <metal_stdlib>
using namespace metal;
typedef struct {
packed_float2 position;
packed_float3 color;
} vertex_t;
struct ColorInOut {
float4 position [[position]];
float4 color;
};
// vertex shader function
vertex ColorInOut triangle_vertex(const device vertex_t* vertex_array [[ buffer(0) ]],
unsigned int vid [[ vertex_id ]])
{
ColorInOut out;
auto device const &v = vertex_array[vid];
out.position = float4(v.position.x, v.position.y, 0.0, 1.0);
out.color = float4(v.color.x, v.color.y, v.color.z, 0.2);
return out;
}
// fragment shader function
fragment float4 triangle_fragment(ColorInOut in [[stage_in]])
{
return in.color;
};
struct Rect {
float x;
float y;
float w;
float h;
};
struct Color {
float r;
float g;
float b;
float a;
};
struct ClearRect {
Rect rect;
Color color;
};
float2 rect_vert(
Rect rect,
uint vid
) {
float2 pos;
float left = rect.x;
float right = rect.x + rect.w;
float bottom = rect.y;
float top = rect.y + rect.h;
switch (vid) {
case 0:
pos = float2(right, top);
break;
case 1:
pos = float2(left, top);
break;
case 2:
pos = float2(right, bottom);
break;
case 3:
pos = float2(left, bottom);
break;
}
return pos;
}
vertex ColorInOut clear_rect_vertex(
const device ClearRect *clear_rect [[ buffer(0) ]],
unsigned int vid [[ vertex_id ]]
) {
ColorInOut out;
float4 pos = float4(rect_vert(clear_rect->rect, vid), 0, 1);
auto col = clear_rect->color;
out.position = pos;
out.color = float4(col.r, col.g, col.b, col.a);
return out;
}
fragment float4 clear_rect_fragment(ColorInOut in [[stage_in]])
{
return in.color;
};
|