Refactor material shaders to use separate constant buffer (slot 1) for shared per-view constants

This commit is contained in:
Wojtek Figat
2022-11-27 12:06:31 +01:00
parent 189575efec
commit 835a230323
26 changed files with 92 additions and 194 deletions

View File

@@ -4,6 +4,7 @@
#include "Engine/Core/Log.h"
#include "Engine/Serialization/MemoryReadStream.h"
#include "Engine/Renderer/RenderList.h"
#include "Engine/Graphics/RenderTask.h"
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
@@ -18,6 +19,21 @@
#include "DeformableMaterialShader.h"
#include "VolumeParticleMaterialShader.h"
PACK_STRUCT(struct MaterialShaderDataPerView {
Matrix ViewMatrix;
Matrix ViewProjectionMatrix;
Matrix PrevViewProjectionMatrix;
Matrix MainViewProjectionMatrix;
Float4 MainScreenSize;
Float3 ViewPos;
float ViewFar;
Float3 ViewDir;
float TimeParam;
Float4 ViewInfo;
Float4 ScreenSize;
Float4 TemporalAAJitter;
});
IMaterial::BindParameters::BindParameters(::GPUContext* context, const ::RenderContext& renderContext)
: GPUContext(context)
, RenderContext(renderContext)
@@ -45,6 +61,37 @@ IMaterial::BindParameters::BindParameters(::GPUContext* context, const ::RenderC
{
}
GPUConstantBuffer* IMaterial::BindParameters::PerViewConstants = nullptr;
void IMaterial::BindParameters::BindViewData()
{
// Lazy-init
if (!PerViewConstants)
{
PerViewConstants = GPUDevice::Instance->CreateConstantBuffer(sizeof(MaterialShaderDataPerView), TEXT("PerViewConstants"));
}
// Setup data
MaterialShaderDataPerView cb;
int aa1 = sizeof(MaterialShaderDataPerView);
Matrix::Transpose(RenderContext.View.Frustum.GetMatrix(), cb.ViewProjectionMatrix);
Matrix::Transpose(RenderContext.View.View, cb.ViewMatrix);
Matrix::Transpose(RenderContext.View.PrevViewProjection, cb.PrevViewProjectionMatrix);
Matrix::Transpose(RenderContext.View.MainViewProjection, cb.MainViewProjectionMatrix);
cb.MainScreenSize = RenderContext.View.MainScreenSize;
cb.ViewPos = RenderContext.View.Position;
cb.ViewFar = RenderContext.View.Far;
cb.ViewDir = RenderContext.View.Direction;
cb.TimeParam = TimeParam;
cb.ViewInfo = RenderContext.View.ViewInfo;
cb.ScreenSize = RenderContext.View.ScreenSize;
cb.TemporalAAJitter = RenderContext.View.TemporalAAJitter;
// Update constants
GPUContext->UpdateCB(PerViewConstants, &cb);
GPUContext->BindCB(1, PerViewConstants);
}
GPUPipelineState* MaterialShader::PipelineStateCache::InitPS(CullMode mode, bool wireframe)
{
Desc.CullMode = mode;