mirror of
https://github.com/antopilo/Nuake.git
synced 2026-09-15 20:08:54 +03:00
More cleanup with scene renderer
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user