ClusteredShadingCommon.glsl 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <AnKi/Shaders/LightFunctions.glsl>
  7. //
  8. // Common uniforms
  9. //
  10. #if defined(CLUSTERED_SHADING_UNIFORMS_BINDING)
  11. layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_UNIFORMS_BINDING, scalar) uniform b_clusteredShading
  12. {
  13. ClusteredShadingUniforms u_clusteredShading;
  14. };
  15. #endif
  16. //
  17. // Light uniforms (3)
  18. //
  19. #if defined(CLUSTERED_SHADING_LIGHTS_BINDING)
  20. layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_LIGHTS_BINDING, scalar) uniform b_pointLights
  21. {
  22. PointLight u_pointLights2[MAX_VISIBLE_POINT_LIGHTS];
  23. };
  24. layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_LIGHTS_BINDING + 1, scalar) uniform b_spotLights
  25. {
  26. SpotLight u_spotLights2[MAX_VISIBLE_SPOT_LIGHTS];
  27. };
  28. layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_LIGHTS_BINDING + 2) uniform texture2D u_shadowAtlasTex;
  29. #endif
  30. //
  31. // Reflection probes (3)
  32. //
  33. #if defined(CLUSTERED_SHADING_REFLECTIONS_BINDING)
  34. layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_REFLECTIONS_BINDING, scalar) uniform b_reflectionProbes
  35. {
  36. ReflectionProbe u_reflectionProbes[MAX_VISIBLE_REFLECTION_PROBES];
  37. };
  38. layout(set = CLUSTERED_SHADING_SET,
  39. binding = CLUSTERED_SHADING_REFLECTIONS_BINDING + 1) uniform textureCubeArray u_reflectionsTex;
  40. layout(set = CLUSTERED_SHADING_SET,
  41. binding = CLUSTERED_SHADING_REFLECTIONS_BINDING + 2) uniform texture2D u_integrationLut;
  42. #endif
  43. //
  44. // Decal uniforms (3)
  45. //
  46. #if defined(CLUSTERED_SHADING_DECALS_BINDING)
  47. layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_DECALS_BINDING, scalar) uniform b_decals
  48. {
  49. Decal u_decals2[MAX_VISIBLE_DECALS];
  50. };
  51. layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_DECALS_BINDING + 1) uniform texture2D u_diffuseDecalTex;
  52. layout(set = CLUSTERED_SHADING_SET,
  53. binding = CLUSTERED_SHADING_DECALS_BINDING + 2) uniform texture2D u_specularRoughnessDecalTex;
  54. #endif
  55. //
  56. // Fog density uniforms (1)
  57. //
  58. #if defined(CLUSTERED_SHADING_FOG_BINDING)
  59. layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_FOG_BINDING, scalar) uniform b_fogDensityVolumes
  60. {
  61. FogDensityVolume u_fogDensityVolumes[MAX_VISIBLE_FOG_DENSITY_VOLUMES];
  62. };
  63. #endif
  64. //
  65. // GI (2)
  66. //
  67. #if defined(CLUSTERED_SHADING_GI_BINDING)
  68. layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_GI_BINDING) uniform texture3D
  69. u_globalIlluminationTextures[MAX_VISIBLE_GLOBAL_ILLUMINATION_PROBES];
  70. layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_GI_BINDING + 1, scalar) uniform b_giProbes
  71. {
  72. GlobalIlluminationProbe u_giProbes[MAX_VISIBLE_GLOBAL_ILLUMINATION_PROBES];
  73. };
  74. #endif
  75. //
  76. // Cluster uniforms
  77. //
  78. #if defined(CLUSTERED_SHADING_CLUSTERS_BINDING)
  79. layout(set = CLUSTERED_SHADING_SET, binding = CLUSTERED_SHADING_CLUSTERS_BINDING, scalar) readonly buffer b_clusters
  80. {
  81. Cluster u_clusters2[];
  82. };
  83. #endif
  84. // Debugging function
  85. Vec3 clusterHeatmap(Cluster cluster, U32 objectTypeMask)
  86. {
  87. U32 maxObjects = 0u;
  88. I32 count = 0;
  89. if((objectTypeMask & (1u << CLUSTER_OBJECT_TYPE_POINT_LIGHT)) != 0u)
  90. {
  91. maxObjects += MAX_VISIBLE_POINT_LIGHTS;
  92. count += I32(bitCount(cluster.m_pointLightsMask));
  93. }
  94. if((objectTypeMask & (1u << CLUSTER_OBJECT_TYPE_SPOT_LIGHT)) != 0u)
  95. {
  96. maxObjects += MAX_VISIBLE_SPOT_LIGHTS;
  97. count += I32(bitCount(cluster.m_spotLightsMask));
  98. }
  99. if((objectTypeMask & (1u << CLUSTER_OBJECT_TYPE_DECAL)) != 0u)
  100. {
  101. maxObjects += MAX_VISIBLE_DECALS;
  102. count += I32(bitCount(cluster.m_decalsMask));
  103. }
  104. if((objectTypeMask & (1u << CLUSTER_OBJECT_TYPE_FOG_DENSITY_VOLUME)) != 0u)
  105. {
  106. maxObjects += MAX_VISIBLE_FOG_DENSITY_VOLUMES;
  107. count += bitCount(cluster.m_fogDensityVolumesMask);
  108. }
  109. if((objectTypeMask & (1u << CLUSTER_OBJECT_TYPE_REFLECTION_PROBE)) != 0u)
  110. {
  111. maxObjects += MAX_VISIBLE_REFLECTION_PROBES;
  112. count += bitCount(cluster.m_reflectionProbesMask);
  113. }
  114. if((objectTypeMask & (1u << CLUSTER_OBJECT_TYPE_GLOBAL_ILLUMINATION_PROBE)) != 0u)
  115. {
  116. maxObjects += MAX_VISIBLE_GLOBAL_ILLUMINATION_PROBES;
  117. count += bitCount(cluster.m_giProbesMask);
  118. }
  119. const F32 factor = min(1.0, F32(count) / F32(maxObjects));
  120. return heatmap(factor);
  121. }
  122. /// Returns the index of the zSplit or linearizeDepth(n, f, depth)*zSplitCount
  123. /// Simplifying this equation is 1/(a+b/depth) where a=(n-f)/(n*zSplitCount) and b=f/(n*zSplitCount)
  124. U32 computeZSplitClusterIndex(F32 depth, U32 zSplitCount, F32 a, F32 b)
  125. {
  126. const F32 fSplitIdx = 1.0 / (a + b / depth);
  127. return min(zSplitCount - 1u, U32(fSplitIdx));
  128. }
  129. /// Return the tile index.
  130. U32 computeTileClusterIndexFragCoord(Vec2 fragCoord, U32 tileSize, U32 tileCountX)
  131. {
  132. const UVec2 tileXY = UVec2(fragCoord / F32(tileSize));
  133. return tileXY.y * tileCountX + tileXY.x;
  134. }
  135. /// Merge the tiles with z splits into a single cluster.
  136. Cluster mergeClusters(Cluster tileCluster, Cluster zCluster)
  137. {
  138. //#define ANKI_OR_MASKS(x) subgroupOr(x)
  139. #define ANKI_OR_MASKS(x) (x)
  140. Cluster outCluster;
  141. outCluster.m_pointLightsMask = ANKI_OR_MASKS(tileCluster.m_pointLightsMask & zCluster.m_pointLightsMask);
  142. outCluster.m_spotLightsMask = ANKI_OR_MASKS(tileCluster.m_spotLightsMask & zCluster.m_spotLightsMask);
  143. outCluster.m_decalsMask = ANKI_OR_MASKS(tileCluster.m_decalsMask & zCluster.m_decalsMask);
  144. outCluster.m_fogDensityVolumesMask =
  145. ANKI_OR_MASKS(tileCluster.m_fogDensityVolumesMask & zCluster.m_fogDensityVolumesMask);
  146. outCluster.m_reflectionProbesMask =
  147. ANKI_OR_MASKS(tileCluster.m_reflectionProbesMask & zCluster.m_reflectionProbesMask);
  148. outCluster.m_giProbesMask = ANKI_OR_MASKS(tileCluster.m_giProbesMask & zCluster.m_giProbesMask);
  149. #undef ANKI_OR_MASKS
  150. return outCluster;
  151. }
  152. #if defined(CLUSTERED_SHADING_CLUSTERS_BINDING)
  153. /// Get the final cluster after ORing and ANDing the masks.
  154. Cluster getClusterFragCoord(Vec3 fragCoord, U32 tileSize, UVec2 tileCounts, U32 zSplitCount, F32 a, F32 b)
  155. {
  156. const Cluster tileCluster = u_clusters2[computeTileClusterIndexFragCoord(fragCoord.xy, tileSize, tileCounts.x)];
  157. const Cluster zCluster =
  158. u_clusters2[computeZSplitClusterIndex(fragCoord.z, zSplitCount, a, b) + tileCounts.x * tileCounts.y];
  159. return mergeClusters(tileCluster, zCluster);
  160. }
  161. Cluster getClusterFragCoord(Vec3 fragCoord)
  162. {
  163. return getClusterFragCoord(fragCoord, u_clusteredShading.m_tileSize, u_clusteredShading.m_tileCounts,
  164. u_clusteredShading.m_zSplitCount, u_clusteredShading.m_zSplitMagic.x,
  165. u_clusteredShading.m_zSplitMagic.y);
  166. }
  167. #endif