#version 460 core layout (location = 0) in vec3 norm; layout (location = 1) in vec2 texCoord; layout (location = 0) out vec4 FragColor; layout (set = 0, binding = 0) uniform Matrices { mat4 mvp; float time; float aspect_ratio; }; /* 4-float alignment in memory*/ struct Ray { vec3 orig; float min; vec3 dir; float max; }; vec3 ray_color(vec3 ray) { float a = 0.5 * (ray.y+1.0); return vec3(1.0-a) + a*vec3(0.5, 0.7, 1.0); } /* returns float of where you hit, or -1.0 */ float sphere(vec3 center, float r, Ray ray) { vec3 p = ray.orig-center; float a = dot(ray.dir, ray.dir); float half_b = dot(p, ray.dir); float c = dot(p, p) - r*r; float discr = half_b*half_b - a*c; if(discr < 0.0) return -1.0; return -half_b-sqrt(discr)/a; } void main() { vec2 pixel = texCoord*2.0-1.0; Ray ray; ray.orig = vec3(0.0); ray.min = 0.1; ray.max = 10000.0; float fov = radians(90); ray.dir = normalize(vec3(pixel.x * aspect_ratio, pixel.y, tan(fov/2.0))); vec3 sphere_center = vec3(0.0, 0.0, 1.0); float d = sphere(sphere_center, 0.5, ray); FragColor = vec4(texCoord, 1.0, 1.0); return; if(d < 0.0) { FragColor = vec4(0.0); return; } vec3 n = normalize(ray.dir*d-sphere_center); FragColor = vec4((n+vec3(1.0)) / 2.0, 1.0); }