grid.fragment.fx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #extension GL_OES_standard_derivatives : enable
  2. #define SQRT2 1.41421356
  3. #define PI 3.14159
  4. precision highp float;
  5. uniform vec3 mainColor;
  6. uniform vec3 lineColor;
  7. uniform vec4 gridControl;
  8. // Varying
  9. varying vec3 vPosition;
  10. varying vec3 vNormal;
  11. float getVisibility(float position) {
  12. // Major grid line every Frequency defined in material.
  13. float majorGridFrequency = gridControl.y;
  14. if (floor(position + 0.5) == floor(position / majorGridFrequency + 0.5) * majorGridFrequency)
  15. {
  16. return 1.0;
  17. }
  18. return gridControl.z;
  19. }
  20. float getAnisotropicAttenuation(float differentialLength) {
  21. const float maxNumberOfLines = 10.0;
  22. return clamp(1.0 / (differentialLength + 1.0) - 1.0 / maxNumberOfLines, 0.0, 1.0);
  23. }
  24. float isPointOnLine(float position, float differentialLength) {
  25. float fractionPartOfPosition = position - floor(position + 0.5); // fract part around unit [-0.5; 0.5]
  26. fractionPartOfPosition /= differentialLength; // adapt to the screen space size it takes
  27. fractionPartOfPosition = clamp(fractionPartOfPosition, -1., 1.);
  28. float result = 0.5 + 0.5 * cos(fractionPartOfPosition * PI); // Convert to 0-1 for antialiasing.
  29. return result;
  30. }
  31. float contributionOnAxis(float position) {
  32. float differentialLength = length(vec2(dFdx(position), dFdy(position)));
  33. differentialLength *= SQRT2; // Multiply by SQRT2 for diagonal length
  34. // Is the point on the line.
  35. float result = isPointOnLine(position, differentialLength);
  36. // Add dynamic visibility.
  37. float visibility = getVisibility(position);
  38. result *= visibility;
  39. // Anisotropic filtering.
  40. float anisotropicAttenuation = getAnisotropicAttenuation(differentialLength);
  41. result *= anisotropicAttenuation;
  42. return result;
  43. }
  44. float normalImpactOnAxis(float x) {
  45. float normalImpact = clamp(1.0 - 2.8 * abs(x * x * x), 0.0, 1.0);
  46. return normalImpact;
  47. }
  48. void main(void) {
  49. // Scale position to the requested ratio.
  50. float gridRatio = gridControl.x;
  51. vec3 gridPos = vPosition / gridRatio;
  52. // Find the contribution of each coords.
  53. float x = contributionOnAxis(gridPos.x);
  54. float y = contributionOnAxis(gridPos.y);
  55. float z = contributionOnAxis(gridPos.z);
  56. // Find the normal contribution.
  57. vec3 normal = normalize(vNormal);
  58. x *= normalImpactOnAxis(normal.x);
  59. y *= normalImpactOnAxis(normal.y);
  60. z *= normalImpactOnAxis(normal.z);
  61. // Create the grid value by combining axis.
  62. float grid = clamp(x + y + z, 0., 1.);
  63. // Create the color.
  64. vec3 gridColor = mix(mainColor, lineColor, grid);
  65. #ifdef TRANSPARENT
  66. float opacity = clamp(grid, 0.08, gridControl.w);
  67. gl_FragColor = vec4(gridColor.rgb, opacity);
  68. #else
  69. // Apply the color.
  70. gl_FragColor = vec4(gridColor.rgb, 1.0);
  71. #endif
  72. }