rock.fragment.fx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #ifdef GL_ES
  2. precision highp float;
  3. #endif
  4. varying vec2 vPosition;
  5. varying vec2 vUV;
  6. vec3 hash(vec3 x)
  7. {
  8. x = vec3(dot(x, vec3(127.1, 311.7, 74.7)),
  9. dot(x, vec3(269.5, 183.3, 246.1)),
  10. dot(x, vec3(113.5, 271.9, 124.6)));
  11. return fract(sin(x)*43758.5453123);
  12. }
  13. // returns closest, second closest, and cell id
  14. vec3 voronoi(in vec3 x)
  15. {
  16. vec3 p = floor(x);
  17. vec3 f = fract(x);
  18. float id = 0.0;
  19. vec2 res = vec2(100.0);
  20. for (int k = -1; k <= 1; k++)
  21. for (int j = -1; j <= 1; j++)
  22. for (int i = -1; i <= 1; i++)
  23. {
  24. vec3 b = vec3(float(i), float(j), float(k));
  25. vec3 r = vec3(b) - f + hash(p + b);
  26. float d = dot(r, r);
  27. if (d < res.x)
  28. {
  29. id = dot(p + b, vec3(1.0, 57.0, 113.0));
  30. res = vec2(d, res.x);
  31. }
  32. else if (d < res.y)
  33. {
  34. res.y = d;
  35. }
  36. }
  37. return vec3(sqrt(res), abs(id));
  38. }
  39. const mat3 m = mat3(0.00, 0.80, 0.60,
  40. -0.80, 0.36, -0.48,
  41. -0.60, -0.48, 0.64);
  42. void main(void)
  43. {
  44. vec2 p = vUV;
  45. // camera movement
  46. float an = 0.5*0.1;
  47. vec3 ro = vec3(2.5*cos(an), 1.0, 2.5*sin(an));
  48. vec3 ta = vec3(0.0, 1.0, 0.0);
  49. // camera matrix
  50. vec3 ww = normalize(ta - ro);
  51. vec3 uu = normalize(cross(ww, vec3(0.0, 1.0, 0.0)));
  52. vec3 vv = normalize(cross(uu, ww));
  53. // create view ray
  54. vec3 rd = normalize(p.x*uu + p.y*vv + 1.5*ww);
  55. // sphere center
  56. vec3 sc = vec3(0.0, 1.0, 0.0);
  57. // raytrace
  58. float tmin = 10000.0;
  59. vec3 nor = vec3(0.0);
  60. float occ = 1.0;
  61. vec3 pos = vec3(0.0);
  62. // raytrace-plane
  63. float h = (0.0 - ro.y) / rd.y;
  64. if (h>0.0)
  65. {
  66. tmin = h;
  67. nor = vec3(0.0, 1.0, 0.0);
  68. pos = ro + h*rd;
  69. vec3 di = sc - pos;
  70. float l = length(di);
  71. occ = 1.0 - dot(nor, di / l)*1.0*1.0 / (l*l);
  72. }
  73. // raytrace-sphere
  74. vec3 ce = ro - sc;
  75. float b = dot(rd, ce);
  76. float c = dot(ce, ce) - 1.0;
  77. h = b*b - c;
  78. if (h>0.0)
  79. {
  80. h = -b - sqrt(h);
  81. if (h<tmin)
  82. {
  83. tmin = h;
  84. nor = normalize(ro + h*rd - sc);
  85. occ = 0.5 + 0.5*nor.y;
  86. }
  87. }
  88. // shading/lighting
  89. vec3 col = vec3(0.9);
  90. if (tmin<100.0)
  91. {
  92. pos = ro + tmin*rd;
  93. float f = voronoi(4.0*pos).x;
  94. f *= occ;
  95. col = vec3(f*1.2);
  96. col = mix(col, vec3(0.9), 1.0 - exp(-0.003*tmin*tmin));
  97. }
  98. col = sqrt(col);
  99. gl_FragColor = vec4(col, 1.0);
  100. }