Advertisement
Guest User

Untitled

a guest
Oct 24th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.08 KB | None | 0 0
  1. #define MAX_STEPS 100
  2. #define MAX_DISTANCE 100.
  3. #define MIN_DISTANCE .01
  4.  
  5. float getDistance(vec3 point) {
  6. vec4 sphere = vec4(0, 1, 6, 1);
  7. float sphereDistance = length(point - sphere.xyz) - sphere.w;
  8. float planeDistance = point.y;
  9. return min(sphereDistance, planeDistance);
  10. }
  11.  
  12. float rayMarch(vec3 rayOrigin, vec3 rayDirection) {
  13. float rayDistance = 0.;
  14. for (int i = 0; i < MAX_STEPS; i++) {
  15. vec3 marchLocation = rayOrigin + rayDistance * rayDirection;
  16. float surfaceDistance = getDistance(marchLocation);
  17. rayDistance += surfaceDistance;
  18. if (surfaceDistance < MIN_DISTANCE || rayDistance > MAX_DISTANCE) {
  19. break;
  20. }
  21. }
  22. return rayDistance;
  23. }
  24.  
  25. vec3 getNormal(vec3 point) {
  26. float distance = getDistance(point);
  27. vec2 sampleSurface = vec2(.01, 0);
  28. vec3 normal = distance - vec3(
  29. getDistance(point - sampleSurface.xyy),
  30. getDistance(point - sampleSurface.yxy),
  31. getDistance(point - sampleSurface.yyx)
  32. );
  33. return normalize(normal);
  34. }
  35.  
  36. float getLight(vec3 point) {
  37. vec3 lightPosition = vec3(0, 5, 6);
  38. lightPosition.xz += vec2(sin(iTime), cos(iTime)) * 5.;
  39. //lightPosition.y += abs(sin(iTime)) * 9.;
  40. vec3 light = normalize(lightPosition - point);
  41. vec3 normal = getNormal(point);
  42. float diffuse = clamp(dot(normal, light), 0., 1.);
  43. float lightDistance = rayMarch(point + normal + MIN_DISTANCE * 2., light);
  44. if (lightDistance < length(lightPosition - point)) {
  45. diffuse *= .1;
  46. }
  47. return diffuse;
  48. }
  49.  
  50. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  51. {
  52. vec2 uv = (fragCoord - .5 * iResolution.xy) / iResolution.y;
  53.  
  54. // vec3 col = 0.5 + 0.5*cos(iTime+uv.xyx+vec3(0,2,4));
  55. vec3 col = vec3(0);
  56.  
  57. vec3 rayOrigin = vec3(0, 1, 0);
  58. vec3 rayDirection = normalize(vec3(uv.x, uv.y, 1));
  59. float distance = rayMarch(rayOrigin, rayDirection);
  60. vec3 point = rayOrigin + rayDirection * distance;
  61. float diffuse = getLight(point);
  62. col = vec3(diffuse);
  63. //col = getNormal(point);
  64. //col = vec3(distance / 6.);
  65.  
  66. // Output to screen
  67. fragColor = vec4(col,1.0);
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement