More cleanup with scene renderer

This commit is contained in:
antopilo
2025-01-12 22:14:30 -05:00
parent c0f8e68daf
commit e52bc15eaa
4 changed files with 32 additions and 48 deletions

View File

@@ -21,11 +21,12 @@ SceneRenderPipeline::SceneRenderPipeline()
{
// Initialize render targets
const Vector2 defaultSize = { 1280, 720 };
GBufferAlbedo = std::make_shared<VulkanImage>(ImageFormat::RGBA16F, defaultSize);
GBufferNormal = std::make_shared<VulkanImage>(ImageFormat::RGBA16F, defaultSize);
GBufferMaterial = std::make_shared<VulkanImage>(ImageFormat::RGBA8, defaultSize);
GBufferDepth = std::make_shared<VulkanImage>(ImageFormat::D32F, defaultSize, ImageUsage::Depth);
ShadingOutput = std::make_shared<VulkanImage>(ImageFormat::RGBA8, defaultSize);
GBufferAlbedo = CreateRef<VulkanImage>(ImageFormat::RGBA16F, defaultSize);
GBufferNormal = CreateRef<VulkanImage>(ImageFormat::RGBA16F, defaultSize);
GBufferMaterial = CreateRef<VulkanImage>(ImageFormat::RGBA8, defaultSize);
GBufferDepth = CreateRef<VulkanImage>(ImageFormat::D32F, defaultSize, ImageUsage::Depth);
ShadingOutput = CreateRef<VulkanImage>(ImageFormat::RGBA8, defaultSize);
// Initialize pipeline
VkShaderManager& shaderMgr = VkShaderManager::Get();
@@ -40,22 +41,22 @@ SceneRenderPipeline::SceneRenderPipeline()
gBufferPass.SetPushConstant<GBufferConstant>(gbufferConstant);
gBufferPass.SetPreRender([&](PassRenderContext& ctx) {
auto& layout = ctx.renderPass->PipelineLayout;
auto& gpu = GPUResources::Get();
ctx.commandBuffer.BindDescriptorSet(layout, gpu.ModelDescriptor, 0);
ctx.commandBuffer.BindDescriptorSet(layout, gpu.SamplerDescriptor, 2);
ctx.commandBuffer.BindDescriptorSet(layout, gpu.MaterialDescriptor, 3);
ctx.commandBuffer.BindDescriptorSet(layout, gpu.TexturesDescriptor, 4);
ctx.commandBuffer.BindDescriptorSet(layout, gpu.LightsDescriptor, 5);
ctx.commandBuffer.BindDescriptorSet(layout, gpu.CamerasDescriptor, 6);
auto& res = GPUResources::Get();
Cmd& cmd = ctx.commandBuffer;
cmd.BindDescriptorSet(layout, res.ModelDescriptor, 0);
cmd.BindDescriptorSet(layout, res.SamplerDescriptor, 2);
cmd.BindDescriptorSet(layout, res.MaterialDescriptor, 3);
cmd.BindDescriptorSet(layout, res.TexturesDescriptor, 4);
cmd.BindDescriptorSet(layout, res.LightsDescriptor, 5);
cmd.BindDescriptorSet(layout, res.CamerasDescriptor, 6);
});
gBufferPass.SetRender([&](PassRenderContext& ctx) {
auto& cmd = ctx.commandBuffer;
auto& scene = ctx.scene;
auto& vk = VkRenderer::Get();
auto& gpu = GPUResources::Get();
Cmd& cmd = ctx.commandBuffer;
Ref<Scene> scene = ctx.scene;
auto& res = GPUResources::Get();
ZoneScopedN("Render Models");
gbufferConstant.CameraID = ctx.cameraID;
auto view = scene->m_Registry.view<TransformComponent, ModelComponent, VisibilityComponent>();
@@ -67,14 +68,14 @@ SceneRenderPipeline::SceneRenderPipeline()
continue;
}
gbufferConstant.Index = gpu.ModelMatrixMapping[Entity((entt::entity)e, scene.get()).GetID()];
gbufferConstant.Index = res.ModelMatrixMapping[Entity((entt::entity)e, scene.get()).GetID()];
for (auto& m : mesh.ModelResource->GetMeshes())
{
Ref<VkMesh> vkMesh = m->GetVkMesh();
cmd.BindDescriptorSet(ctx.renderPass->PipelineLayout, vkMesh->GetDescriptorSet(), 1);
gbufferConstant.MaterialIndex = gpu.MeshMaterialMapping[vkMesh->GetID()];
gbufferConstant.MaterialIndex = res.MeshMaterialMapping[vkMesh->GetID()];
cmd.PushConstants(ctx.renderPass->PipelineLayout, sizeof(GBufferConstant), &gbufferConstant);
cmd.BindIndexBuffer(vkMesh->GetIndexBuffer()->GetBuffer());

View File

@@ -70,7 +70,7 @@ namespace Nuake
void SetCamera(UUID camera);
void Render(PassRenderContext& ctx);
Ref<VulkanImage> GetOutput() { return ShadingOutput; }
Ref<VulkanImage> GetOutput() { return GBufferAlbedo; }
private:
Ref<VulkanImage> ResizeImage(Ref<VulkanImage> image, const Vector2& size);

View File

@@ -19,10 +19,6 @@
namespace Nuake
{
struct CameraData;
struct ModelData
{
std::array<Matrix4, 3000> Data;
@@ -88,11 +84,6 @@ namespace Nuake
//char padding[64]; // 124 bytes to reach 128 bytes
};
struct LightResources
{
};
constexpr uint32_t MAX_MODEL_MATRIX = 3000;
constexpr uint32_t MAX_MATERIAL = 1000;
constexpr uint32_t MAX_TEXTURES = 500;

View File

@@ -264,7 +264,8 @@ void VkSceneRenderer::BeginScene(RenderContext inContext)
passCtx.scene = inContext.CurrentScene;
passCtx.commandBuffer = inContext.CommandBuffer;
passCtx.resolution = Context.Size;
passCtx.cameraID = GPUResources::Get().GetBindlessCameraID(inContext.CameraID);
auto view = scene->m_Registry.view<TransformComponent, LightComponent>();
for (auto e : view)
{
@@ -295,27 +296,18 @@ void VkSceneRenderer::BeginScene(RenderContext inContext)
sceneRenderPipeline->Render(passCtx);
}
void VkSceneRenderer::EndScene()
{
auto& vk = VkRenderer::Get();
auto& cmd = Context.CommandBuffer;
//auto& albedo = GBufferPipeline.GetRenderPass("GBuffer").GetAttachment("Albedo");
//auto& normal = GBufferPipeline.GetRenderPass("GBuffer").GetAttachment("Normal");
//auto& shading = GBufferPipeline.GetRenderPass("Shading").GetAttachment("Output");
//auto& shadow = ShadowPipeline.GetRenderPass("Shadow").GetDepthAttachment();
//auto& selectedOutput = shading;
// Copy final output to DrawImage.
//cmd.TransitionImageLayout(selectedOutput.Image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
cmd.TransitionImageLayout(vk.DrawImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
//cmd.CopyImageToImage(selectedOutput.Image, vk.GetDrawImage());
cmd.TransitionImageLayout(vk.DrawImage, VK_IMAGE_LAYOUT_GENERAL);
//cmd.TransitionImageLayout(selectedOutput.Image, VK_IMAGE_LAYOUT_GENERAL);
//cmd.TransitionImageLayout(shadow.Image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
Ref<VulkanImage> drawImage = VkRenderer::Get().GetDrawImage();
Ref<VulkanImage> output = sceneRenderPipeline->GetOutput();
Cmd& cmd = Context.CommandBuffer;
cmd.TransitionImageLayout(output, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
cmd.TransitionImageLayout(drawImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
cmd.CopyImageToImage(output, drawImage);
cmd.TransitionImageLayout(drawImage, VK_IMAGE_LAYOUT_GENERAL);
cmd.TransitionImageLayout(output, VK_IMAGE_LAYOUT_GENERAL);
}
void VkSceneRenderer::LoadShaders()