OLD | NEW |
(Empty) | |
| 1 |
| 2 #include <metal_stdlib> |
| 3 #include <simd/simd.h> |
| 4 |
| 5 using namespace metal; |
| 6 |
| 7 typedef struct { |
| 8 packed_float2 position; |
| 9 packed_float2 texcoord; |
| 10 } Vertex; |
| 11 |
| 12 |
| 13 typedef struct { |
| 14 float4 position [[position]]; |
| 15 float2 texcoord; |
| 16 } Varyings; |
| 17 |
| 18 vertex Varyings vertexPassthrough( |
| 19 device Vertex* verticies [[ buffer(0) ]], |
| 20 unsigned int vid [[ vertex_id ]] |
| 21 ) { |
| 22 Varyings out; |
| 23 |
| 24 device Vertex& v = verticies[vid]; |
| 25 |
| 26 out.position = float4(float2(v.position), 0.0, 1.0); |
| 27 |
| 28 out.texcoord = v.texcoord; |
| 29 |
| 30 return out; |
| 31 } |
| 32 |
| 33 fragment half4 fragmentColorConversion( |
| 34 Varyings in [[ stage_in ]], |
| 35 texture2d<float, access::sample> textureY
[[ texture(0) ]], |
| 36 texture2d<float, access::sample> textureC
bCr [[ texture(1) ]] |
| 37 ) { |
| 38 constexpr sampler s(address::clamp_to_edge, filter::linear); |
| 39 float y; |
| 40 float2 uv; |
| 41 y = textureY.sample(s, in.texcoord).r; |
| 42 uv = textureCbCr.sample(s, in.texcoord).rg - float2(0.5,0.5); |
| 43 |
| 44 float4 out = float4(y + 1.403 * uv.y, |
| 45 y - 0.344 * uv.x - 0.714 * uv.y, |
| 46 y + 1.770 * uv.x, |
| 47 1.0); |
| 48 |
| 49 return half4(out); |
| 50 } |
OLD | NEW |