grass-lighting-model-fsh.glsl 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #define PHONG
  2. uniform vec3 diffuse;
  3. uniform vec3 emissive;
  4. uniform vec3 specular;
  5. uniform float shininess;
  6. uniform float opacity;
  7. #include <common>
  8. #include <packing>
  9. #include <dithering_pars_fragment>
  10. #include <color_pars_fragment>
  11. #include <uv_pars_fragment>
  12. #include <map_pars_fragment>
  13. #include <alphamap_pars_fragment>
  14. #include <alphatest_pars_fragment>
  15. #include <alphahash_pars_fragment>
  16. #include <aomap_pars_fragment>
  17. #include <lightmap_pars_fragment>
  18. #include <emissivemap_pars_fragment>
  19. #include <envmap_common_pars_fragment>
  20. #include <envmap_pars_fragment>
  21. #include <fog_pars_fragment>
  22. #include <bsdfs>
  23. #include <lights_pars_begin>
  24. #include <normal_pars_fragment>
  25. // #include <lights_phong_pars_fragment>
  26. uniform sampler2D grassTexture;
  27. uniform vec3 grassLODColour;
  28. uniform float time;
  29. uniform mat3 normalMatrix;
  30. varying vec3 vGrassColour;
  31. varying vec4 vGrassParams;
  32. varying vec3 vNormal2;
  33. varying vec3 vWorldPosition;
  34. varying vec3 vViewPosition;
  35. struct BlinnPhongMaterial {
  36. vec3 diffuseColor;
  37. vec3 specularColor;
  38. float specularShininess;
  39. float specularStrength;
  40. };
  41. void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
  42. float wrap = 0.5;
  43. float dotNL = saturate( (dot( geometry.normal, directLight.direction ) + wrap) / (1.0 + wrap) );
  44. vec3 irradiance = dotNL * directLight.color;
  45. reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );
  46. reflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;
  47. // Backscatter fakery
  48. wrap = 0.5;
  49. float backLight = saturate((dot(geometry.viewDir, -directLight.direction) + wrap) / (1.0 + wrap));
  50. float falloff = 0.5;//mix(0.5, pow(1.0 - saturate(dot(geometry.viewDir, geometry.normal)), 2.0), 1.0) * 0.5;
  51. vec3 scatter = directLight.color * pow(backLight, 1.0) * falloff * BRDF_Lambert(material.diffuseColor);
  52. reflectedLight.indirectDiffuse += scatter * (1.0 - vGrassParams.z);
  53. }
  54. void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
  55. reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );
  56. }
  57. #define RE_Direct RE_Direct_BlinnPhong
  58. #define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong
  59. #include <shadowmap_pars_fragment>
  60. #include <bumpmap_pars_fragment>
  61. #include <normalmap_pars_fragment>
  62. #include <specularmap_pars_fragment>
  63. #include <logdepthbuf_pars_fragment>
  64. #include <clipping_planes_pars_fragment>
  65. void main() {
  66. vec3 viewDir = normalize(cameraPosition - vWorldPosition);
  67. #include <clipping_planes_fragment>
  68. vec4 diffuseColor = vec4( diffuse, opacity );
  69. // Grass
  70. float heightPercent = vGrassParams.x;
  71. float height = vGrassParams.y;
  72. float lodFadeIn = vGrassParams.z;
  73. float lodFadeOut = 1.0 - lodFadeIn;
  74. float grassMiddle = mix(
  75. smoothstep(abs(vGrassParams.w - 0.5), 0.0, 0.1), 1.0, lodFadeIn);
  76. float isSandy = saturate(linearstep(-11.0, -14.0, height));
  77. float density = 1.0 - isSandy;
  78. // Density is in the range [0, 1]
  79. // 0 being no grass
  80. // 1 being full grass
  81. float aoForDensity = mix(1.0, 0.25, density);
  82. float ao = mix(aoForDensity, 1.0, easeIn(heightPercent, 2.0));
  83. diffuseColor.rgb *= vGrassColour;
  84. diffuseColor.rgb *= mix(0.85, 1.0, grassMiddle);
  85. diffuseColor.rgb *= ao;
  86. ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
  87. vec3 totalEmissiveRadiance = emissive;
  88. #include <logdepthbuf_fragment>
  89. #include <map_fragment>
  90. #include <color_fragment>
  91. #include <alphamap_fragment>
  92. #include <alphatest_fragment>
  93. #include <alphahash_fragment>
  94. #include <specularmap_fragment>
  95. #include <normal_fragment_begin>
  96. #include <normal_fragment_maps>
  97. vec3 normal2 = normalize(vNormal2);
  98. normal = normalize(mix(vNormal, normal2, vGrassParams.w));
  99. #include <emissivemap_fragment>
  100. // #include <lights_phong_fragment>
  101. BlinnPhongMaterial material;
  102. material.diffuseColor = diffuseColor.rgb;
  103. material.specularColor = specular;
  104. #include <lights_fragment_begin>
  105. #include <lights_fragment_maps>
  106. #include <lights_fragment_end>
  107. #include <aomap_fragment>
  108. vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;
  109. #include <envmap_fragment>
  110. #include <opaque_fragment>
  111. #include <tonemapping_fragment>
  112. #include <colorspace_fragment>
  113. // #include <fog_fragment>
  114. gl_FragColor.xyz = CalculateFog(gl_FragColor.xyz, viewDir, vFogDepth);
  115. #include <premultiplied_alpha_fragment>
  116. #include <dithering_fragment>
  117. }