You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/Atom/Feature/Common/Code/Source/PostProcessing/TaaPass.h

102 lines
3.3 KiB
C++

/*
* 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 <Atom/RPI.Public/Pass/ComputePass.h>
#include <Atom/RPI.Reflect/Pass/ComputePassData.h>
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<SerializeContext*>(context))
{
serializeContext->Class<TaaPassData, RPI::ComputePassData>()
->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<TaaPass> 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<RPI::PassAttachment>& 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<RPI::PassAttachment> 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<float, 2> offsets)
: m_xOffset(offsets[0])
, m_yOffset(offsets[1])
{};
float m_xOffset = 0.0f;
float m_yOffset = 0.0f;
};
AZStd::array<float, 9> m_filterWeights = { 0.0f };
AZStd::vector<Offset> m_subPixelOffsets;
uint32_t m_offsetIndex = 0;
uint8_t m_accumulationOuptutIndex = 0;
};
} // namespace AZ::Render