ClusterLightCommon.glsl 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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 light
  21. struct PointLight
  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. };
  27. // Spot light
  28. struct SpotLight
  29. {
  30. vec4 posRadius; // xyz: Light pos in view space. w: The -1/(radius^2)
  31. vec4 diffuseColorShadowmapId; // xyz: diff color, w: shadowmap tex ID
  32. vec4 specularColorRadius; // xyz: spec color, w: radius
  33. vec4 lightDir;
  34. vec4 outerCosInnerCos;
  35. mat4 texProjectionMat;
  36. };
  37. // Representation of a reflection probe
  38. struct ReflectionProbe
  39. {
  40. // Position of the prove in view space. Radius of probe squared
  41. vec4 positionRadiusSq;
  42. // Slice in u_reflectionsTex vector.
  43. vec4 cubemapIndexPad3;
  44. };
  45. // Decal
  46. struct Decal
  47. {
  48. vec4 diffUv;
  49. vec4 normRoughnessUv;
  50. mat4 texProjectionMat;
  51. vec4 blendFactors;
  52. };
  53. layout(ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING), std140, row_major) uniform u0_
  54. {
  55. LightingUniforms u_lightingUniforms;
  56. };
  57. #define u_near readFirstInvocationARB(u_lightingUniforms.nearFarClustererMagicPad1.x)
  58. #define u_far readFirstInvocationARB(u_lightingUniforms.nearFarClustererMagicPad1.y)
  59. #define u_clusterCountX readFirstInvocationARB(u_lightingUniforms.tileCount.x)
  60. #define u_clusterCountY readFirstInvocationARB(u_lightingUniforms.tileCount.y)
  61. #define u_clustererMagic readFirstInvocationARB(u_lightingUniforms.nearFarClustererMagicPad1.z)
  62. #define u_time readFirstInvocationARB(u_lightingUniforms.rendererSizeTimePad1.z)
  63. #define u_unprojectionParams readFirstInvocationARB(u_lightingUniforms.projectionParams)
  64. #define u_invViewRotation \
  65. mat3(readFirstInvocationARB(u_lightingUniforms.invViewRotation[0]), \
  66. readFirstInvocationARB(u_lightingUniforms.invViewRotation[1]), \
  67. readFirstInvocationARB(u_lightingUniforms.invViewRotation[2]))
  68. #define u_invProjMat \
  69. mat4(readFirstInvocationARB(u_lightingUniforms.invProjMat[0]), \
  70. readFirstInvocationARB(u_lightingUniforms.invProjMat[1]), \
  71. readFirstInvocationARB(u_lightingUniforms.invProjMat[2]), \
  72. readFirstInvocationARB(u_lightingUniforms.invProjMat[3]))
  73. #define u_invViewProjMat \
  74. mat4(readFirstInvocationARB(u_lightingUniforms.invViewProjMat[0]), \
  75. readFirstInvocationARB(u_lightingUniforms.invViewProjMat[1]), \
  76. readFirstInvocationARB(u_lightingUniforms.invViewProjMat[2]), \
  77. readFirstInvocationARB(u_lightingUniforms.invViewProjMat[3]))
  78. #define u_prevViewProjMat \
  79. mat4(readFirstInvocationARB(u_lightingUniforms.prevViewProjMat[0]), \
  80. readFirstInvocationARB(u_lightingUniforms.prevViewProjMat[1]), \
  81. readFirstInvocationARB(u_lightingUniforms.prevViewProjMat[2]), \
  82. readFirstInvocationARB(u_lightingUniforms.prevViewProjMat[3]))
  83. #ifdef FRAGMENT_SHADER
  84. layout(ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 1), std140) uniform u1_
  85. {
  86. PointLight u_pointLights[UBO_MAX_SIZE / (3 * 4 * 4)];
  87. };
  88. layout(ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 2), std140, row_major) uniform u2_
  89. {
  90. SpotLight u_spotLights[UBO_MAX_SIZE / (9 * 4 * 4)];
  91. };
  92. #ifdef LIGHT_INDIRECT
  93. layout(std140, row_major, ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 3)) uniform u3_
  94. {
  95. ReflectionProbe u_reflectionProbes[UBO_MAX_SIZE / (2 * 4 * 4)];
  96. };
  97. #endif
  98. #ifdef LIGHT_DECALS
  99. layout(std140, row_major, ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 4)) uniform u4_
  100. {
  101. Decal u_decals[UBO_MAX_SIZE / ((4 + 16) * 4)];
  102. };
  103. #endif
  104. layout(ANKI_SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 0), std430) readonly buffer s0_
  105. {
  106. uint u_clusters[];
  107. };
  108. layout(std430, ANKI_SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 1)) readonly buffer s1_
  109. {
  110. uint u_lightIndices[];
  111. };
  112. layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING)) uniform highp sampler2DArrayShadow u_spotMapArr;
  113. layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 1)) uniform highp samplerCubeArrayShadow u_omniMapArr;
  114. #ifdef LIGHT_INDIRECT
  115. layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 2)) uniform samplerCubeArray u_reflectionsTex;
  116. layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 3)) uniform samplerCubeArray u_irradianceTex;
  117. layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 4)) uniform sampler2D u_integrationLut;
  118. #endif
  119. #endif // FRAGMENT_SHADER
  120. #endif