From 2ad9c7f4d5aa3215504cdb6702e4239f97c89697 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 24 Sep 2024 23:01:13 +0200 Subject: [PATCH] Fix Skybox rendering regression #2943 --- Source/Engine/Graphics/Materials/IMaterial.h | 2 ++ .../Graphics/Materials/MaterialShader.cpp | 21 +++++++++++++++++++ Source/Engine/Level/Actors/Skybox.cpp | 1 + Source/Engine/Renderer/RenderList.cpp | 2 ++ Source/Engine/Renderer/RenderList.h | 5 +++++ 5 files changed, 31 insertions(+) diff --git a/Source/Engine/Graphics/Materials/IMaterial.h b/Source/Engine/Graphics/Materials/IMaterial.h index 90d44897e..ba0e2acae 100644 --- a/Source/Engine/Graphics/Materials/IMaterial.h +++ b/Source/Engine/Graphics/Materials/IMaterial.h @@ -166,6 +166,8 @@ public: // Binds the shared per-view constant buffer at slot 1 (see ViewData in MaterialCommon.hlsl) void BindViewData(); + // Binds the shared per-draw constant buffer at slot 2 (see DrawData in MaterialCommon.hlsl) + void BindDrawData(); }; /// diff --git a/Source/Engine/Graphics/Materials/MaterialShader.cpp b/Source/Engine/Graphics/Materials/MaterialShader.cpp index fe1d1db2a..63faaf300 100644 --- a/Source/Engine/Graphics/Materials/MaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/MaterialShader.cpp @@ -84,6 +84,27 @@ void IMaterial::BindParameters::BindViewData() GPUContext->BindCB(1, PerViewConstants); } +void IMaterial::BindParameters::BindDrawData() +{ + // Write draw call to the object buffer + auto& objectBuffer = RenderContext.List->TempObjectBuffer; + objectBuffer.Clear(); + ShaderObjectData objData; + objData.Store(*DrawCall); + objectBuffer.Write(objData); + objectBuffer.Flush(GPUContext); + ObjectBuffer = objectBuffer.GetBuffer()->View(); + + // Setup data + MaterialShaderDataPerDraw perDraw; + perDraw.DrawPadding = Float3::Zero; + perDraw.DrawObjectIndex = 0; + + // Update constants + GPUContext->UpdateCB(PerDrawConstants, &perDraw); + GPUContext->BindCB(2, PerDrawConstants); +} + GPUPipelineState* MaterialShader::PipelineStateCache::InitPS(CullMode mode, bool wireframe) { Desc.CullMode = mode; diff --git a/Source/Engine/Level/Actors/Skybox.cpp b/Source/Engine/Level/Actors/Skybox.cpp index 51b288c42..9077f4e39 100644 --- a/Source/Engine/Level/Actors/Skybox.cpp +++ b/Source/Engine/Level/Actors/Skybox.cpp @@ -111,6 +111,7 @@ void Skybox::ApplySky(GPUContext* context, RenderContext& renderContext, const M drawCall.PerInstanceRandom = GetPerInstanceRandom(); MaterialBase::BindParameters bindParams(context, renderContext, drawCall); bindParams.BindViewData(); + bindParams.BindDrawData(); // Check if use custom material if (CustomMaterial) diff --git a/Source/Engine/Renderer/RenderList.cpp b/Source/Engine/Renderer/RenderList.cpp index 93a254c21..69032a2b7 100644 --- a/Source/Engine/Renderer/RenderList.cpp +++ b/Source/Engine/Renderer/RenderList.cpp @@ -443,6 +443,7 @@ RenderList::RenderList(const SpawnParams& params) , Fog(nullptr) , Blendable(32) , ObjectBuffer(0, PixelFormat::R32G32B32A32_Float, false, TEXT("Object Bufffer")) + , TempObjectBuffer(0, PixelFormat::R32G32B32A32_Float, false, TEXT("Object Bufffer")) , _instanceBuffer(0, sizeof(ShaderObjectDrawInstanceData), TEXT("Instance Buffer")) { } @@ -477,6 +478,7 @@ void RenderList::Clear() Blendable.Clear(); _instanceBuffer.Clear(); ObjectBuffer.Clear(); + TempObjectBuffer.Clear(); } struct PackedSortKey diff --git a/Source/Engine/Renderer/RenderList.h b/Source/Engine/Renderer/RenderList.h index aa484fceb..43e295aa9 100644 --- a/Source/Engine/Renderer/RenderList.h +++ b/Source/Engine/Renderer/RenderList.h @@ -419,6 +419,11 @@ public: /// DynamicTypedBuffer ObjectBuffer; + /// + /// Temporary objects buffer that contains ShaderObjectData for each DrawCall reused during scene rendering (eg. by skybox). + /// + DynamicTypedBuffer TempObjectBuffer; + private: DynamicVertexBuffer _instanceBuffer;