From eeb449202314929f9c74bacb39c42d794feea170 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 6 Jun 2025 23:39:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Camera=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=9C=A8=E6=B8=B2=E6=9F=93=E5=99=A8=E4=B8=AD=E7=9A=84=E5=AE=9A?= =?UTF-8?q?=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/hgl/WorkObject.h | 2 +- inc/hgl/graph/RenderFramework.h | 2 ++ inc/hgl/graph/RenderTask.h | 10 ++-------- inc/hgl/graph/Renderer.h | 6 +++++- inc/hgl/graph/VK.h | 9 +++++++++ inc/hgl/graph/VKRenderTarget.h | 6 +++--- src/SceneGraph/RenderFramework.cpp | 5 +++++ src/SceneGraph/render/RenderTask.cpp | 4 ++-- src/SceneGraph/render/Renderer.cpp | 29 +++++++++++++++++++++++++--- 9 files changed, 55 insertions(+), 18 deletions(-) diff --git a/inc/hgl/WorkObject.h b/inc/hgl/WorkObject.h index 19ee53f5..7d8d1045 100644 --- a/inc/hgl/WorkObject.h +++ b/inc/hgl/WorkObject.h @@ -47,8 +47,8 @@ namespace hgl graph::Scene * GetScene (){return scene;} graph::SceneNode * GetSceneRoot (){return scene->GetRootNode();} - graph::Renderer * GetRenderer (){return renderer;} + graph::Camera * GetCamera (){return renderer->GetCurCamera();} public: diff --git a/inc/hgl/graph/RenderFramework.h b/inc/hgl/graph/RenderFramework.h index edbc4ed0..d902902a 100644 --- a/inc/hgl/graph/RenderFramework.h +++ b/inc/hgl/graph/RenderFramework.h @@ -53,6 +53,7 @@ protected: protected: Scene * default_scene =nullptr; + Camera * default_camera =nullptr; Renderer * default_renderer=nullptr; void CreateDefaultRenderer(); @@ -81,6 +82,7 @@ public: public: Scene * GetDefaultScene (){return default_scene;} + Camera * GetDefaultCamera (){return default_camera;} Renderer * GetDefaultRenderer (){return default_renderer;} public: diff --git a/inc/hgl/graph/RenderTask.h b/inc/hgl/graph/RenderTask.h index 911f0629..f975b683 100644 --- a/inc/hgl/graph/RenderTask.h +++ b/inc/hgl/graph/RenderTask.h @@ -5,12 +5,6 @@ namespace hgl::graph { - class SceneNode; - class Scene; - class Camera; - class IRenderTarget; - class RenderList; - HGL_DEFINE_IDNAME(RenderTaskName,char) /** @@ -38,8 +32,8 @@ namespace hgl::graph virtual ~RenderTask(); - bool Set(IRenderTarget *rt); - void Set(Camera *c){camera=c;} + bool SetRenderTarget(IRenderTarget *rt); + void SetCamera(Camera *c){camera=c;} bool RebuildRenderList(SceneNode *); diff --git a/inc/hgl/graph/Renderer.h b/inc/hgl/graph/Renderer.h index 9e01408d..deab643a 100644 --- a/inc/hgl/graph/Renderer.h +++ b/inc/hgl/graph/Renderer.h @@ -10,6 +10,8 @@ namespace hgl::graph using RenderTaskNameMap=Map; + using UBOCameraInfo=DeviceBufferMap; + /** * 渲染器 */ @@ -20,6 +22,8 @@ namespace hgl::graph Camera *camera; + UBOCameraInfo *ubo_camera_info; + //RenderTaskNameMap static_render_task_list; ///<静态渲染任务列表 //RenderTaskNameMap dynamic_render_task_list; ///<动态渲染任务列表 @@ -43,7 +47,7 @@ namespace hgl::graph Renderer(IRenderTarget *); virtual ~Renderer(); - void SetRenderTarget(IRenderTarget *); + bool SetRenderTarget(IRenderTarget *); void SetCurScene(Scene *); void SetCurCamera(Camera *); diff --git a/inc/hgl/graph/VK.h b/inc/hgl/graph/VK.h index 16eaff48..9553bc7d 100644 --- a/inc/hgl/graph/VK.h +++ b/inc/hgl/graph/VK.h @@ -136,6 +136,15 @@ class RenderResource; class StaticMesh; +class SceneNode; +class Scene; +class RenderList; + +struct CameraInfo; +struct Camera; + +class Renderer; + enum class SharingMode { Exclusive = 0, diff --git a/inc/hgl/graph/VKRenderTarget.h b/inc/hgl/graph/VKRenderTarget.h index bef37750..19c71e7f 100644 --- a/inc/hgl/graph/VKRenderTarget.h +++ b/inc/hgl/graph/VKRenderTarget.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -72,10 +73,9 @@ public: // Command Buffer public: - virtual void Bind (Material *mtl) + virtual const ViewportInfo *GetViewportInfo ()const { - if(mtl) - desc_binding.Bind(mtl); + return ubo_vp_info->data(); } };//class IRenderTarget diff --git a/src/SceneGraph/RenderFramework.cpp b/src/SceneGraph/RenderFramework.cpp index 0b40fe29..6e2bde18 100644 --- a/src/SceneGraph/RenderFramework.cpp +++ b/src/SceneGraph/RenderFramework.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,7 @@ RenderFramework::RenderFramework(const OSString &an) RenderFramework::~RenderFramework() { SAFE_CLEAR(default_renderer) + SAFE_CLEAR(default_camera) SAFE_CLEAR(default_scene) SAFE_CLEAR(render_resource) SAFE_CLEAR(module_manager) @@ -124,6 +126,8 @@ bool RenderFramework::Init(uint w,uint h) default_scene=new Scene; + default_camera=new Camera(); + CreateDefaultRenderer(); return(true); @@ -135,6 +139,7 @@ void RenderFramework::CreateDefaultRenderer() default_renderer=new Renderer(GetSwapchainRenderTarget()); default_renderer->SetCurScene(default_scene); + default_renderer->SetCurCamera(default_camera); } void RenderFramework::OnResize(uint w,uint h) diff --git a/src/SceneGraph/render/RenderTask.cpp b/src/SceneGraph/render/RenderTask.cpp index 05ec6548..3168e7b7 100644 --- a/src/SceneGraph/render/RenderTask.cpp +++ b/src/SceneGraph/render/RenderTask.cpp @@ -13,7 +13,7 @@ namespace hgl::graph render_target=nullptr; render_list=nullptr; - Set(rt); + SetRenderTarget(rt); } RenderTask::~RenderTask() @@ -21,7 +21,7 @@ namespace hgl::graph SAFE_CLEAR(render_list) } - bool RenderTask::Set(IRenderTarget *rt) + bool RenderTask::SetRenderTarget(IRenderTarget *rt) { if(render_target) { diff --git a/src/SceneGraph/render/Renderer.cpp b/src/SceneGraph/render/Renderer.cpp index 2fc9d147..d930fdab 100644 --- a/src/SceneGraph/render/Renderer.cpp +++ b/src/SceneGraph/render/Renderer.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include namespace hgl::graph { @@ -9,6 +11,7 @@ namespace hgl::graph render_target=rt; scene=nullptr; camera=nullptr; + ubo_camera_info=rt->GetDevice()->CreateUBO(); render_task=new RenderTask("DefaultRenderTask",rt); clear_color.Set(0,0,0,1); @@ -16,17 +19,30 @@ namespace hgl::graph Renderer::~Renderer() { + delete ubo_camera_info; delete render_task; } - void Renderer::SetRenderTarget(IRenderTarget *rt) + bool Renderer::SetRenderTarget(IRenderTarget *rt) { if(render_target==rt) - return; + return(true); + + if(render_target) + { + if(render_target->GetDevice()!=rt->GetDevice()) + { + //换Device是不允许的,当然这一般也不可能 + return(false); + } + } render_target=rt; - render_task->Set(rt); + render_task->SetRenderTarget(rt); + render_task->SetCamera(camera); + + return(true); } void Renderer::SetCurScene(Scene *sw) @@ -69,6 +85,8 @@ namespace hgl::graph // camera->Join(this); //} + + render_task->SetCamera(camera); //它要camera只是为了CPU端算远近 } bool Renderer::RenderFrame() @@ -83,6 +101,11 @@ namespace hgl::graph root->RefreshMatrix(); + if(camera) + { + RefreshCameraInfo(ubo_camera_info->data(),render_target->GetViewportInfo(),camera); + } + render_task->RebuildRenderList(root); bool result=false;