vec4 sph1 = vec4( 0.0, 1.0, 0.0, 1.0 ); float iSphere(in vec3 ro, in vec3 rd, in vec4 sph) { vec3 oc = ro - sph.xyz; float b = dot( oc, rd ); float c = dot(oc,oc) - sph.w*sph.w; float h = b*b - c; if( h < 0.0 ) return -1.0; float t = -b - sqrt(h); return t; } vec3 nSphere( in vec3 pos, in vec4 sph ) { return (pos - sph.xyz) / sph.w; } float iPlane(in vec3 ro, in vec3 rd) { return -ro.y/rd.y; } vec3 nPlane( in vec3 pos ) { return vec3(0.0, 1.0, 0.0); } float intersect(in vec3 ro, in vec3 rd, out float resT) { resT = 10000.0; float id = -1.0; float tsph = iSphere( ro, rd, sph1 ); float tpla = iPlane( ro, rd ); if( tsph > 0.0 ) { id = 1.0; resT = tsph; } if( tpla>0.0 && tpla 0.5 && id < 1.5 ) { vec3 pos = ro + t*rd; vec3 nor = nSphere( pos, sph1 ); float diff = clamp(dot(nor, light), 0.0, 1.0); float ao = 0.5 + 0.5*nor.y; col = vec3( 0.9, 0.8, 0.6 )*diff*ao + vec3(0.1,0.2,0.4)*ao; } else if( id >1.5 ) { vec3 pos = ro + t*rd; vec3 nor = nPlane( pos ); float diff = clamp(dot(nor,light), 0.0, 1.0 ); float amb = smoothstep(0.0, 2.0*sph1.w, length(pos.xz-sph1.xz)); col = vec3(amb*0.7); } col = sqrt(col); gl_FragColor = vec4(col,1.0); } //created by jarreed0 at shadergrounds.com