[WIP] Renderer/RenderTask

This commit is contained in:
hyzboy 2025-05-30 00:32:45 +08:00
parent 8f1b891f9e
commit 5c186fdb95
6 changed files with 172 additions and 44 deletions

View File

@ -3,6 +3,7 @@
#include<hgl/graph/RenderFramework.h> #include<hgl/graph/RenderFramework.h>
#include<hgl/graph/VKRenderResource.h> #include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/mtl/MaterialLibrary.h> #include<hgl/graph/mtl/MaterialLibrary.h>
#include<hgl/graph/Renderer.h>
#include<hgl/Time.h> #include<hgl/Time.h>
//#include<iostream> //#include<iostream>
@ -26,12 +27,18 @@ namespace hgl
bool destroy_flag=false; bool destroy_flag=false;
bool renderable=true;
bool render_dirty=true;
protected: protected:
graph::RenderResource *db=nullptr; //暂时的,未来会被更好的机制替代 graph::RenderResource *db=nullptr; //暂时的,未来会被更好的机制替代
/**
* WorkObject中SceneWorld以及一个Renderer即可
* WorldWorkObject上
*/
graph::SceneWorld * world =nullptr; //世界
graph::Renderer * renderer=nullptr; //渲染器
public: public:
@ -44,13 +51,8 @@ namespace hgl
public: public:
const bool IsDestroy()const{return destroy_flag;} const bool IsDestroy ()const{return destroy_flag;}
const bool IsRenderable()const{return renderable;} void MarkDestory(){destroy_flag=true;}
const bool IsRenderDirty()const{return render_dirty;}
void MarkDestory(){destroy_flag=true;}
void SetRenderable(bool r){renderable=r;}
void MarkRenderDirty(){render_dirty=true;}
public: public:

View File

@ -27,7 +27,7 @@ class RenderFramework:public io::WindowEvent
Window * win =nullptr; Window * win =nullptr;
VulkanInstance * inst =nullptr; VulkanInstance * inst =nullptr;
VulkanDevice * device =nullptr; VulkanDevice * device =nullptr;
RenderResource * render_resource =nullptr; RenderResource * render_resource =nullptr;
@ -49,13 +49,13 @@ protected:
public: public:
Window * GetWindow ()const{return win;} Window * GetWindow ()const{return win;}
VulkanDevice * GetDevice ()const{return device;} VulkanDevice * GetDevice ()const{return device;}
VkDevice GetVkDevice ()const{return device->GetDevice();} VkDevice GetVkDevice ()const{return device->GetDevice();}
const VulkanPhyDevice * GetPhyDevice ()const{return device->GetPhyDevice();} const VulkanPhyDevice * GetPhyDevice ()const{return device->GetPhyDevice();}
VulkanDevAttr * GetDevAttr ()const{return device->GetDevAttr();} VulkanDevAttr * GetDevAttr ()const{return device->GetDevAttr();}
RenderResource * GetRenderResource ()const{return render_resource;} RenderResource * GetRenderResource ()const{return render_resource;}
public: public:

View File

