ClusterLightCommon.glsl 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. // Copyright (C) 2009-2018, 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. #include "shaders/Clusterer.glsl"
  9. // Common uniforms between lights
  10. struct LightingUniforms
  11. {
  12. vec4 unprojectionParams;
  13. vec4 rendererSizeTimeNear;
  14. vec4 cameraPosFar;
  15. ClustererMagicValues clustererMagicValues;
  16. uvec4 tileCount;
  17. mat4 viewMat;
  18. mat4 invViewMat;
  19. mat4 projMat;
  20. mat4 invProjMat;
  21. mat4 viewProjMat;
  22. mat4 invViewProjMat;
  23. mat4 prevViewProjMat;
  24. mat4 prevViewProjMatMulInvViewProjMat; // Used to re-project previous frames
  25. };
  26. // Point light
  27. struct PointLight
  28. {
  29. vec4 posRadius; // xyz: Light pos in world space. w: The 1/(radius^2)
  30. vec4 diffuseColorTileSize; // xyz: diff color, w: tile size in the shadow atlas
  31. vec2 radiusPad1; // x: radius
  32. uvec2 atlasTiles; // x: encodes 6 uints with atlas tile indices in the x dir. y: same for y dir.
  33. };
  34. const uint SIZEOF_POINT_LIGHT = 3 * SIZEOF_VEC4;
  35. // Spot light
  36. struct SpotLight
  37. {
  38. vec4 posRadius; // xyz: Light pos in world space. w: The 1/(radius^2)
  39. vec4 diffuseColorShadowmapId; // xyz: diff color, w: shadowmap tex ID
  40. vec4 lightDirRadius; // xyz: light direction, w: radius
  41. vec4 outerCosInnerCos;
  42. mat4 texProjectionMat;
  43. };
  44. const uint SIZEOF_SPOT_LIGHT = 4 * SIZEOF_VEC4 + SIZEOF_MAT4;
  45. // Representation of a reflection probe
  46. struct ReflectionProbe
  47. {
  48. // Position of the prove in view space. Radius of probe squared
  49. vec4 positionRadiusSq;
  50. // Slice in u_reflectionsTex vector.
  51. vec4 cubemapIndexPad3;
  52. };
  53. const uint SIZEOF_REFLECTION_PROBE = 2 * SIZEOF_VEC4;
  54. // Decal
  55. struct Decal
  56. {
  57. vec4 diffUv;
  58. vec4 normRoughnessUv;
  59. mat4 texProjectionMat;
  60. vec4 blendFactors;
  61. };
  62. const uint SIZEOF_DECAL = 3 * SIZEOF_VEC4 + SIZEOF_MAT4;
  63. //
  64. // Common uniforms
  65. //
  66. #if defined(LIGHT_COMMON_UNIS)
  67. const uint _NEXT_UBO_BINDING = LIGHT_UBO_BINDING + 1;
  68. layout(ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING), std140, row_major) uniform lu0_
  69. {
  70. LightingUniforms u_lightingUniforms;
  71. };
  72. # define u_near UNIFORM(u_lightingUniforms.rendererSizeTimeNear.w)
  73. # define u_far UNIFORM(u_lightingUniforms.cameraPosFar.w)
  74. # define u_cameraPos UNIFORM(u_lightingUniforms.cameraPosFar.xyz)
  75. # define u_clusterCountX UNIFORM(u_lightingUniforms.tileCount.x)
  76. # define u_clusterCountY UNIFORM(u_lightingUniforms.tileCount.y)
  77. # define u_clustererMagic u_lightingUniforms.clustererMagicValues
  78. # define u_time UNIFORM(u_lightingUniforms.rendererSizeTimeNear.z)
  79. # define u_unprojectionParams UNIFORM(u_lightingUniforms.unprojectionParams)
  80. # define u_rendererSize u_lightingUniforms.rendererSizeTimeNear.xy
  81. # define u_viewMat u_lightingUniforms.viewMat
  82. # define u_invViewMat u_lightingUniforms.invViewMat
  83. # define u_projMat u_lightingUniforms.projMat
  84. # define u_invProjMat u_lightingUniforms.invProjMat
  85. # define u_viewProjMat u_lightingUniforms.viewProjMat
  86. # define u_invViewProjMat u_lightingUniforms.invViewProjMat
  87. # define u_prevViewProjMat u_lightingUniforms.prevViewProjMat
  88. # define u_prevViewProjMatMulInvViewProjMat u_lightingUniforms.prevViewProjMatMulInvViewProjMat
  89. #else
  90. const uint _NEXT_UBO_BINDING = LIGHT_UBO_BINDING;
  91. #endif
  92. //
  93. // Light uniforms
  94. //
  95. #if defined(LIGHT_LIGHTS)
  96. const uint _NEXT_UBO_BINDING_2 = _NEXT_UBO_BINDING + 2;
  97. const uint _NEXT_TEX_BINDING_2 = LIGHT_TEX_BINDING + 1;
  98. layout(ANKI_UBO_BINDING(LIGHT_SET, _NEXT_UBO_BINDING), std140) uniform u1_
  99. {
  100. PointLight u_pointLights[UBO_MAX_SIZE / SIZEOF_POINT_LIGHT];
  101. };
  102. layout(ANKI_UBO_BINDING(LIGHT_SET, _NEXT_UBO_BINDING + 1), std140, row_major) uniform u2_
  103. {
  104. SpotLight u_spotLights[UBO_MAX_SIZE / SIZEOF_SPOT_LIGHT];
  105. };
  106. layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 0)) uniform highp sampler2D u_shadowTex;
  107. #else
  108. const uint _NEXT_UBO_BINDING_2 = _NEXT_UBO_BINDING;
  109. const uint _NEXT_TEX_BINDING_2 = LIGHT_TEX_BINDING;
  110. #endif
  111. //
  112. // Indirect uniforms
  113. //
  114. #if defined(LIGHT_INDIRECT)
  115. const uint _NEXT_UBO_BINDING_3 = _NEXT_UBO_BINDING_2 + 1;
  116. const uint _NEXT_TEX_BINDING_3 = _NEXT_TEX_BINDING_2 + 3;
  117. layout(std140, row_major, ANKI_UBO_BINDING(LIGHT_SET, _NEXT_UBO_BINDING_2)) uniform u3_
  118. {
  119. ReflectionProbe u_reflectionProbes[UBO_MAX_SIZE / SIZEOF_REFLECTION_PROBE];
  120. };
  121. layout(ANKI_TEX_BINDING(LIGHT_SET, _NEXT_TEX_BINDING_2 + 0)) uniform samplerCubeArray u_reflectionsTex;
  122. layout(ANKI_TEX_BINDING(LIGHT_SET, _NEXT_TEX_BINDING_2 + 1)) uniform samplerCubeArray u_irradianceTex;
  123. layout(ANKI_TEX_BINDING(LIGHT_SET, _NEXT_TEX_BINDING_2 + 2)) uniform sampler2D u_integrationLut;
  124. #else
  125. const uint _NEXT_UBO_BINDING_3 = _NEXT_UBO_BINDING_2;
  126. const uint _NEXT_TEX_BINDING_3 = _NEXT_TEX_BINDING_2;
  127. #endif
  128. //
  129. // Decal uniforms
  130. //
  131. #if defined(LIGHT_DECALS)
  132. layout(std140, row_major, ANKI_UBO_BINDING(LIGHT_SET, _NEXT_UBO_BINDING_3)) uniform u4_
  133. {
  134. Decal u_decals[UBO_MAX_SIZE / SIZEOF_DECAL];
  135. };
  136. layout(ANKI_TEX_BINDING(LIGHT_SET, _NEXT_TEX_BINDING_3 + 0)) uniform sampler2D u_diffDecalTex;
  137. layout(ANKI_TEX_BINDING(LIGHT_SET, _NEXT_TEX_BINDING_3 + 1)) uniform sampler2D u_specularRoughnessDecalTex;
  138. #endif
  139. //
  140. // Cluster uniforms
  141. //
  142. layout(ANKI_SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 0), std430) readonly buffer s0_
  143. {
  144. uint u_clusters[];
  145. };
  146. layout(std430, ANKI_SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 1)) readonly buffer s1_
  147. {
  148. uint u_lightIndices[];
  149. };
  150. #endif