Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- float sdf(vec3 p){
- // Yksikköpallo origossa
- return length(p)-1.0;
- }
- vec3 get_normal(vec3 pos){
- // Numeerinen pinnan approksimaatio normaalille
- vec3 eps = vec3(0.01,0,0);
- return normalize(vec3(
- sdf(pos + eps.xyy) - sdf(pos - eps.xyy),
- sdf(pos + eps.yxy) - sdf(pos - eps.yxy),
- sdf(pos + eps.yyx) - sdf(pos - eps.yyx)
- ));
- }
- vec4 get_color(vec3 surface, vec3 camera){
- // Lasketaan pikselin väri Phongin valaistusmallilla
- vec3 normal = get_normal(surface);
- vec3 l = vec3(-1,-1,-0.2); // Valon tulosuunta
- vec3 l_prime = l + 2.0*dot(l,normal)*normal;
- vec3 to_camera = camera - surface;
- float cos_angle = max(dot(-l_prime, to_camera),0.0)/(length(l_prime) * length(to_camera));
- vec3 specular = vec3(1.0,1.0,1.0) * 3.0 * pow(cos_angle,2.5);
- vec3 diffuse = vec3(1.0,0.0,0.0) * 0.2 * max(dot(normal, -l),0.0);
- vec3 ambient = vec3(1.0,0.0,0.0) * 0.3;
- return vec4(clamp(diffuse + specular + ambient,0.0,1.0), 1.0);
- }
- void mainImage(out vec4 outputColor, in vec2 fragCoord){
- // Skaalaa pikseleiden koordinaatit välille [-1,-1]
- float aspect_ratio = 16.0/9.0;
- vec2 pixel_pos = (fragCoord.xy / iResolution.xy - vec2(0.5,0.5))
- * vec2(2.0*aspect_ratio,2.0);
- vec3 v_0 = vec3(0.0, 0.0, 2.0); // Kameran sijainti
- // Luodaan säde kamerasta yhden yksikön päässä leijuvan
- // kuvitteellisen ikkunan läpi annetun pikselin kohdalta
- vec3 ray = normalize(vec3(pixel_pos.x, pixel_pos.y,-1));
- // Tehdään 50 iteraatiota sädeaskellusta etäisyyskentän avulla
- vec3 pos = v_0;
- for(int step = 0; step < 50; step++){
- pos += ray * sdf(pos);
- }
- if(sdf(pos) > 0.01) // Ei osumaa
- outputColor = vec4(0,0,0,1);
- else{ // Osuma
- outputColor = get_color(pos, v_0);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement