R"###( #version 330 core out vec4 FragColor; in vec2 texCoords; vec3 center = vec3(0.0f,0.0f,20.0f); float radius = 5.0f; float planeHeight = -7.0f; struct Ray { vec3 dir; vec3 pos; float min; float len; vec3 color; }; Ray applyMin(Ray ray) { vec3 off = ray.dir * ray.min; ray.pos = ray.pos + off; ray.len = ray.len + ray.min; return ray; } Ray planeMin(Ray ray){ ray.min = ray.pos.y - planeHeight; ray.color = vec3(1.0,1.0,1.0); return applyMin(ray); } Ray sphereMin(Ray ray){ ray.min = length(ray.pos - center) - radius; ray.color = vec3(1.0,0.0,0.0); return applyMin(ray); } Ray minFn(Ray ray){ Ray sp = sphereMin(ray); Ray pl = planeMin(ray); if (sp.min < pl.min){ return sp; } else { return pl; } } void main() { vec3 dir = vec3(texCoords.x, texCoords.y,2.0f); dir = (dir - 0.5f) * 2; vec3 pos = dir; Ray ray = Ray(pos,normalize(dir),.0,.0,vec3(.0)); ray = minFn(ray); while( (ray.min < 100.0f) && (ray.min > 0.1f) ) { //ray.dir = normalize(ray.dir); ray = minFn(ray); //vec3 off = ray.dir * min; //ray.pos = ray.pos + off; } if(ray.min <= 0.2f){ FragColor = vec4(ray.color, 1.0f); } else { FragColor = vec4(.0,0.0f,0.0f,1.0f); } } )###";