Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const float rad = 0.25;
- const float maxdepth = 4.00;
- mat3 cotangent_frame(vec3 n, vec3 p, vec2 uv)
- {
- // get edge vectors of the pixel triangle
- vec3 dp1 = dFdx(p);
- vec3 dp2 = dFdy(p);
- vec2 duv1 = dFdx(uv);
- vec2 duv2 = dFdy(uv);
- // solve the linear system
- vec3 dp2perp = cross(n, dp2); // cross(dp2, n);
- vec3 dp1perp = cross(dp1, n); // cross(n, dp1);
- vec3 t = dp2perp * duv1.x + dp1perp * duv2.x;
- vec3 b = dp2perp * duv1.y + dp1perp * duv2.y;
- // construct a scale-invariant frame
- float invmax = inversesqrt(max(dot(t,t), dot(b,b)));
- return mat3(t * invmax, b * invmax, n);
- }
- void SetupMaterial(inout Material mat)
- {
- vec2 tc = vTexCoord.st;
- tc = fract(tc);
- mat.Base = getTexel(tc);
- vec2 centeruv = vec2(0.5, 0.5);
- vec2 uv = tc - centeruv;
- float radius = rad;
- float dist = length(uv);
- float mask = step(dist, radius);
- vec3 nWnormal = normalize(vWorldNormal.xyz);
- mat3 TBN = cotangent_frame(nWnormal, pixelpos.xyz, tc);
- mat3 invTBN = transpose(TBN);
- vec3 raydir_3D = normalize(invTBN * (pixelpos.xyz - uCameraPos.xyz));
- vec3 raydir_2D = normalize(vec3(raydir_3D.xy, 0.0)); //camera dir in 2D on plane
- vec3 position = vec3(uv, 0.0);
- //distance from intersection point to hole edge
- float total = dot(position, raydir_2D) - sqrt(
- pow
- (
- radius,
- 2.0
- )
- -
- pow
- (
- length(cross(position, raydir_2D)),
- 2.0
- )
- );
- //get the depth
- vec3 face = vec3(0,0,1.0);
- float z = dot(raydir_3D, face);
- float x = sqrt(1.0 - pow(z, 2.0)); //the 1.0 is length(raydir)^2 aka 1.0
- float depth = (total * z) / x;
- depth = min(maxdepth, depth);
- //circumference texture mapping
- vec3 id = vec3(depth) / raydir_3D;
- vec3 k = abs(id) - position * id;
- float kMin = k.z; //for square hole kMin = min(min(k.x, k.y), k.z);
- position += kMin * raydir_3D;
- vec3 vec = position;
- vec = normalize(vec);
- float ang = atan(vec.y, vec.x);
- //hole coordinates
- float holey = ang / 3.1415;
- float holex = depth;
- vec4 hole = getTexel(vec2(holex, holey));
- hole.rgb *= 1.0 - (depth / maxdepth);
- mat.Base = mix(mat.Base, hole, mask);
- }
Advertisement
Add Comment
Please, Sign In to add comment