From bb5aea524487b63a37950de2a170fa7b76ffad46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 29 Jul 2021 20:17:19 +0200 Subject: [PATCH] Fix graphics examples --- examples/DeferredShading/main.cpp | 41 +++++++++---------- examples/GraphicsTest/main.cpp | 68 +++++++------------------------ 2 files changed, 34 insertions(+), 75 deletions(-) diff --git a/examples/DeferredShading/main.cpp b/examples/DeferredShading/main.cpp index 621231a90..0332b9e22 100644 --- a/examples/DeferredShading/main.cpp +++ b/examples/DeferredShading/main.cpp @@ -2,14 +2,8 @@ #include #include #include -#include -#include #include #include -#include -#include -#include -#include #include #include #include @@ -554,6 +548,10 @@ int main() std::size_t bloomTextureB; std::size_t lightOutput; + Nz::SubmeshRenderer submeshRenderer; + + std::size_t forwardPassIndex = Nz::Graphics::Instance()->GetMaterialPassRegistry().GetPassIndex("ForwardPass"); + Nz::BakedFrameGraph bakedGraph = [&] { Nz::PixelFormat depthStencilFormat = Nz::PixelFormat::Undefined; @@ -650,15 +648,16 @@ int main() builder.BindShaderBinding(Nz::Graphics::ViewerBindingSet, viewerInstance.GetShaderBinding()); - builder.BindShaderBinding(Nz::Graphics::WorldBindingSet, modelInstance1.GetShaderBinding()); - spaceshipModel.Draw("ForwardPass", builder); + std::vector> elements; + spaceshipModel.BuildElement(forwardPassIndex, modelInstance1, elements); + spaceshipModel.BuildElement(forwardPassIndex, modelInstance2, elements); + planeModel.BuildElement(forwardPassIndex, planeInstance, elements); - builder.BindShaderBinding(Nz::Graphics::WorldBindingSet, modelInstance2.GetShaderBinding()); - spaceshipModel.Draw("ForwardPass", builder); + std::vector> elementPointers; + for (const auto& element : elements) + elementPointers.emplace_back(element.get()); - // Plane - builder.BindShaderBinding(Nz::Graphics::WorldBindingSet, planeInstance.GetShaderBinding()); - planeModel.Draw("ForwardPass", builder); + submeshRenderer.Render(builder, elementPointers.data(), elementPointers.size()); }); Nz::FramePass& lightingPass = graph.AddPass("Lighting pass"); @@ -673,8 +672,8 @@ int main() builder.SetViewport(renderArea); //builder.BindVertexBuffer(0, vertexBuffer.get()); - builder.BindIndexBuffer(coneMeshGfx->GetIndexBuffer(0).get()); - builder.BindVertexBuffer(0, coneMeshGfx->GetVertexBuffer(0).get()); + builder.BindIndexBuffer(*coneMeshGfx->GetIndexBuffer(0).get()); + builder.BindVertexBuffer(0, *coneMeshGfx->GetVertexBuffer(0).get()); builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(1, *gbufferShaderBinding); @@ -707,8 +706,8 @@ int main() builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(1, *skyboxShaderBinding); - builder.BindIndexBuffer(cubeMeshGfx->GetIndexBuffer(0).get()); - builder.BindVertexBuffer(0, cubeMeshGfx->GetVertexBuffer(0).get()); + builder.BindIndexBuffer(*cubeMeshGfx->GetIndexBuffer(0)); + builder.BindVertexBuffer(0, *cubeMeshGfx->GetVertexBuffer(0)); builder.BindPipeline(*skyboxPipeline); builder.DrawIndexed(static_cast(cubeMeshGfx->GetIndexCount(0))); @@ -733,7 +732,7 @@ int main() builder.BindShaderBinding(1, *bloomBrightShaderBinding); builder.BindPipeline(*bloomBrightPipeline); - builder.BindVertexBuffer(0, fullscreenVertexBuffer.get()); + builder.BindVertexBuffer(0, *fullscreenVertexBuffer); builder.Draw(3); }); @@ -754,7 +753,7 @@ int main() builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(1, *gaussianBlurShaderBinding); builder.BindPipeline(*gaussianBlurPipeline); - builder.BindVertexBuffer(0, fullscreenVertexBuffer.get()); + builder.BindVertexBuffer(0, *fullscreenVertexBuffer); builder.Draw(3); }); @@ -775,7 +774,7 @@ int main() builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(1, *bloomBlendShaderBinding); builder.BindPipeline(*bloomBlendPipeline); - builder.BindVertexBuffer(0, fullscreenVertexBuffer.get()); + builder.BindVertexBuffer(0, *fullscreenVertexBuffer); builder.Draw(3); }); @@ -1124,7 +1123,7 @@ int main() builder.BindShaderBinding(0, *finalBlitBinding); builder.BindPipeline(*fullscreenPipeline); - builder.BindVertexBuffer(0, fullscreenVertexBuffer.get()); + builder.BindVertexBuffer(0, *fullscreenVertexBuffer); builder.Draw(3); } builder.EndRenderPass(); diff --git a/examples/GraphicsTest/main.cpp b/examples/GraphicsTest/main.cpp index 224ed75c8..92aafb1f2 100644 --- a/examples/GraphicsTest/main.cpp +++ b/examples/GraphicsTest/main.cpp @@ -81,15 +81,22 @@ int main() Nz::Vector2ui windowSize = window.GetSize(); - Nz::ViewerInstance viewerInstance; + Nz::Camera camera(window.GetImpl()); + + Nz::ViewerInstance& viewerInstance = camera.GetViewerInstance(); viewerInstance.UpdateTargetSize(Nz::Vector2f(window.GetSize())); viewerInstance.UpdateProjViewMatrices(Nz::Matrix4f::Perspective(Nz::DegreeAnglef(70.f), float(windowSize.x) / windowSize.y, 0.1f, 1000.f), Nz::Matrix4f::Translate(Nz::Vector3f::Backward() * 1)); - Nz::WorldInstance modelInstance; - modelInstance.UpdateWorldMatrix(Nz::Matrix4f::Translate(Nz::Vector3f::Forward() * 2 + Nz::Vector3f::Left())); + Nz::WorldInstancePtr modelInstance = std::make_shared(); + modelInstance->UpdateWorldMatrix(Nz::Matrix4f::Translate(Nz::Vector3f::Forward() * 2 + Nz::Vector3f::Left())); - Nz::WorldInstance modelInstance2; - modelInstance2.UpdateWorldMatrix(Nz::Matrix4f::Translate(Nz::Vector3f::Forward() * 2 + Nz::Vector3f::Right())); + Nz::WorldInstancePtr modelInstance2 = std::make_shared(); + modelInstance2->UpdateWorldMatrix(Nz::Matrix4f::Translate(Nz::Vector3f::Forward() * 2 + Nz::Vector3f::Right())); + + Nz::ForwardFramePipeline framePipeline; + framePipeline.RegisterViewer(&camera); + framePipeline.RegisterInstancedDrawable(modelInstance, &model); + framePipeline.RegisterInstancedDrawable(modelInstance2, &model); Nz::RenderWindowImpl* windowImpl = window.GetImpl(); @@ -106,7 +113,6 @@ int main() Nz::Mouse::SetRelativeMouseMode(true); - bool updateMat = false; while (window.IsOpen()) { Nz::WindowEvent event; @@ -120,10 +126,7 @@ int main() case Nz::WindowEventType::KeyPressed: if (event.key.virtualKey == Nz::Keyboard::VKey::A) - { basicMat.EnableAlphaTest(!basicMat.IsAlphaTestEnabled()); - updateMat = true; - } break; @@ -192,52 +195,9 @@ int main() Nz::UploadPool& uploadPool = frame.GetUploadPool(); viewerInstance.UpdateViewMatrix(Nz::Matrix4f::ViewMatrix(viewerPos, camAngles)); + framePipeline.InvalidateViewer(&camera); - frame.Execute([&](Nz::CommandBufferBuilder& builder) - { - builder.BeginDebugRegion("UBO Update", Nz::Color::Yellow); - { - builder.PreTransferBarrier(); - - viewerInstance.UpdateBuffers(uploadPool, builder); - modelInstance.UpdateBuffers(uploadPool, builder); - modelInstance2.UpdateBuffers(uploadPool, builder); - - updateMat = materialPass->Update(frame, builder) || updateMat; - - builder.PostTransferBarrier(); - } - builder.EndDebugRegion(); - }, Nz::QueueType::Transfer); - - frame.Execute([&](Nz::CommandBufferBuilder& builder) - { - Nz::Recti renderRect(0, 0, window.GetSize().x, window.GetSize().y); - - Nz::CommandBufferBuilder::ClearValues clearValues[2]; - clearValues[0].color = Nz::Color::Black; - clearValues[1].depth = 1.f; - clearValues[1].stencil = 0; - - builder.BeginDebugRegion("Main window rendering", Nz::Color::Green); - { - builder.BeginRenderPass(windowImpl->GetFramebuffer(frame.GetFramebufferIndex()), windowImpl->GetRenderPass(), renderRect, { clearValues[0], clearValues[1] }); - { - builder.SetScissor(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); - builder.SetViewport(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); - builder.BindShaderBinding(Nz::Graphics::ViewerBindingSet, viewerInstance.GetShaderBinding()); - - for (Nz::WorldInstance& instance : { std::ref(modelInstance), std::ref(modelInstance2) }) - { - builder.BindShaderBinding(Nz::Graphics::WorldBindingSet, instance.GetShaderBinding()); - - model.Draw("ForwardPass", builder); - } - } - builder.EndRenderPass(); - } - builder.EndDebugRegion(); - }, Nz::QueueType::Graphics); + framePipeline.Render(frame); frame.Present();