diff --git a/sdf.fs b/sdf.fs index 8829c94..b6f5f75 100644 --- a/sdf.fs +++ b/sdf.fs @@ -6,23 +6,46 @@ in vec2 texCoords; uniform float aspect; -vec3 center = vec3(0.0,0.0,20.0); +vec3 center = vec3(0.0,-4.0,20.0); float radius = 5.0; float planeHeight = -7.0; +struct SmallHit { + float min; + float len; + bool firstHP; +}; + struct Ray { vec3 dir; vec3 pos; float min; float len; + SmallHit small; vec3 color; }; - -Ray applyMin(Ray ray) { - vec3 off = ray.dir * ray.min; + +Ray createRay(vec3 dir, vec3 pos){ + return Ray(dir, pos, .0, .0, SmallHit(80.,0.,false), vec3(.0)); +} + +Ray applyMin(Ray ray, float min) { + vec3 off = ray.dir * min; ray.pos = ray.pos + off; - ray.len = ray.len + ray.min; + ray.len = ray.len + min; + + if( (min < ray.min) && !ray.small.firstHP ){ + ray.small.firstHP = true; + } + + ray.min = min; + + if((ray.min < ray.small.min) && ray.small.firstHP){ + ray.small.min = ray.min; + ray.small.len = ray.len; + } + return ray; } @@ -38,18 +61,15 @@ float sphereMin(vec3 pos){ Ray minFn(Ray ray){ float sp = sphereMin(ray.pos); float pl = planeMin(ray.pos); - - - - + float min; if (sp < pl){ ray.color = vec3(1.0, 0.5, 0.2); - ray.min = sp; + min = sp; } else { ray.color = vec3(0.2, 0.3, 0.3); - ray.min = pl; + min = pl; } - return applyMin(ray); + return applyMin(ray,min); } float minFn(vec3 pos){ @@ -67,7 +87,7 @@ Ray march(Ray ray){ //ray.min = minFn(ray.pos); ray = minFn(ray); int c = 0; - while(( c < 200) && (ray.min < 100.0f) && (ray.min > 0.1f) ) { + while(( c < 200) && (ray.min < 100.0f) && (ray.min > 0.01f) ) { ray = minFn(ray); c++; } @@ -93,8 +113,7 @@ void main() vec3 dir = vec3((texCoords - 0.5)*2,1.0); dir.x *= aspect; vec3 pos = dir; - Ray ray = Ray(normalize(dir),pos,.0,.0,vec3(.0)); - + Ray ray = createRay(normalize(dir),pos); ray = march(ray); vec3 normal = calcNormal(ray); @@ -103,29 +122,27 @@ void main() float light = (- min(dot(normal,lighDir),0.0))*0.85; float shLeve = 1.0; + - vec2 offsets[8] = vec2[]( - vec2( -0.94201624, -0.39906216 ), - vec2( 0.94558609, -0.76890725 ), - vec2( -0.094184101, -0.92938870 ), - vec2( 0.34495938, 0.29387760 ), - vec2( 0.94201624, 0.39906216 ), - vec2( -0.94558609, 0.76890725 ), - vec2( 0.094184101, 0.92938870 ), - vec2( -0.34495938, -0.29387760 ) - ); + Ray shRay = createRay(lighDir * (-1.0), ray.pos + (-0.5)*lighDir); + shRay = march(shRay); - for(int i = 0; i < 8; i++){ - Ray shRay = Ray(lighDir * (-1.0) + vec3(offsets[i].x,.0,offsets[i].y)*0.05, ray.pos + 0.5*normal, .0,.0, vec3(.0)); - shRay = march(shRay); - if( (dot(lighDir,normal) < 0.0) && (shRay.len <20)){ - shLeve -= 0.125*max(1.0-shRay.len*0.07 , 0.0); + if( dot(lighDir,normal) < 0. ){ + if( shRay.len <80){ + shLeve = .0;//shRay.len*0.02 , 0.0; + } + else { + shLeve = shRay.small.min / shRay.small.len; + shLeve *= 9.0; + //shLeve = pow(shLeve*10.0,0.5); } } + shLeve = min(max(shLeve, 0.0),1.0); - light *= shLeve * .8; + light *= shLeve; if(ray.min <= 0.2){ + //FragColor = vec4(vec3(shRay.small.min)*0.1,1.0); FragColor = vec4(ray.color * (light+0.3), 1.0); } else { FragColor = vec4(.0,0.0,0.0,1.0);