| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- // Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos.
- // All rights reserved.
- // Code licensed under the BSD License.
- // http://www.anki3d.org/LICENSE
- #pragma once
- #include <anki/renderer/Renderer.h>
- #include <anki/renderer/RenderingPass.h>
- #include <anki/renderer/Clusterer.h>
- #include <anki/resource/TextureResource.h>
- namespace anki
- {
- // Forward
- struct IrShaderReflectionProbe;
- class IrRunContext;
- class IrTaskContext;
- class ReflectionProbeComponent;
- /// @addtogroup renderer
- /// @{
- /// Image based reflections.
- class Ir : public RenderingPass
- {
- friend class IrTask;
- anki_internal:
- Ir(Renderer* r);
- ~Ir();
- ANKI_USE_RESULT Error init(const ConfigSet& initializer);
- ANKI_USE_RESULT Error run(CommandBufferPtr cmdb);
- DynamicBufferToken getProbesToken() const
- {
- return m_probesToken;
- }
- DynamicBufferToken getProbeIndicesToken() const
- {
- return m_indicesToken;
- }
- DynamicBufferToken getClustersToken() const
- {
- return m_clustersToken;
- }
- U getCubemapArrayMipmapCount() const
- {
- return m_cubemapArrMipCount;
- }
- ResourceGroupPtr getResourceGroup() const
- {
- return m_rcGroup;
- }
- private:
- class CacheEntry
- {
- public:
- const SceneNode* m_node = nullptr;
- Timestamp m_timestamp = 0; ///< When last rendered.
- };
- static const U IRRADIANCE_SIZE = 32;
- Renderer m_nestedR;
- TexturePtr m_envCubemapArr;
- U16 m_cubemapArrMipCount = 0;
- U16 m_cubemapArrSize = 0;
- U16 m_fbSize = 0;
- DArray<CacheEntry> m_cacheEntries;
- Barrier m_barrier;
- // Irradiance
- TexturePtr m_irradianceCubemapArr;
- ShaderResourcePtr m_computeIrradianceFrag;
- PipelinePtr m_computeIrradiancePpline;
- ResourceGroupPtr m_computeIrradianceResources;
- // Other
- TextureResourcePtr m_integrationLut;
- SamplerPtr m_integrationLutSampler;
- // Tokens
- DynamicBufferToken m_probesToken;
- DynamicBufferToken m_clustersToken;
- DynamicBufferToken m_indicesToken;
- ResourceGroupPtr m_rcGroup;
- ANKI_USE_RESULT Error initIrradiance();
- /// Bin probes in clusters.
- void binProbes(U32 threadId, PtrSize threadsCount, IrRunContext& ctx);
- ANKI_USE_RESULT Error writeProbeAndRender(
- SceneNode& node, IrShaderReflectionProbe& probe, CommandBufferPtr cmdb);
- void binProbe(U probeIdx, IrRunContext& ctx, IrTaskContext& task) const;
- ANKI_USE_RESULT Error renderReflection(SceneNode& node,
- ReflectionProbeComponent& reflc,
- U cubemapIdx,
- CommandBufferPtr cmdb);
- static void writeIndicesAndCluster(
- U clusterIdx, Bool hasPrevCluster, IrRunContext& ctx);
- /// Find a cache entry to store the reflection.
- void findCacheEntry(SceneNode& node, U& entry, Bool& render);
- };
- /// @}
- } // end namespace anki
|