Refactor scene rendering to use batched culling for main view and shadow projections

This commit is contained in:
Wojtek Figat
2022-10-28 09:13:28 +02:00
parent e217d5e79b
commit eb52d333ae
44 changed files with 1064 additions and 514 deletions

View File

@@ -285,7 +285,7 @@ void AddActorToSceneRendering(SceneRendering* s, Actor* a)
}
}
void SceneRenderTask::OnCollectDrawCalls(RenderContext& renderContext, byte category)
void SceneRenderTask::OnCollectDrawCalls(RenderContextBatch& renderContextBatch, byte category)
{
// Draw actors (collect draw calls)
if ((ActorsSource & ActorsSources::CustomActors) != 0)
@@ -296,15 +296,16 @@ void SceneRenderTask::OnCollectDrawCalls(RenderContext& renderContext, byte cate
_customActorsScene->Clear();
for (Actor* a : CustomActors)
AddActorToSceneRendering(_customActorsScene, a);
_customActorsScene->Draw(renderContext, (SceneRendering::DrawCategory)category);
_customActorsScene->Draw(renderContextBatch, (SceneRendering::DrawCategory)category);
}
if ((ActorsSource & ActorsSources::Scenes) != 0)
{
Level::DrawActors(renderContext, category);
Level::DrawActors(renderContextBatch, category);
}
// External drawing event
CollectDrawCalls(renderContext);
for (RenderContext& renderContext : renderContextBatch.Contexts)
CollectDrawCalls(renderContext);
}
void SceneRenderTask::OnPreRender(GPUContext* context, RenderContext& renderContext)
@@ -313,14 +314,16 @@ void SceneRenderTask::OnPreRender(GPUContext* context, RenderContext& renderCont
// Collect initial draw calls
renderContext.View.Pass = DrawPass::GBuffer;
OnCollectDrawCalls(renderContext, SceneRendering::PreRender);
RenderContextBatch renderContextBatch(renderContext);
OnCollectDrawCalls(renderContextBatch, SceneRendering::PreRender);
}
void SceneRenderTask::OnPostRender(GPUContext* context, RenderContext& renderContext)
{
// Collect final draw calls
renderContext.View.Pass = DrawPass::GBuffer;
OnCollectDrawCalls(renderContext, SceneRendering::PostRender);
RenderContextBatch renderContextBatch(renderContext);
OnCollectDrawCalls(renderContextBatch, SceneRendering::PostRender);
PostRender(context, renderContext);
}
@@ -478,9 +481,22 @@ void MainRenderTask::OnBegin(GPUContext* context)
SceneRenderTask::OnBegin(context);
}
RenderContext::RenderContext(SceneRenderTask* task)
RenderContext::RenderContext(SceneRenderTask* task) noexcept
{
Buffers = task->Buffers;
Task = task;
View = task->View;
}
RenderContextBatch::RenderContextBatch(SceneRenderTask* task)
{
Buffers = task->Buffers;
Task = task;
}
RenderContextBatch::RenderContextBatch(const RenderContext& context)
{
Buffers = context.Buffers;
Task = context.Task;
Contexts.Add(context);
}