Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.23 KB | None | 0 0
  1. float rand2D(in vec2 co){
  2. return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
  3. }
  4.  
  5. vec4 stochasticSample(sampler2D tex, vec2 uv)
  6. {
  7. //triangle vertices and blend weights
  8. //BW_vx[0...2].xyz = triangle verts
  9. //BW_vx[3].xy = blend weights (z is unused)
  10. mat4x3 BW_vx;
  11.  
  12. //uv transformed into triangular grid space with UV scaled by approximation of 2*sqrt(3)
  13. vec2 skewUV = mat2(1.0, 0.0, -0.57735027, 1.15470054) * (3.464 * uv);
  14.  
  15. //vertex IDs and barycentric coords
  16. vec2 vxID = vec2 (floor(skewUV));
  17. vec3 barry = vec3 (fract(skewUV), 0);
  18. barry.z = 1.0-barry.x-barry.y;
  19.  
  20. BW_vx = ((barry.z>0) ?
  21. mat4x3(vec3(vxID, 0), vec3(vxID + vec2(0, 1), 0), vec3(vxID + vec2(1, 0), 0), barry.zyx) :
  22. mat4x3(vec3(vxID + vec2 (1, 1), 0), vec3(vxID + vec2 (1, 0), 0), vec3(vxID + vec2 (0, 1), 0), vec3(-barry.z, 1.0-barry.y, 1.0-barry.x)));
  23.  
  24. //calculate derivatives to avoid triangular grid artifacts
  25. vec2 dx = dFdx(uv);
  26. vec2 dy = dFdy(uv);
  27.  
  28. //blend samples with calculated weights
  29. return texture2D(tex, uv + rand2D(BW_vx[0].xy)) * BW_vx[3].x +
  30. texture2D(tex, uv + rand2D(BW_vx[1].xy)) * BW_vx[3].y +
  31. texture2D(tex, uv + rand2D(BW_vx[2].xy)) * BW_vx[3].z;
  32. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement