Ir.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <anki/renderer/Renderer.h>
  7. #include <anki/renderer/RenderingPass.h>
  8. #include <anki/renderer/Clusterer.h>
  9. #include <anki/resource/TextureResource.h>
  10. namespace anki
  11. {
  12. // Forward
  13. struct IrShaderReflectionProbe;
  14. class IrRunContext;
  15. class IrTaskContext;
  16. class ReflectionProbeComponent;
  17. /// @addtogroup renderer
  18. /// @{
  19. /// Image based reflections.
  20. class Ir : public RenderingPass
  21. {
  22. friend class IrTask;
  23. anki_internal:
  24. Ir(Renderer* r);
  25. ~Ir();
  26. ANKI_USE_RESULT Error init(const ConfigSet& initializer);
  27. ANKI_USE_RESULT Error run(CommandBufferPtr cmdb);
  28. DynamicBufferToken getProbesToken() const
  29. {
  30. return m_probesToken;
  31. }
  32. DynamicBufferToken getProbeIndicesToken() const
  33. {
  34. return m_indicesToken;
  35. }
  36. DynamicBufferToken getClustersToken() const
  37. {
  38. return m_clustersToken;
  39. }
  40. U getCubemapArrayMipmapCount() const
  41. {
  42. return m_cubemapArrMipCount;
  43. }
  44. ResourceGroupPtr getResourceGroup() const
  45. {
  46. return m_rcGroup;
  47. }
  48. private:
  49. class CacheEntry
  50. {
  51. public:
  52. const SceneNode* m_node = nullptr;
  53. Timestamp m_timestamp = 0; ///< When last rendered.
  54. };
  55. static const U IRRADIANCE_SIZE = 32;
  56. Renderer m_nestedR;
  57. TexturePtr m_envCubemapArr;
  58. U16 m_cubemapArrMipCount = 0;
  59. U16 m_cubemapArrSize = 0;
  60. U16 m_fbSize = 0;
  61. DArray<CacheEntry> m_cacheEntries;
  62. Barrier m_barrier;
  63. // Irradiance
  64. TexturePtr m_irradianceCubemapArr;
  65. ShaderResourcePtr m_computeIrradianceFrag;
  66. PipelinePtr m_computeIrradiancePpline;
  67. ResourceGroupPtr m_computeIrradianceResources;
  68. // Other
  69. TextureResourcePtr m_integrationLut;
  70. SamplerPtr m_integrationLutSampler;
  71. // Tokens
  72. DynamicBufferToken m_probesToken;
  73. DynamicBufferToken m_clustersToken;
  74. DynamicBufferToken m_indicesToken;
  75. ResourceGroupPtr m_rcGroup;
  76. ANKI_USE_RESULT Error initIrradiance();
  77. /// Bin probes in clusters.
  78. void binProbes(U32 threadId, PtrSize threadsCount, IrRunContext& ctx);
  79. ANKI_USE_RESULT Error writeProbeAndRender(
  80. SceneNode& node, IrShaderReflectionProbe& probe, CommandBufferPtr cmdb);
  81. void binProbe(U probeIdx, IrRunContext& ctx, IrTaskContext& task) const;
  82. ANKI_USE_RESULT Error renderReflection(SceneNode& node,
  83. ReflectionProbeComponent& reflc,
  84. U cubemapIdx,
  85. CommandBufferPtr cmdb);
  86. static void writeIndicesAndCluster(
  87. U clusterIdx, Bool hasPrevCluster, IrRunContext& ctx);
  88. /// Find a cache entry to store the reflection.
  89. void findCacheEntry(SceneNode& node, U& entry, Bool& render);
  90. };
  91. /// @}
  92. } // end namespace anki