@ -20,8 +20,8 @@ namespace hgl::graph
{ {
RenderTaskName task_name; RenderTaskName task_name;
RenderList * render_list;
IRenderTarget * render_target; IRenderTarget * render_target;
RenderList * render_list;
Camera * camera; Camera * camera;
public: public:
@ -34,32 +34,16 @@ namespace hgl::graph
public: public:
RenderTask(const RenderTaskName &tn) RenderTask(const RenderTaskName &tn,IRenderTarget *rt=nullptr,Camera *c=nullptr);
{
task_name=tn;
render_list=nullptr;
render_target=nullptr;
camera=nullptr;
}
RenderTask(const RenderTaskName &tn,RenderList *rl,IRenderTarget *rt=nullptr,Camera *c=nullptr)
{
task_name=tn;
render_list=rl;
render_target=rt;
camera=c;
}
virtual ~RenderTask(); virtual ~RenderTask();
void Set(IRenderTarget *rt){render_target=rt;} bool Set(IRenderTarget *rt);
void Set(Camera *c){camera=c;} void Set(Camera *c){camera=c;}
void Restart(); ///<复位数据,清空渲染列表 void Restart(); ///<复位数据,清空渲染列表
void MakeRenderList(SceneNode *); bool RebuildRenderList(SceneNode *);
bool IsEmpty()const; ///<是否是空的,不可渲染或是没啥可渲染的 bool IsEmpty()const; ///<是否是空的,不可渲染或是没啥可渲染的

View File

@ -11,17 +11,36 @@ namespace hgl::graph
/** /**
* *
*
*/ */
class Renderer class Renderer
{ {
IRenderTarget *render_target;
SceneWorld *world; SceneWorld *world;
RenderTaskNameMap static_render_task_list; ///<静态渲染任务列表 Camera *camera;
RenderTaskNameMap dynamic_render_task_list; ///<动态渲染任务列表
//RenderTaskNameMap static_render_task_list; ///<静态渲染任务列表
//RenderTaskNameMap dynamic_render_task_list; ///<动态渲染任务列表
RenderTask *render_task; ///<当前渲染任务
protected:
public: public:
SceneWorld *GetSceneWorld () const { return world; } ///<获取场景世界
Camera * GetCurCamera () const { return camera; } ///<获取当前相机
public:
Renderer(IRenderTarget *);
virtual ~Renderer();
void SetCurWorld(SceneWorld *);
void SetCurCamera(Camera *);
bool RenderFrame(RenderCmdBuffer *);
};//class Renderer };//class Renderer
}//namespace hgl::graph }//namespace hgl::graph

View File

@ -1,13 +1,47 @@
#include<hgl/graph/RenderTask.h> #include<hgl/graph/RenderTask.h>
#include<hgl/graph/RenderList.h> #include<hgl/graph/RenderList.h>
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VKRenderTarget.h>
namespace hgl::graph namespace hgl::graph
{ {
RenderTask::RenderTask(const RenderTaskName &tn,IRenderTarget *rt,Camera *c)
{
task_name=tn;
camera=c;
render_target=nullptr;
render_list=nullptr;
Set(rt);
}
RenderTask::~RenderTask() RenderTask::~RenderTask()
{ {
SAFE_CLEAR(render_list) SAFE_CLEAR(render_list)
} }
bool RenderTask::Set(IRenderTarget *rt)
{
if(render_target)
{
if(render_target->GetDevice()!=rt->GetDevice())
{
//换Device是不允许的当然这一般也不可能
return(false);
}
}
render_target=rt;
if(!render_list)
{
render_list=new RenderList(rt->GetDevice());
}
return(true);
}
void RenderTask::Restart() void RenderTask::Restart()
{ {
if(!render_list) if(!render_list)
@ -16,16 +50,18 @@ namespace hgl::graph
render_list->Clear(); render_list->Clear();
} }
void RenderTask::MakeRenderList(SceneNode *root) bool RenderTask::RebuildRenderList(SceneNode *root)
{ {
if(!root) if(!root)
return; return(false);
if(!render_list) if(!render_list)
return; return(false);
render_list->Clear(); render_list->Clear();
render_list->Expend(root); render_list->Expend(root);
return(true);
} }
bool RenderTask::IsEmpty()const bool RenderTask::IsEmpty()const
@ -41,6 +77,9 @@ namespace hgl::graph
if(!cmd) if(!cmd)
return(false); return(false);
if(!render_target)
return(false);
if(!render_list) if(!render_list)
return(false); return(false);

View File

@ -0,0 +1,84 @@
#include<hgl/graph/Renderer.h>
#include<hgl/graph/SceneWorld.h>
#include<hgl/graph/VKCommandBuffer.h>
namespace hgl::graph
{
Renderer::Renderer(IRenderTarget *rt)
{
render_target=rt;
world=nullptr;
render_task=new RenderTask("TempRenderTask");
}
Renderer::~Renderer()
{
delete render_task;
delete world;
}
void Renderer::SetCurWorld(SceneWorld *sw)
{
if(world==sw)
return;
//if(world)
//{
// world->Unjoin(this);
//}
world=sw;
//if(world)
//{
// world->Join(this);
//}
}
void Renderer::SetCurCamera(Camera *c)
{
if(!world||!c)
return;
//if(camera)
//{
// if(world)
// camera->Unjoin(world);
// camera->Unjoin(this);
//}
camera=c;
//if(camera)
//{
// if(world)
// camera->Unjoin(world);
// camera->Join(this);
//}
}
bool Renderer::RenderFrame(RenderCmdBuffer *cmd)
{
if(!world)
return(false);
SceneNode *root=world->GetRootNode();
if(!root)
return(false);
root->RefreshMatrix();
render_task->RebuildRenderList(root);
bool result=false;
cmd->BeginRenderPass();
result=render_task->Render(cmd);
cmd->EndRenderPass();
return(result);
}
}//namespace hgl::graph