From 22e37512f63c5166b368130261bef35f836388e4 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 16 Jun 2021 21:03:52 +0800 Subject: [PATCH] moved material_parameters_renderable to Material class. --- example/Vulkan/two_triangle.cpp | 13 +++++-- inc/hgl/graph/SceneTreeToRenderList.h | 7 ++-- inc/hgl/graph/VKMaterialInstance.h | 29 +++++++++++++++ inc/hgl/graph/VKRenderTarget.h | 12 +++---- inc/hgl/graph/VKRenderableInstance.h | 5 ++- src/SceneGraph/RenderList.cpp | 10 ++++-- src/SceneGraph/SceneTreeToRenderList.cpp | 13 ++++++- src/SceneGraph/Vulkan/VKMaterialInstance.cpp | 35 +++++++++++++++++++ .../Vulkan/VKRenderTargetPipeline.cpp | 12 +++---- .../Vulkan/VKRenderableInstance.cpp | 11 ------ 10 files changed, 112 insertions(+), 35 deletions(-) create mode 100644 inc/hgl/graph/VKMaterialInstance.h create mode 100644 src/SceneGraph/Vulkan/VKMaterialInstance.cpp diff --git a/example/Vulkan/two_triangle.cpp b/example/Vulkan/two_triangle.cpp index e278af4e..4beb6182 100644 --- a/example/Vulkan/two_triangle.cpp +++ b/example/Vulkan/two_triangle.cpp @@ -36,7 +36,7 @@ private: SceneNode render_root; RenderList render_list; - MaterialParameters * material_instance =nullptr; + MaterialInstance * material_instance =nullptr; RenderableInstance *render_instance =nullptr; GPUBuffer * ubo_camera_info =nullptr; @@ -71,8 +71,15 @@ private: if(!ubo_camera_info) return(false); - material_instance->BindUBO("camera",ubo_camera_info); - material_instance->Update(); + { + MaterialParameters *mp_global=material_instance->GetMP(DescriptorSetsType::Global); + + if(!mp_global) + return(false); + + mp_global->BindUBO("g_camera",ubo_camera_info); + mp_global->Update(); + } return(true); } diff --git a/inc/hgl/graph/SceneTreeToRenderList.h b/inc/hgl/graph/SceneTreeToRenderList.h index a27fc4cf..dcfa9a09 100644 --- a/inc/hgl/graph/SceneTreeToRenderList.h +++ b/inc/hgl/graph/SceneTreeToRenderList.h @@ -18,9 +18,9 @@ namespace hgl class SceneTreeToRenderList { - using PipelineSets =Sets; + //using PipelineSets =Sets; using MaterialSets =Sets; - using MatInstSets =Sets; + //using MatInstSets =Sets; protected: @@ -38,9 +38,10 @@ namespace hgl RenderNodeList render_node_list; ///<场景节点列表 //PipelineSets pipeline_sets; ///<管线合集 - //MaterialSets material_sets; ///<材质合集 + MaterialSets material_sets; ///<材质合集 //MatInstSets mat_inst_sets; ///<材质实例合集 + 需将以下两行数据转到RenderList,避免这边释放信息就没了。two_triangle测试这个 MVPArrayBuffer *mvp_array; List ri_list; diff --git a/inc/hgl/graph/VKMaterialInstance.h b/inc/hgl/graph/VKMaterialInstance.h new file mode 100644 index 00000000..c0eaf70f --- /dev/null +++ b/inc/hgl/graph/VKMaterialInstance.h @@ -0,0 +1,29 @@ +#ifndef HGL_GRAPH_VULKAN_MATERIAL_INSTANCE_INCLUDE +#define HGL_GRAPH_VULKAN_MATERIAL_INSTANCE_INCLUDE + +#include + +VK_NAMESPACE_BEGIN +class MaterialInstance +{ + Material *material; + + MaterialParameters *mp_value; + +private: + + friend class Material; + + MaterialInstance(Material *,MaterialParameters *); + +public: + + virtual ~MaterialInstance(); + + Material *GetMaterial(){return material;} + + MaterialParameters *GetMP(){return mp_value;} + MaterialParameters *GetMP(const DescriptorSetsType &type); +};//class MaterialInstance +VK_NAMESPACE_END +#endif//HGL_GRAPH_VULKAN_MATERIAL_INSTANCE_INCLUDE diff --git a/inc/hgl/graph/VKRenderTarget.h b/inc/hgl/graph/VKRenderTarget.h index 7a2c5eb9..77075ceb 100644 --- a/inc/hgl/graph/VKRenderTarget.h +++ b/inc/hgl/graph/VKRenderTarget.h @@ -54,12 +54,12 @@ public: public: //pipeline - Pipeline *CreatePipeline(const Material *, const InlinePipeline &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline *CreatePipeline(const MaterialInstance *, const InlinePipeline &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline *CreatePipeline(const Material *, PipelineData *, const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline *CreatePipeline(const MaterialInstance *, PipelineData *, const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline *CreatePipeline(const Material *, const OSString &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline *CreatePipeline(const MaterialInstance *, const OSString &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline *CreatePipeline(Material *, const InlinePipeline &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline *CreatePipeline(Material *, PipelineData *, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline *CreatePipeline(MaterialInstance *, PipelineData *, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline *CreatePipeline(Material *, const OSString &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline *CreatePipeline(MaterialInstance *, const OSString &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); public: // command buffer diff --git a/inc/hgl/graph/VKRenderableInstance.h b/inc/hgl/graph/VKRenderableInstance.h index e081b0d6..addfaafe 100644 --- a/inc/hgl/graph/VKRenderableInstance.h +++ b/inc/hgl/graph/VKRenderableInstance.h @@ -18,8 +18,6 @@ class RenderableInstance MaterialInstance * mat_inst; Renderable * render_obj; - MaterialParameters *mp_r; - uint32_t buffer_count; VkBuffer * buffer_list; VkDeviceSize * buffer_size; @@ -38,6 +36,7 @@ public: Pipeline * GetPipeline (){return pipeline;} VkPipelineLayout GetPipelineLayout (){return mat_inst->GetMaterial()->GetPipelineLayout();} + Material * GetMaterial (){return mat_inst->GetMaterial();} MaterialInstance * GetMaterialInstance (){return mat_inst;} Renderable * GetRenderable (){return render_obj;} const AABB & GetBoundingBox ()const{return render_obj->GetBoundingBox();} @@ -51,7 +50,7 @@ public: const uint32_t GetBufferHash ()const{return buffer_hash;} - MaterialParameters *GetMP (const DescriptorSetsType &type); + MaterialParameters *GetMP (const DescriptorSetsType &type){return mat_inst->GetMP(type);} };//class RenderableInstance RenderableInstance *CreateRenderableInstance(Renderable *,MaterialInstance *,Pipeline *); diff --git a/src/SceneGraph/RenderList.cpp b/src/SceneGraph/RenderList.cpp index 9b1be789..bc00505d 100644 --- a/src/SceneGraph/RenderList.cpp +++ b/src/SceneGraph/RenderList.cpp @@ -72,10 +72,16 @@ namespace hgl { ds_list[ds_count]=mp->GetVkDescriptorSet(); ++ds_count; + + cmd_buf->BindDescriptorSets(ri->GetPipelineLayout(),ds_list,ds_count,&ubo_offset,1); + } + else + { + cmd_buf->BindDescriptorSets(ri->GetPipelineLayout(),ds_list,ds_count,nullptr,0); } - } - cmd_buf->BindDescriptorSets(ri->GetPipelineLayout(),ds_list,ds_count,&ubo_offset,1); + ubo_offset+=ubo_align; + } } if(last_vbo!=ri->GetBufferHash()) diff --git a/src/SceneGraph/SceneTreeToRenderList.cpp b/src/SceneGraph/SceneTreeToRenderList.cpp index 81b7808f..12046ab9 100644 --- a/src/SceneGraph/SceneTreeToRenderList.cpp +++ b/src/SceneGraph/SceneTreeToRenderList.cpp @@ -90,7 +90,7 @@ namespace hgl ri_list.ClearData(); //pipeline_sets.ClearData(); - //material_sets.ClearData(); + material_sets.ClearData(); //mat_inst_sets.ClearData(); return(true); @@ -132,6 +132,15 @@ namespace hgl } } + //为所有的材质绑定 + for(Material *mtl:material_sets) + { + MaterialParameters *mp=mtl->GetMP(DescriptorSetsType::Renderable); + + if(mp) + mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),false); + } + //写入RenderList render_list->Set( &ri_list, mvp_array->GetBuffer(), @@ -158,6 +167,8 @@ namespace hgl rn->ri=ri; render_node_list.Add(rn); + + material_sets.Add(ri->GetMaterial()); } for(SceneNode *sub:sn->SubNode) diff --git a/src/SceneGraph/Vulkan/VKMaterialInstance.cpp b/src/SceneGraph/Vulkan/VKMaterialInstance.cpp new file mode 100644 index 00000000..acb4e1da --- /dev/null +++ b/src/SceneGraph/Vulkan/VKMaterialInstance.cpp @@ -0,0 +1,35 @@ +#include +#include +#include + +VK_NAMESPACE_BEGIN +MaterialInstance *Material::CreateInstance() +{ + MaterialParameters *mp=CreateMP(DescriptorSetsType::Value); + + return(new MaterialInstance(this,mp)); +} + +MaterialInstance::MaterialInstance(Material *mtl,MaterialParameters *p) +{ + material=mtl; + + mp_value=p; +} + +MaterialInstance::~MaterialInstance() +{ + SAFE_CLEAR(mp_value); +} + +MaterialParameters *MaterialInstance::GetMP(const DescriptorSetsType &type) +{ + //if(type==DescriptorSetsType::Texture + // return mp_texture; + + if(type==DescriptorSetsType::Value) + return mp_value; + + return material->GetMP(type); +} +VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKRenderTargetPipeline.cpp b/src/SceneGraph/Vulkan/VKRenderTargetPipeline.cpp index e9159cfb..d60035ba 100644 --- a/src/SceneGraph/Vulkan/VKRenderTargetPipeline.cpp +++ b/src/SceneGraph/Vulkan/VKRenderTargetPipeline.cpp @@ -5,7 +5,7 @@ #include VK_NAMESPACE_BEGIN -Pipeline *RenderTarget::CreatePipeline(const Material *mtl,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) +Pipeline *RenderTarget::CreatePipeline(Material *mtl,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) { if(!mtl)return(nullptr); @@ -21,14 +21,14 @@ Pipeline *RenderTarget::CreatePipeline(const Material *mtl,const InlinePipeline return p; } -Pipeline *RenderTarget::CreatePipeline(const MaterialInstance *mi,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) +Pipeline *RenderTarget::CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) { if(!mi)return(nullptr); return CreatePipeline(mi->GetMaterial(),ip,prim,prim_restart); } -Pipeline *RenderTarget::CreatePipeline(const Material *mtl,PipelineData *pd,const Prim &prim,const bool prim_restart) +Pipeline *RenderTarget::CreatePipeline(Material *mtl,PipelineData *pd,const Prim &prim,const bool prim_restart) { pd->Set(prim,prim_restart); @@ -40,12 +40,12 @@ Pipeline *RenderTarget::CreatePipeline(const Material *mtl,PipelineData *pd,cons return(p); } -Pipeline *RenderTarget::CreatePipeline(const MaterialInstance *mi,PipelineData *pd,const Prim &prim,const bool prim_restart) +Pipeline *RenderTarget::CreatePipeline(MaterialInstance *mi,PipelineData *pd,const Prim &prim,const bool prim_restart) { return CreatePipeline(mi->GetMaterial(),pd,prim,prim_restart); } -Pipeline *RenderTarget::CreatePipeline(const Material *mtl,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart) +Pipeline *RenderTarget::CreatePipeline(Material *mtl,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart) { PipelineData *pd=GetPipelineData(pipeline_filename); @@ -54,7 +54,7 @@ Pipeline *RenderTarget::CreatePipeline(const Material *mtl,const OSString &pipel return CreatePipeline(mtl,pd,prim,prim_restart); } -Pipeline *RenderTarget::CreatePipeline(const MaterialInstance *mi,const OSString &filename,const Prim &prim,const bool prim_restart) +Pipeline *RenderTarget::CreatePipeline(MaterialInstance *mi,const OSString &filename,const Prim &prim,const bool prim_restart) { return CreatePipeline(mi->GetMaterial(),filename,prim,prim_restart); } diff --git a/src/SceneGraph/Vulkan/VKRenderableInstance.cpp b/src/SceneGraph/Vulkan/VKRenderableInstance.cpp index db8df471..b2fb1f9a 100644 --- a/src/SceneGraph/Vulkan/VKRenderableInstance.cpp +++ b/src/SceneGraph/Vulkan/VKRenderableInstance.cpp @@ -15,8 +15,6 @@ RenderableInstance::RenderableInstance(Renderable *r,MaterialInstance *mi,Pipeli pipeline=p; mat_inst=mi; - mp_r=mi->GetMaterial()->CreateMP(DescriptorSetsType::Renderable); - buffer_count=count; buffer_list=bl; buffer_size=bs; @@ -29,21 +27,12 @@ RenderableInstance::RenderableInstance(Renderable *r,MaterialInstance *mi,Pipeli RenderableInstance::~RenderableInstance() { - SAFE_CLEAR(mp_r); //需要在这里添加删除pipeline/desc_sets/render_obj引用计数的代码 delete[] buffer_list; delete[] buffer_size; } -MaterialParameters *RenderableInstance::GetMP(const DescriptorSetsType &type) -{ - if(type==DescriptorSetsType::Renderable) - return mp_r; - - return mat_inst->GetMP(type); -} - RenderableInstance *CreateRenderableInstance(Renderable *r,MaterialInstance *mi,Pipeline *p) { if(!r||!mi||!p)return(nullptr);