shaders.metal

 1#include <metal_stdlib>
 2#include "shaders.h"
 3
 4using namespace metal;
 5
 6float4 coloru_to_colorf(uchar4 coloru) {
 7    return float4(coloru) / float4(0xff, 0xff, 0xff, 0xff);
 8}
 9
10struct QuadFragmentInput {
11    float4 position [[position]];
12    GPUIQuad quad;
13};
14
15vertex QuadFragmentInput quad_vertex(
16    uint unit_vertex_id [[vertex_id]],
17    uint quad_id [[instance_id]],
18    constant float2 *unit_vertices [[buffer(GPUIQuadInputIndexVertices)]],
19    constant GPUIQuad *quads [[buffer(GPUIQuadInputIndexQuads)]],
20    constant GPUIQuadUniforms *uniforms [[buffer(GPUIQuadInputIndexUniforms)]]
21) {
22    float2 unit_vertex = unit_vertices[unit_vertex_id];
23    GPUIQuad quad = quads[quad_id];
24    float2 position = unit_vertex * quad.size + quad.origin;
25    float4 device_position = float4(position / uniforms->viewport_size * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
26
27    return QuadFragmentInput {
28        device_position,
29        quad,
30    };
31}
32
33fragment float4 quad_fragment(QuadFragmentInput input [[stage_in]]) {
34    return coloru_to_colorf(input.quad.background_color);
35}