Advertisement
mskf

Untitled

Mar 28th, 2022
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.96 KB | None | 0 0
  1. # define IR iResolution
  2. # define IT iTime
  3. # define PI 3.1415916
  4. # define AA 0
  5.  
  6. float INF = 100000.0;
  7.  
  8. //sdf
  9. mat3 rotation_matrix(float x,float y,float z){
  10. return mat3(
  11. vec3(1.,0,0),
  12. vec3(0,cos(x),sin(x)),
  13. vec3(0,-sin(x),cos(x))
  14. ) * mat3(
  15. vec3(cos(y),0,-sin(y)),
  16. vec3(0,1.,0),
  17. vec3(sin(y),0,cos(y))
  18. ) * mat3(
  19. vec3(cos(z),sin(z),0),
  20. vec3(-sin(z),cos(z),0),
  21. vec3(0,0,1.)
  22. );
  23. }
  24.  
  25. float sdf_sphere(vec3 p,vec3 c,float r){
  26. return length(p - c) - r;
  27. }
  28.  
  29. float sdf_sphere2(vec3 p){
  30. vec3 c = vec3(-4.,2.,2.);
  31. return length(p - c) - 2.;
  32. }
  33.  
  34.  
  35. float sdf_plane(vec3 p){
  36. return abs(p.z);
  37. }
  38.  
  39. float sdf_torus( vec3 p, vec2 t )
  40. {
  41. vec2 q = vec2(length(p.xz)-t.x,p.y);
  42.  
  43. return length(q)-t.y;
  44. }
  45.  
  46. float sdf(vec3 p){
  47. float minv = INF;
  48.  
  49. float slow = IT/8. * PI, mid = IT/4. * PI, fast = IT/2. * PI;
  50. //mid = 0.;
  51.  
  52. //center sphere
  53. float dist = sdf_sphere(p,vec3(-4.,0,0),.5);
  54. if(dist < minv){ minv = dist; }
  55.  
  56. //torus
  57. dist = sdf_torus(inverse(rotation_matrix(2.25*PI/4. + mid,PI/4. + 0., PI/4. + mid)) * p,vec2(2.,.15));
  58. if(dist < minv) minv = dist;
  59.  
  60. dist = sdf_torus(inverse(rotation_matrix(-2.25*PI/4. - mid,PI/4. + 0.,-PI/4. - mid)) * p,vec2(2.,.15));
  61. if(dist < minv) minv = dist;
  62.  
  63. //surrounding sphere
  64. float _d = 2.1;
  65. vec3 centers[] = vec3[](vec3(-4.,0,_d),vec3(-4.,0,-_d),vec3(-4.,_d,0),vec3(-4.,-_d,0));
  66. for(int i = 0;i < 4;i ++){
  67. dist = sdf_sphere(p,centers[i],.35);
  68. if(dist < minv){
  69. minv = dist;
  70. }
  71. }
  72.  
  73. return minv;
  74. }
  75.  
  76. vec3 get_normal(vec3 p){
  77. float e = .00001;
  78. return normalize(vec3(
  79. sdf(vec3(p.x + e,p.y,p.z)) - sdf(vec3(p.x - e,p.y,p.z)),
  80. sdf(vec3(p.x,p.y + e,p.z)) - sdf(vec3(p.x,p.y - e,p.z)),
  81. sdf(vec3(p.x,p.y,p.z + e)) - sdf(vec3(p.x,p.y,p.z - e))
  82. ));
  83. }
  84.  
  85. vec3 phong(vec3 ro,vec3 p){
  86. vec3 k_a = vec3(.2), k_d = vec3(.7,.2,.2), k_s = vec3(1.);
  87. vec3 i_a = vec3(.2), i_d = vec3(1.,0,0), i_s = vec3(1.,0,0);
  88. float alpha = 10.;
  89.  
  90. vec3 res = i_a * k_a;
  91.  
  92. vec3 light = vec3(10.);
  93. vec3 N = get_normal(p);
  94. vec3 L = normalize(light - p);
  95. vec3 R = -reflect(L,N);
  96. vec3 V = normalize(ro - p);
  97.  
  98. res += k_d * (dot(L,N)) * i_d + k_s * pow(max(0.,dot(R,V)),alpha) * i_s;
  99. return res;
  100. }
  101.  
  102. float ray_marching(vec3 ro, vec3 rd){
  103. float e = 0.0001;
  104. float depth = 0.;
  105.  
  106. for(int i = 0;i<255;i++){
  107. float dist = sdf(depth * rd + ro);
  108.  
  109. if (dist < e){
  110. return depth;
  111. }
  112.  
  113. depth += dist;
  114.  
  115. if (dist > 1000.){
  116. return -1.;
  117. }
  118. }
  119. return -1.;
  120. }
  121.  
  122. //Camera
  123. struct OrthoGraphicCamera {
  124. vec3 o;
  125. vec3 f;
  126. vec3 u;
  127. vec3 r;
  128. float scale;
  129. }
  130.  
  131.  
  132. OrthoGraphicCamera get_orthograpic_camera(vec3 lookAt,vec3 eye,vec3 up,float scale){
  133. return OrthoGraphicCamera(
  134. eye,
  135. normalize(lookAt - eye),
  136. normalize(up),
  137. normalize(cross(lookAt,up)),
  138. scale
  139. );
  140. }
  141.  
  142. vec3 get_ray_origin_o(OrthoGraphicCamera camera,vec2 uv){
  143. return camera.o + (uv.x * camera.r + uv.y * camera.u) * camera.scale;
  144. }
  145.  
  146. vec3 get_ray_direction_o(OrthoGraphicCamera camera){
  147. return camera.f;
  148. }
  149.  
  150. struct PerspectiveCamera {
  151. vec3 o;
  152. vec3 f;
  153. vec3 u;
  154. vec3 r;
  155. float fov;// 0-180
  156. float aspect; // w/d
  157. float near;// 0.1
  158. float far;//2000
  159. }
  160.  
  161. PerspectiveCamera get_perspective_camera(vec3 lookAt,vec3 eye,vec3 up,float fov,float aspect,float near,float far){
  162. return PerspectiveCamera(
  163. eye,
  164. normalize(lookAt - eye),
  165. normalize(up),
  166. normalize(cross(lookAt,up)),
  167. fov,
  168. aspect,
  169. near,
  170. far
  171. );
  172. }
  173.  
  174. vec3 get_ray_origin_p(PerspectiveCamera camera,vec2 uv){
  175. return camera.o;
  176. }
  177.  
  178. vec3_get_ray_direction_p(PerspectiveCamera camera,vec2 uv){
  179. float ybase = sin(camera.fov / 180. * PI) * camera.near;
  180. float xbase = ybase * camera.aspect;
  181. return normalize(camera.f * camera.near + camera.u * uv.y * ybase + camera.r * uv.x * xbase);
  182. }
  183.  
  184. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  185. {
  186. vec2 uv = fragCoord/IR.xy;
  187. uv -= .5;
  188. uv.x *= IR.x / IR.y;
  189. vec3 eye = vec3(0);
  190. vec3 lookAt = vec3(-1.,0,0);
  191. vec3 up = vec3(0,0,1.);
  192. PerspectiveCamera camera = get_perspective_camera(lookAt,eye,up,50.,1.,0.1,2000.);
  193.  
  194. vec3 tot = vec3(0);
  195. # if AA > 0
  196. for(int i = 0;i<AA;i++)
  197. for(int j = 0;j<AA;j++){
  198. # endif
  199.  
  200. vec3 ro = get_ray_origin_p(camera,uv);
  201. vec3 rd = get_ray_direction_p(camera,uv);
  202. float depth = ray_marching(ro,rd);
  203. vec3 col = vec3(1.);
  204. if (depth != -1.){
  205. col = phong(ro,ro+depth*rd);
  206. }
  207. tot += col;
  208. # if AA > 0
  209. }
  210. tot /= AA * AA;
  211. # endif
  212.  
  213. fragColor = vec4(tot,1.);
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement