Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
SSRPreRenderOperator.cpp
Go to the documentation of this file.
1
2
4
14
16
17namespace Divide {
18
21{
22 ShaderModuleDescriptor vertModule{ ShaderType::VERTEX, "baseVertexShaders.glsl", "FullScreenQuad" };
23 ShaderModuleDescriptor fragModule{ ShaderType::FRAGMENT, "ScreenSpaceReflections.glsl" };
24
25 ShaderProgramDescriptor shaderDescriptor = {};
26 shaderDescriptor._modules.push_back(vertModule);
27 shaderDescriptor._modules.push_back(fragModule);
28
29 ResourceDescriptor<ShaderProgram> ssr("ScreenSpaceReflections", shaderDescriptor );
30 ssr.waitForReady(false);
31
33
34 PipelineDescriptor pipelineDescriptor = {};
35 pipelineDescriptor._stateBlock = _context.get2DStateBlock();
36 pipelineDescriptor._shaderProgramHandle = _ssrShader;
38
39 _pipelineCmd._pipeline = _context.newPipeline( pipelineDescriptor );
41
43
44 const vec2<F32> s = res * 0.5f;
46 {
47 s.x, 0.f, 0.f, 0.f,
48 0.f, s.y, 0.f, 0.f,
49 0.f, 0.f, 1.f, 0.f,
50 s.x, s.y, 0.f, 1.f
51 };
53}
54
56{
59}
60bool SSRPreRenderOperator::ready() const noexcept
61{
62 if (Get(_ssrShader)->getState() == ResourceState::RES_LOADED)
63 {
65 }
66
67 return false;
68}
69
71{
72
73 const auto& parameters = _context.context().config().rendering.postFX.ssr;
74 _uniforms.set( _ID( "maxSteps" ), PushConstantType::FLOAT, to_F32( parameters.maxSteps ) );
75 _uniforms.set( _ID( "binarySearchIterations" ), PushConstantType::FLOAT, to_F32( parameters.binarySearchIterations ) );
76 _uniforms.set( _ID( "jitterAmount" ), PushConstantType::FLOAT, parameters.jitterAmount );
77 _uniforms.set( _ID( "maxDistance" ), PushConstantType::FLOAT, parameters.maxDistance );
78 _uniforms.set( _ID( "stride" ), PushConstantType::FLOAT, parameters.stride );
79 _uniforms.set( _ID( "zThickness" ), PushConstantType::FLOAT, parameters.zThickness );
80 _uniforms.set( _ID( "strideZCutoff" ), PushConstantType::FLOAT, parameters.strideZCutoff );
81 _uniforms.set( _ID( "screenEdgeFadeStart" ), PushConstantType::FLOAT, parameters.screenEdgeFadeStart );
82 _uniforms.set( _ID( "eyeFadeStart" ), PushConstantType::FLOAT, parameters.eyeFadeStart );
83 _uniforms.set(_ID("eyeFadeEnd"), PushConstantType::FLOAT, parameters.eyeFadeEnd);
84 _constantsDirty = true;
85}
86
87void SSRPreRenderOperator::reshape(const U16 width, const U16 height)
88{
89 PreRenderOperator::reshape(width, height);
90 const vec2<F32> s{ width * 0.5f, height * 0.5f };
92 {
93 s.x, 0.f, 0.f, 0.f,
94 0.f, s.y, 0.f, 0.f,
95 0.f, 0.f, 1.f, 0.f,
96 s.x, s.y, 0.f, 1.f
97 };
98}
99
100void SSRPreRenderOperator::prepare([[maybe_unused]] const PlayerIndex idx, GFX::CommandBuffer& bufferInOut)
101{
102 PreRenderOperator::prepare(idx, bufferInOut);
103
104 if (_stateChanged && !_enabled)
105 {
106 GFX::BeginRenderPassCommand* renderPassCmd = GFX::EnqueueCommand<GFX::BeginRenderPassCommand>(bufferInOut);
107 renderPassCmd->_name = "DO_SSR_CLEAR_TARGET";
108 renderPassCmd->_target = RenderTargetNames::SSR_RESULT;
109 renderPassCmd->_descriptor = _screenOnlyDraw;
112
113 GFX::EnqueueCommand<GFX::EndRenderPassCommand>(bufferInOut);
114 }
115
116 _stateChanged = false;
117}
118
119bool SSRPreRenderOperator::execute( const PlayerIndex idx, const CameraSnapshot& cameraSnapshot, const RenderTargetHandle& input, [[maybe_unused]] const RenderTargetHandle& output, GFX::CommandBuffer& bufferInOut)
120{
121 assert(_enabled);
122
126
127 const Handle<Texture> screenTex = screenAtt->texture();
128 const Handle<Texture> normalsTex = normalsAtt->texture();
129 const Handle<Texture> depthTex = depthAtt->texture();
130 U16 screenMipCount = Get(screenAtt->texture())->mipCount();
131 if (screenMipCount > 2u) {
132 screenMipCount -= 2u;
133 }
134
135 const GFXShaderData::PrevFrameData& prevFrameData = _context.previousFrameData( idx );
136
137 auto cmd = GFX::EnqueueCommand<GFX::BindShaderResourcesCommand>(bufferInOut);
138 cmd->_usage = DescriptorSetUsage::PER_DRAW;
139 {
141 Set( binding._data, screenTex, screenAtt->_descriptor._sampler );
142 }
143 {
145 Set( binding._data, depthTex, depthAtt->_descriptor._sampler );
146 }
147 {
149 Set( binding._data, normalsTex, normalsAtt->_descriptor._sampler );
150 }
151
152 GFX::BeginRenderPassCommand* renderPassCmd = GFX::EnqueueCommand<GFX::BeginRenderPassCommand>(bufferInOut);
153 renderPassCmd->_target = RenderTargetNames::SSR_RESULT;
154 renderPassCmd->_descriptor = _screenOnlyDraw;
156 renderPassCmd->_name = "DO_SSR_PASS";
157
158 GFX::EnqueueCommand(bufferInOut, _pipelineCmd);
159
160 _uniforms.set( _ID( "invProjectionMatrix" ), PushConstantType::MAT4, cameraSnapshot._invProjectionMatrix );
161 _uniforms.set( _ID( "invViewMatrix" ), PushConstantType::MAT4, cameraSnapshot._invViewMatrix );
162 _uniforms.set( _ID( "previousViewMatrix" ), PushConstantType::MAT4, prevFrameData._previousViewMatrix );
163 _uniforms.set( _ID( "previousProjectionMatrix" ), PushConstantType::MAT4, prevFrameData._previousProjectionMatrix );
164 _uniforms.set( _ID( "previousViewProjectionMatrix" ), PushConstantType::MAT4, prevFrameData._previousViewProjectionMatrix );
165 _uniforms.set( _ID( "screenDimensions" ), PushConstantType::VEC2, vec2<F32>( Get( screenTex )->width(), Get( screenTex )->height() ) );
166 _uniforms.set( _ID( "maxScreenMips" ), PushConstantType::UINT, screenMipCount );
167 _uniforms.set( _ID( "_zPlanes" ), PushConstantType::VEC2, cameraSnapshot._zPlanes );
168
169 auto sendPushConstantsCmd = GFX::EnqueueCommand<GFX::SendPushConstantsCommand>( bufferInOut );
170 sendPushConstantsCmd->_uniformData = &_uniforms;
171 sendPushConstantsCmd->_fastData.data[0] = (cameraSnapshot._projectionMatrix * _projToPixelBasis);
172 sendPushConstantsCmd->_fastData.data[1] = cameraSnapshot._projectionMatrix;
173 GFX::EnqueueCommand<GFX::DrawCommand>(bufferInOut)->_drawCommands.emplace_back();
174 GFX::EnqueueCommand<GFX::EndRenderPassCommand>(bufferInOut);
175
176 return false;
177}
178
179} //namespace Divide
#define WAIT_FOR_CONDITION(...)
Rough around the edges Adapter pattern abstracting the actual rendering API and access to the GPU.
Definition: GFXDevice.h:215
GFXRTPool & renderTargetPool() noexcept
Definition: GFXDevice.inl:133
Pipeline * newPipeline(const PipelineDescriptor &descriptor)
Create and return a new graphics pipeline. This is only used for caching and doesn't use the object a...
Definition: GFXDevice.cpp:3074
const RenderStateBlock & get2DStateBlock() const noexcept
Definition: GFXDevice.inl:123
const GFXShaderData::PrevFrameData & previousFrameData(PlayerIndex player) const noexcept
Definition: GFXDevice.cpp:2083
RenderTarget * getRenderTarget(const RenderTargetID target) const
Definition: GFXRTPool.cpp:50
PlatformContext & context() noexcept
Configuration & config() noexcept
RenderTargetHandle screenRT() const noexcept
virtual void reshape(U16 width, U16 height)
virtual void prepare(PlayerIndex idx, GFX::CommandBuffer &bufferInOut)
virtual bool ready() const noexcept
RTDrawDescriptor _screenOnlyDraw
Handle< Texture > texture() const
RTAttachmentDescriptor _descriptor
Definition: RTAttachment.h:128
RTAttachment * getAttachment(RTAttachmentType type, RTColourAttachmentSlot slot=RTColourAttachmentSlot::SLOT_0) const
vec2< U16 > getResolution() const noexcept
GFX::BindPipelineCommand _pipelineCmd
SSRPreRenderOperator(GFXDevice &context, PreRenderBatch &parent)
Handle< ShaderProgram > _ssrShader
void prepare(PlayerIndex idx, GFX::CommandBuffer &bufferInOut) override
bool ready() const noexcept override
bool execute(PlayerIndex idx, const CameraSnapshot &cameraSnapshot, const RenderTargetHandle &input, const RenderTargetHandle &output, GFX::CommandBuffer &bufferInOut) override
Return true if we rendered into "output".
void reshape(U16 width, U16 height) override
FORCE_INLINE T * EnqueueCommand(CommandBuffer &buffer)
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
FORCE_INLINE void DestroyResource(Handle< T > &handle, const bool immediate=false)
static constexpr U32 RT_DEPTH_ATTACHMENT_IDX
Definition: RTAttachment.h:71
@ RES_LOADED
The resource is available for usage.
constexpr F32 to_F32(const T value)
Project & parent
Definition: DefaultScene.h:41
uint16_t U16
void Set(DescriptorSetBindingData &dataInOut, ShaderBuffer *buffer, const BufferRange range) noexcept
constexpr U64 _ID(const char *const str, const U64 value=val_64_const) noexcept
DescriptorSetBinding & AddBinding(DescriptorSet &setInOut, U8 slot, U16 stageVisibilityMask)
FORCE_INLINE Handle< T > CreateResource(const ResourceDescriptor< T > &descriptor, bool &wasInCache, std::atomic_uint &taskCounter)
RTClearEntry DEFAULT_CLEAR_ENTRY
FORCE_INLINE T * Get(const Handle< T > handle)
static const vec4< F32 > VECTOR4_ZERO
Definition: MathVectors.h:1435
constexpr auto to_base(const Type value) -> Type
mat4< F32 > _invViewMatrix
mat4< F32 > _projectionMatrix
mat4< F32 > _invProjectionMatrix
struct Divide::Configuration::Rendering::PostFX::SSR ssr
struct Divide::Configuration::Rendering::PostFX postFX
struct Divide::Configuration::Rendering rendering
DescriptorSetBindingData _data
RTClearDescriptor _clearDescriptor
Definition: Commands.inl:97
static constexpr RTColourAttachmentSlot ALBEDO
Definition: GFXDevice.h:228
PrimitiveTopology _primitiveTopology
Definition: Pipeline.h:48
Handle< ShaderProgram > _shaderProgramHandle
Definition: Pipeline.h:47
RenderStateBlock _stateBlock
Definition: Pipeline.h:46
vector< ShaderModuleDescriptor > _modules
SamplerDescriptor _sampler
Definition: RTAttachment.h:64
static RenderTargetID NORMALS_RESOLVED
Definition: GFXDevice.h:199
static RenderTargetID SSR_RESULT
Definition: GFXDevice.h:203
const Byte * data(size_t offset) const noexcept
void set(U64 bindingHash, PushConstantType type, const T &value)