ClusterLightCommon.glsl 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. // Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #ifndef ANKI_SHADERS_CLUSTER_LIGHT_COMMON_GLSL
  6. #define ANKI_SHADERS_CLUSTER_LIGHT_COMMON_GLSL
  7. #include "shaders/LightFunctions.glsl"
  8. // Common uniforms between lights
  9. struct LightingUniforms
  10. {
  11. vec4 projectionParams;
  12. vec4 rendererSizeTimePad1;
  13. vec4 nearFarClustererMagicPad1;
  14. mat3 invViewRotation;
  15. uvec4 tileCount;
  16. mat4 invViewProjMat;
  17. mat4 prevViewProjMat;
  18. mat4 invProjMat;
  19. };
  20. // Point or spot light
  21. struct Light
  22. {
  23. vec4 posRadius; // xyz: Light pos in view space. w: The -1/(radius^2)
  24. vec4 diffuseColorShadowmapId; // xyz: diff color, w: shadowmap tex ID
  25. vec4 specularColorRadius; // xyz: spec color, w: radius
  26. vec4 lightDir;
  27. vec4 outerCosInnerCos;
  28. mat4 texProjectionMat;
  29. };
  30. bool isSpotLight(in Light l)
  31. {
  32. return l.outerCosInnerCos.x != 0.0;
  33. }
  34. // Representation of a reflection probe
  35. struct ReflectionProbe
  36. {
  37. // Position of the prove in view space. Radius of probe squared
  38. vec4 positionRadiusSq;
  39. // Slice in u_reflectionsTex vector.
  40. vec4 cubemapIndexPad3;
  41. };
  42. // Decal
  43. struct Decal
  44. {
  45. vec4 diffUv;
  46. vec4 normRoughnessUv;
  47. mat4 texProjectionMat;
  48. vec4 blendFactors;
  49. };
  50. layout(ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING), std140, row_major) uniform u0_
  51. {
  52. LightingUniforms u_lightingUniforms;
  53. };
  54. #define u_near readFirstInvocationARB(u_lightingUniforms.nearFarClustererMagicPad1.x)
  55. #define u_far readFirstInvocationARB(u_lightingUniforms.nearFarClustererMagicPad1.y)
  56. #define u_clusterCountX readFirstInvocationARB(u_lightingUniforms.tileCount.x)
  57. #define u_clusterCountY readFirstInvocationARB(u_lightingUniforms.tileCount.y)
  58. #define u_clustererMagic readFirstInvocationARB(u_lightingUniforms.nearFarClustererMagicPad1.z)
  59. #define u_time readFirstInvocationARB(u_lightingUniforms.rendererSizeTimePad1.z)
  60. #define u_unprojectionParams readFirstInvocationARB(u_lightingUniforms.projectionParams)
  61. #define u_invViewRotation \
  62. mat3(readFirstInvocationARB(u_lightingUniforms.invViewRotation[0]), \
  63. readFirstInvocationARB(u_lightingUniforms.invViewRotation[1]), \
  64. readFirstInvocationARB(u_lightingUniforms.invViewRotation[2]))
  65. #define u_invProjMat \
  66. mat4(readFirstInvocationARB(u_lightingUniforms.invProjMat[0]), \
  67. readFirstInvocationARB(u_lightingUniforms.invProjMat[1]), \
  68. readFirstInvocationARB(u_lightingUniforms.invProjMat[2]), \
  69. readFirstInvocationARB(u_lightingUniforms.invProjMat[3]))
  70. #define u_invViewProjMat \
  71. mat4(readFirstInvocationARB(u_lightingUniforms.invViewProjMat[0]), \
  72. readFirstInvocationARB(u_lightingUniforms.invViewProjMat[1]), \
  73. readFirstInvocationARB(u_lightingUniforms.invViewProjMat[2]), \
  74. readFirstInvocationARB(u_lightingUniforms.invViewProjMat[3]))
  75. #define u_prevViewProjMat \
  76. mat4(readFirstInvocationARB(u_lightingUniforms.prevViewProjMat[0]), \
  77. readFirstInvocationARB(u_lightingUniforms.prevViewProjMat[1]), \
  78. readFirstInvocationARB(u_lightingUniforms.prevViewProjMat[2]), \
  79. readFirstInvocationARB(u_lightingUniforms.prevViewProjMat[3]))
  80. #ifdef FRAGMENT_SHADER
  81. layout(ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 1), std140, row_major) uniform u1_
  82. {
  83. Light u_lights[UBO_MAX_SIZE / (9 * 4 * 4)];
  84. };
  85. #ifdef LIGHT_INDIRECT
  86. layout(std140, row_major, ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 2)) uniform u2_
  87. {
  88. ReflectionProbe u_reflectionProbes[UBO_MAX_SIZE / (2 * 4 * 4)];
  89. };
  90. #endif
  91. #ifdef LIGHT_DECALS
  92. layout(std140, row_major, ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 3)) uniform u3_
  93. {
  94. Decal u_decals[UBO_MAX_SIZE / ((4 + 16) * 4)];
  95. };
  96. #endif
  97. layout(ANKI_SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 0), std430) readonly buffer s0_
  98. {
  99. uint u_clusters[];
  100. };
  101. layout(std430, ANKI_SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 1)) readonly buffer s1_
  102. {
  103. uint u_lightIndices[];
  104. };
  105. layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING)) uniform highp sampler2DArrayShadow u_spotMapArr;
  106. layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 1)) uniform highp samplerCubeArrayShadow u_omniMapArr;
  107. #ifdef LIGHT_INDIRECT
  108. layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 2)) uniform samplerCubeArray u_reflectionsTex;
  109. layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 3)) uniform samplerCubeArray u_irradianceTex;
  110. layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 4)) uniform sampler2D u_integrationLut;
  111. #endif
  112. #endif // FRAGMENT_SHADER
  113. #endif