LitParticle.glsl 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include "Uniforms.glsl"
  2. #include "Samplers.glsl"
  3. #include "Transform.glsl"
  4. #include "Lighting.glsl"
  5. #include "Fog.glsl"
  6. varying vec2 vTexCoord;
  7. varying vec4 vWorldPos;
  8. #ifdef VERTEXCOLOR
  9. varying vec4 vColor;
  10. #endif
  11. #ifdef PERPIXEL
  12. #ifdef SHADOW
  13. #ifndef GL_ES
  14. varying vec4 vShadowPos[NUMCASCADES];
  15. #else
  16. varying highp vec4 vShadowPos[NUMCASCADES];
  17. #endif
  18. #endif
  19. #ifdef SPOTLIGHT
  20. varying vec4 vSpotPos;
  21. #endif
  22. #ifdef POINTLIGHT
  23. varying vec3 vCubeMaskVec;
  24. #endif
  25. #else
  26. varying vec3 vVertexLight;
  27. #endif
  28. void VS()
  29. {
  30. mat4 modelMatrix = iModelMatrix;
  31. vec3 worldPos = GetWorldPos(modelMatrix);
  32. gl_Position = GetClipPos(worldPos);
  33. vTexCoord = GetTexCoord(iTexCoord);
  34. vWorldPos = vec4(worldPos, GetDepth(gl_Position));
  35. #ifdef VERTEXCOLOR
  36. vColor = iColor;
  37. #endif
  38. #ifdef PERPIXEL
  39. // Per-pixel forward lighting
  40. vec4 projWorldPos = vec4(worldPos, 1.0);
  41. #ifdef SHADOW
  42. // Shadow projection: transform from world space to shadow space
  43. for (int i = 0; i < NUMCASCADES; i++)
  44. vShadowPos[i] = GetShadowPos(i, vec3(0, 0, 0), projWorldPos);
  45. #endif
  46. #ifdef SPOTLIGHT
  47. // Spotlight projection: transform from world space to projector texture coordinates
  48. vSpotPos = projWorldPos * cLightMatrices[0];
  49. #endif
  50. #ifdef POINTLIGHT
  51. vCubeMaskVec = (worldPos - cLightPos.xyz) * mat3(cLightMatrices[0][0].xyz, cLightMatrices[0][1].xyz, cLightMatrices[0][2].xyz);
  52. #endif
  53. #else
  54. // Ambient & per-vertex lighting
  55. vVertexLight = GetAmbient(GetZonePos(worldPos));
  56. #ifdef NUMVERTEXLIGHTS
  57. for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
  58. vVertexLight += GetVertexLightVolumetric(i, worldPos) * cVertexLights[i * 3].rgb;
  59. #endif
  60. #endif
  61. }
  62. void PS()
  63. {
  64. // Get material diffuse albedo
  65. #ifdef DIFFMAP
  66. vec4 diffInput = texture2D(sDiffMap, vTexCoord);
  67. #ifdef ALPHAMASK
  68. if (diffInput.a < 0.5)
  69. discard;
  70. #endif
  71. vec4 diffColor = cMatDiffColor * diffInput;
  72. #else
  73. vec4 diffColor = cMatDiffColor;
  74. #endif
  75. #ifdef VERTEXCOLOR
  76. diffColor *= vColor;
  77. #endif
  78. // Get fog factor
  79. #ifdef HEIGHTFOG
  80. float fogFactor = GetHeightFogFactor(vWorldPos.w, vWorldPos.y);
  81. #else
  82. float fogFactor = GetFogFactor(vWorldPos.w);
  83. #endif
  84. #ifdef PERPIXEL
  85. // Per-pixel forward lighting
  86. vec3 lightColor;
  87. vec3 lightDir;
  88. vec3 finalColor;
  89. float diff = GetDiffuseVolumetric(vWorldPos.xyz);
  90. #ifdef SHADOW
  91. diff *= GetShadow(vShadowPos, vWorldPos.w);
  92. #endif
  93. #if defined(SPOTLIGHT)
  94. lightColor = vSpotPos.w > 0.0 ? texture2DProj(sLightSpotMap, vSpotPos).rgb * cLightColor.rgb : vec3(0.0, 0.0, 0.0);
  95. #elif defined(CUBEMASK)
  96. lightColor = textureCube(sLightCubeMap, vCubeMaskVec).rgb * cLightColor.rgb;
  97. #else
  98. lightColor = cLightColor.rgb;
  99. #endif
  100. finalColor = diff * lightColor * diffColor.rgb;
  101. gl_FragColor = vec4(GetLitFog(finalColor, fogFactor), diffColor.a);
  102. #else
  103. // Ambient & per-vertex lighting
  104. vec3 finalColor = vVertexLight * diffColor.rgb;
  105. gl_FragColor = vec4(GetFog(finalColor, fogFactor), diffColor.a);
  106. #endif
  107. }