Compare commits

...

2 Commits

12 changed files with 81 additions and 23 deletions

View File

@ -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:

View File

@ -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:

View File

@ -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 *);

View File

@ -10,6 +10,8 @@ namespace hgl::graph
using RenderTaskNameMap=Map<RenderTaskName,RenderTask *>;
using UBOCameraInfo=DeviceBufferMap<CameraInfo>;
/**
*
*/
@ -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 *);

View File

@ -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,

View File

@ -50,6 +50,8 @@ public:
};//class VulkanCmdBuffer
class DescriptorBinding;
using DescriptorBindingPtr=DescriptorBinding *;
using DescriptorBindingArray=DescriptorBindingPtr[size_t(DescriptorSetType::RANGE_SIZE)];
class RenderCmdBuffer:public VulkanCmdBuffer
{
@ -61,7 +63,7 @@ class RenderCmdBuffer:public VulkanCmdBuffer
RenderPassBeginInfo rp_begin;
VkPipelineLayout pipeline_layout;
DescriptorBinding *desc_binding=nullptr;
DescriptorBindingArray desc_binding{};
private:
@ -72,11 +74,11 @@ public:
RenderCmdBuffer(const VulkanDevAttr *attr,VkCommandBuffer cb);
~RenderCmdBuffer();
void SetDescriptorBinding(DescriptorBinding *db) { desc_binding=db; }
bool SetDescriptorBinding(DescriptorBinding *);
bool End() override
{
desc_binding=nullptr;
hgl_zero(desc_binding);
return VulkanCmdBuffer::End();
}

View File

@ -24,6 +24,10 @@ class DescriptorBinding
Map<AnsiString,DeviceBuffer *> ssbo_map;
Map<AnsiString,Texture *> texture_map;
public:
const DescriptorSetType GetType()const{return set_type;}
public:
DescriptorBinding(const DescriptorSetType &dst)

View File

@ -5,6 +5,7 @@
#include<hgl/graph/VKFramebuffer.h>
#include<hgl/graph/VKSwapchain.h>
#include<hgl/graph/VKQueue.h>
#include<hgl/graph/VKBuffer.h>
#include<hgl/graph/VKPipeline.h>
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VKDescriptorBindingManage.h>
@ -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

View File

@ -10,6 +10,7 @@
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/Scene.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/Renderer.h>
#include<hgl/log/Logger.h>
#include<hgl/Time.h>
@ -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)

View File

@ -25,6 +25,18 @@ RenderCmdBuffer::~RenderCmdBuffer()
hgl_free(clear_values);
}
bool RenderCmdBuffer::SetDescriptorBinding(DescriptorBinding *db)
{
if(!db)
return(false);
const int index=int(db->GetType())-int(DescriptorSetType::BEGIN_RANGE);
desc_binding[index]=db;
return(true);
}
void RenderCmdBuffer::SetClear()
{
if(cv_count>0)
@ -91,8 +103,11 @@ bool RenderCmdBuffer::BindDescriptorSets(Material *mtl)
{
if(!mtl)return(false);
if(desc_binding)
desc_binding->Bind(mtl);
ENUM_CLASS_FOR(DescriptorSetType,int,i)
{
if(desc_binding[i])
desc_binding[i]->Bind(mtl);
}
{
uint32_t count=0;

View File

@ -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)
{

View File

@ -1,6 +1,8 @@
#include<hgl/graph/Renderer.h>
#include<hgl/graph/Scene.h>
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/Camera.h>
namespace hgl::graph
{
@ -9,6 +11,7 @@ namespace hgl::graph
render_target=rt;
scene=nullptr;
camera=nullptr;
ubo_camera_info=rt->GetDevice()->CreateUBO<UBOCameraInfo>();
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;