blob: 03cc38c4fabe17f8b83a066bdd78ab1e040680cb [file] [log] [blame]
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
uint3 sk_ThreadPosition;
};
struct Outputs {
};
struct Globals {
texture2d<half, access::write> dest;
};
kernel void computeMain(texture2d<half, access::write> dest[[texture(0)]], uint3 sk_ThreadPosition [[thread_position_in_grid]]) {
Globals _globals{dest};
(void)_globals;
Inputs _in = { sk_ThreadPosition };
Outputs _out = { };
half4 pixel = half4(0.0h, 0.0h, 0.0h, 1.0h);
float max_x = 5.0;
float max_y = 5.0;
float x = float(_in.sk_ThreadPosition.x * 2u - _globals.dest.get_width()) / float(_globals.dest.get_width());
float y = float(_in.sk_ThreadPosition.y * 2u - _globals.dest.get_height()) / float(_globals.dest.get_height());
float3 ray_origin = float3(0.0, 0.0, -1.0);
float3 ray_target = float3(x * max_x, y * max_y, 0.0);
float3 sphere_center = float3(0.0, 0.0, -10.0);
float sphere_radius = 1.0;
float3 t_minus_c = ray_target - sphere_center;
float b = dot(ray_origin, t_minus_c);
float c = dot(t_minus_c, t_minus_c) - sphere_radius * sphere_radius;
float bsqmc = b * b - c;
if (bsqmc >= 0.0) {
pixel = half4(0.40000000596046448h, 0.40000000596046448h, 1.0h, 1.0h);
}
_globals.dest.write(pixel, _in.sk_ThreadPosition.xy);
return;
}