Guest User

Untitled

a guest
Apr 10th, 2025
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1.  
  2. const float rad = 0.25;
  3. const float maxdepth = 4.00;
  4.  
  5. mat3 cotangent_frame(vec3 n, vec3 p, vec2 uv)
  6. {
  7. // get edge vectors of the pixel triangle
  8. vec3 dp1 = dFdx(p);
  9. vec3 dp2 = dFdy(p);
  10. vec2 duv1 = dFdx(uv);
  11. vec2 duv2 = dFdy(uv);
  12.  
  13. // solve the linear system
  14. vec3 dp2perp = cross(n, dp2); // cross(dp2, n);
  15. vec3 dp1perp = cross(dp1, n); // cross(n, dp1);
  16. vec3 t = dp2perp * duv1.x + dp1perp * duv2.x;
  17. vec3 b = dp2perp * duv1.y + dp1perp * duv2.y;
  18.  
  19. // construct a scale-invariant frame
  20. float invmax = inversesqrt(max(dot(t,t), dot(b,b)));
  21. return mat3(t * invmax, b * invmax, n);
  22. }
  23.  
  24. void SetupMaterial(inout Material mat)
  25. {
  26. vec2 tc = vTexCoord.st;
  27. tc = fract(tc);
  28. mat.Base = getTexel(tc);
  29.  
  30. vec2 centeruv = vec2(0.5, 0.5);
  31. vec2 uv = tc - centeruv;
  32.  
  33. float radius = rad;
  34. float dist = length(uv);
  35. float mask = step(dist, radius);
  36.  
  37. vec3 nWnormal = normalize(vWorldNormal.xyz);
  38. mat3 TBN = cotangent_frame(nWnormal, pixelpos.xyz, tc);
  39. mat3 invTBN = transpose(TBN);
  40.  
  41. vec3 raydir_3D = normalize(invTBN * (pixelpos.xyz - uCameraPos.xyz));
  42. vec3 raydir_2D = normalize(vec3(raydir_3D.xy, 0.0)); //camera dir in 2D on plane
  43. vec3 position = vec3(uv, 0.0);
  44.  
  45. //distance from intersection point to hole edge
  46. float total = dot(position, raydir_2D) - sqrt(
  47. pow
  48. (
  49. radius,
  50. 2.0
  51. )
  52. -
  53. pow
  54. (
  55. length(cross(position, raydir_2D)),
  56. 2.0
  57. )
  58. );
  59.  
  60. //get the depth
  61. vec3 face = vec3(0,0,1.0);
  62. float z = dot(raydir_3D, face);
  63. float x = sqrt(1.0 - pow(z, 2.0)); //the 1.0 is length(raydir)^2 aka 1.0
  64. float depth = (total * z) / x;
  65. depth = min(maxdepth, depth);
  66.  
  67. //circumference texture mapping
  68. vec3 id = vec3(depth) / raydir_3D;
  69. vec3 k = abs(id) - position * id;
  70. float kMin = k.z; //for square hole kMin = min(min(k.x, k.y), k.z);
  71. position += kMin * raydir_3D;
  72. vec3 vec = position;
  73.  
  74. vec = normalize(vec);
  75. float ang = atan(vec.y, vec.x);
  76.  
  77. //hole coordinates
  78. float holey = ang / 3.1415;
  79. float holex = depth;
  80.  
  81. vec4 hole = getTexel(vec2(holex, holey));
  82. hole.rgb *= 1.0 - (depth / maxdepth);
  83.  
  84. mat.Base = mix(mat.Base, hole, mask);
  85. }
Advertisement
Add Comment
Please, Sign In to add comment