/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #pragma once #include #include namespace AZ::Render { //! Custom data for the Taa Pass. struct TaaPassData : public RPI::ComputePassData { AZ_RTTI(TaaPassData, "{BCDF5C7D-7A78-4C69-A460-FA6899C3B960}", ComputePassData); AZ_CLASS_ALLOCATOR(TaaPassData, SystemAllocator, 0); TaaPassData() = default; virtual ~TaaPassData() = default; static void Reflect(ReflectContext* context) { if (auto* serializeContext = azrtti_cast(context)) { serializeContext->Class() ->Version(1) ->Field("NumJitterPositions", &TaaPassData::m_numJitterPositions) ; } } uint32_t m_numJitterPositions = 8; }; class TaaPass : public RPI::ComputePass { using Base = RPI::ComputePass; AZ_RPI_PASS(TaaPass); public: AZ_RTTI(AZ::Render::TaaPass, "{AB3BD4EA-33D7-477F-82B4-21DDFB517499}", Base); AZ_CLASS_ALLOCATOR(TaaPass, SystemAllocator, 0); virtual ~TaaPass() = default; /// Creates a TaaPass static RPI::Ptr Create(const RPI::PassDescriptor& descriptor); private: TaaPass(const RPI::PassDescriptor& descriptor); // Scope producer functions... void CompileResources(const RHI::FrameGraphCompileContext& context) override; // Pass behavior overrides... void FrameBeginInternal(FramePrepareParams params) override; void ResetInternal() override; void BuildInternal() override; void UpdateAttachmentImage(RPI::Ptr& attachment); void SetupSubPixelOffsets(uint32_t haltonX, uint32_t haltonY, uint32_t length); void GenerateFilterWeights(AZ::Vector2 jitterOffset); RHI::ShaderInputNameIndex m_outputIndex = "m_output"; RHI::ShaderInputNameIndex m_lastFrameAccumulationIndex = "m_lastFrameAccumulation"; RHI::ShaderInputNameIndex m_constantDataIndex = "m_constantData"; Data::Instance m_accumulationAttachments[2]; RPI::PassAttachmentBinding* m_inputColorBinding = nullptr; RPI::PassAttachmentBinding* m_lastFrameAccumulationBinding = nullptr; RPI::PassAttachmentBinding* m_outputColorBinding = nullptr; struct Offset { Offset() = default; // Constructor for implicit conversion from array output by HaltonSequence. Offset(AZStd::array offsets) : m_xOffset(offsets[0]) , m_yOffset(offsets[1]) {}; float m_xOffset = 0.0f; float m_yOffset = 0.0f; }; AZStd::array m_filterWeights = { 0.0f }; AZStd::vector m_subPixelOffsets; uint32_t m_offsetIndex = 0; uint8_t m_accumulationOuptutIndex = 0; }; } // namespace AZ::Render