grid.fragment.fx 3.3 KB

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