#version 130 uniform vec2 resolution; uniform vec3 pos1; uniform vec3 pos2; uniform vec3 pos3; uniform vec3 pos4; vec4 fpar00[16]; #define size 0.4 struct s_ray { vec3 origin; vec3 direction; }; s_ray ray; float pot(vec3 at, vec3 ballCenter) { vec3 tmp=at-ballCenter; float d=dot(tmp,tmp); return d; } float field(vec3 p) { float potentiel=0.0; potentiel += size/pot(p,pos1); potentiel += size/pot(p,pos2); potentiel += size/pot(p,pos3); potentiel += size/pot(p,pos4); return 1.0-potentiel; } bool intPlane( in vec4 plane, in s_ray ray, in float tm, out float t ) { t = -(dot(plane.xyz,ray.origin)+plane.w)/dot(plane.xyz,ray.direction); return (t > 0.0) && (t < tm); } bool trace(s_ray ray, in float maxDistance, in out float t ) { float minDistance = 0.3; float distance = 999.0; while (t < maxDistance) { vec3 position = ray.origin + t * ray.direction; distance = field(position); if (distance < minDistance && distance>0.0) { break; } t += 0.02; } return (distance < minDistance && distance>0.0); } void Render_plans(s_ray ray, out vec3 position,out vec4 ob,out vec4 co, in float tm, out float t ) { if (intPlane(fpar00[0],ray, tm,t)) //left { ob = fpar00[0]; co = vec4(1,1,1,1); tm = t; } if (intPlane(fpar00[1],ray,tm,t)) //right { ob = fpar00[1]; co = vec4(0,1,0,1); tm = t; } if (intPlane(fpar00[2],ray, tm,t)) //top { ob = fpar00[2]; co = vec4(0,0,1,1); tm = t; } if (intPlane(fpar00[3],ray, tm,t)) //bottom { ob = fpar00[3]; co = vec4(1,0,1,1); tm = t; } if (intPlane(fpar00[4],ray, tm,t)) //back { ob = fpar00[4]; co = vec4(1,1,0,1); tm = t; } } void Render(s_ray ray, out vec3 position,out vec4 ob,out vec4 co) { float tm=11.0; float t=0.1; Render_plans(ray, position,ob,co, tm,t); t=0.1; if (trace(ray,tm,t)) { #define epsilon 0.2 vec3 camera_direction=vec3(0.1,0.1,1.0); vec3 materialDiffuse=vec3(0.2,0.4,0.2); float materialExponenet=256.0; // //normal // vec3 hitpoint = ray.origin + t * ray.direction; vec3 normal; normal.x=field(hitpoint+vec3(epsilon,0.0,0.0)); normal.y=field(hitpoint+vec3(0.0,epsilon,0.0)); normal.z=field(hitpoint+vec3(0.0,0.0,epsilon)); normal-=field(hitpoint); normal=normalize(normal); // //light // vec3 lightsPosition[5]; int numlight=5; lightsPosition[0]=vec3(2.0,-2.0,-2.0); lightsPosition[1]=vec3(2.0,-2.0,2.0); lightsPosition[2]=vec3(-2.0,-2.0,2.0); lightsPosition[3]=vec3(-2.0,-2.0,-2.0); lightsPosition[4]=vec3(2.0,2.0,-2.0); vec3 color=vec3(0.0,0.0,0.0); vec3 lightsDiffuse[5]; lightsDiffuse[0]=vec3(0.0,1.0,1.0); lightsDiffuse[1]=vec3(1.0,0.0,1.0); lightsDiffuse[2]=vec3(1.0,0.0,0.0); lightsDiffuse[3]=vec3(0.0,0.0,1.0); lightsDiffuse[4]=vec3(1.0,0.5,1.0); for(int i=0;i