grid.fragment.fx 2.9 KB

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