From 3fd6f98ef7c2b1bfd289d243ad496832ef607ced Mon Sep 17 00:00:00 2001 From: hyzboy Date: Thu, 12 Jun 2025 00:00:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=90=E8=B4=A8=E4=BF=9D=E5=AD=98=E6=9D=A5?= =?UTF-8?q?=E8=87=AAMaterialCreateInfo=E4=BC=A0=E9=80=92=E8=80=8C=E6=9D=A5?= =?UTF-8?q?=E7=9A=84PrimitiveType=E4=BF=A1=E6=81=AF=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E5=9C=A8=E5=88=9B=E5=BB=BAPipeline=E6=97=B6=E4=BC=A0=E9=80=92.?= =?UTF-8?q?=20=E5=87=8F=E5=B0=91=E5=9C=A8=E4=BD=BF=E7=94=A8=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E7=AC=AC=E4=BA=8C=E6=AC=A1=E6=89=8B=E5=86=99=E4=BC=A0?= =?UTF-8?q?=E9=80=92=EF=BC=8C=E9=81=BF=E5=85=8D=E5=A4=B1=E8=AF=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Basic/BillboardTest.cpp | 4 +-- example/Basic/auto_instance.cpp | 2 +- .../Basic/auto_merge_material_instance.cpp | 2 +- example/Basic/draw_triangle_in_NDC.cpp | 4 ++- example/Basic/draw_triangle_use_UBO.cpp | 2 +- example/Basic/rf_test.cpp | 4 ++- example/Gizmo/PlaneGrid3D.cpp | 2 +- example/Gizmo/RayPicking.cpp | 4 +-- inc/hgl/graph/VKMaterial.h | 6 +++- inc/hgl/graph/VKRenderPass.h | 14 +++++----- inc/hgl/shadergen/MaterialCreateInfo.h | 2 ++ src/SceneGraph/Vulkan/VKMaterial.cpp | 4 ++- src/SceneGraph/Vulkan/VKRenderPass.cpp | 28 +++++++++---------- .../Vulkan/VKRenderResourceMaterial.cpp | 2 +- 14 files changed, 46 insertions(+), 34 deletions(-) diff --git a/example/Basic/BillboardTest.cpp b/example/Basic/BillboardTest.cpp index 9df4a2b6..61229765 100644 --- a/example/Basic/BillboardTest.cpp +++ b/example/Basic/BillboardTest.cpp @@ -66,7 +66,7 @@ private: mi_plane_grid=db->CreateMaterialInstance(mtl_plane_grid,&vil_config,&white_color); if(!mi_plane_grid)return(false); - pipeline_plane_grid=CreatePipeline(mi_plane_grid,InlinePipeline::Solid3D,PrimitiveType::Lines); + pipeline_plane_grid=CreatePipeline(mi_plane_grid,InlinePipeline::Solid3D); if(!pipeline_plane_grid)return(false); } @@ -83,7 +83,7 @@ private: mi_billboard=CreateMaterialInstance(mtl::inline_material::Billboard2D,&cfg); if(!mi_billboard)return(false); - pipeline_billboard=CreatePipeline(mi_billboard,InlinePipeline::Solid3D,PrimitiveType::Billboard); + pipeline_billboard=CreatePipeline(mi_billboard,InlinePipeline::Solid3D); if(!pipeline_billboard)return(false); } diff --git a/example/Basic/auto_instance.cpp b/example/Basic/auto_instance.cpp index 0805b98b..87c40c9f 100644 --- a/example/Basic/auto_instance.cpp +++ b/example/Basic/auto_instance.cpp @@ -56,7 +56,7 @@ private: return(false); // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); - pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,PrimitiveType::Triangles); //等同上一行,为Framework重载,默认使用swapchain的render target + pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D); //等同上一行,为Framework重载,默认使用swapchain的render target return pipeline; } diff --git a/example/Basic/auto_merge_material_instance.cpp b/example/Basic/auto_merge_material_instance.cpp index bb131d15..b18cecbc 100644 --- a/example/Basic/auto_merge_material_instance.cpp +++ b/example/Basic/auto_merge_material_instance.cpp @@ -65,7 +65,7 @@ private: } } - pipeline=CreatePipeline(material,InlinePipeline::Solid2D,PrimitiveType::Triangles); + pipeline=CreatePipeline(material,InlinePipeline::Solid2D); return pipeline; } diff --git a/example/Basic/draw_triangle_in_NDC.cpp b/example/Basic/draw_triangle_in_NDC.cpp index 712d4cef..d802bba7 100644 --- a/example/Basic/draw_triangle_in_NDC.cpp +++ b/example/Basic/draw_triangle_in_NDC.cpp @@ -99,7 +99,7 @@ private: bool InitPipeline() { // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); - pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,PrimitiveType::Triangles); //等同上一行,为Framework重载,默认使用swapchain的render target + pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D); //等同上一行,为Framework重载,默认使用swapchain的render target return pipeline; } @@ -140,6 +140,8 @@ public: void Tick(double)override{} + 由于新架构全部要走SceneNode,所以此范例已不可用 + void Render(double delta_time,graph::RenderCmdBuffer *cmd) { cmd->SetClearColor(0,clear_color); diff --git a/example/Basic/draw_triangle_use_UBO.cpp b/example/Basic/draw_triangle_use_UBO.cpp index b897cb68..cb17b519 100644 --- a/example/Basic/draw_triangle_use_UBO.cpp +++ b/example/Basic/draw_triangle_use_UBO.cpp @@ -64,7 +64,7 @@ private: return(false); // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); - pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,PrimitiveType::Triangles); //等同上一行,为Framework重载,默认使用swapchain的render target + pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D); //等同上一行,为Framework重载,默认使用swapchain的render target return pipeline; } diff --git a/example/Basic/rf_test.cpp b/example/Basic/rf_test.cpp index b4b5c8bb..b6ddfa34 100644 --- a/example/Basic/rf_test.cpp +++ b/example/Basic/rf_test.cpp @@ -54,7 +54,7 @@ private: bool InitPipeline() { // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); - pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,PrimitiveType::Triangles); //等同上一行,为Framework重载,默认使用swapchain的render target + pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D); //等同上一行,为Framework重载,默认使用swapchain的render target return pipeline; } @@ -87,6 +87,8 @@ public: return(true); } + 由于新架构全部要走SceneNode,所以此范例已不可用 + void Tick(double)override{} void Render(double delta_time,graph::RenderCmdBuffer *cmd) diff --git a/example/Gizmo/PlaneGrid3D.cpp b/example/Gizmo/PlaneGrid3D.cpp index 5c7a3f81..3e5fdd58 100644 --- a/example/Gizmo/PlaneGrid3D.cpp +++ b/example/Gizmo/PlaneGrid3D.cpp @@ -52,7 +52,7 @@ private: ce=COLOR((int)ce+1); } - pipeline=CreatePipeline(material_instance[0],InlinePipeline::Solid3D,PrimitiveType::Lines); + pipeline=CreatePipeline(material_instance[0],InlinePipeline::Solid3D); return pipeline; } diff --git a/example/Gizmo/RayPicking.cpp b/example/Gizmo/RayPicking.cpp index 74a5e7bc..36309bbc 100644 --- a/example/Gizmo/RayPicking.cpp +++ b/example/Gizmo/RayPicking.cpp @@ -68,7 +68,7 @@ private: mi_plane_grid=db->CreateMaterialInstance(mtl_plane_grid,&vil_config,&white_color); if(!mi_plane_grid)return(false); - pipeline_plane_grid=CreatePipeline(mi_plane_grid,InlinePipeline::Solid3D,PrimitiveType::Lines); + pipeline_plane_grid=CreatePipeline(mi_plane_grid,InlinePipeline::Solid3D); if(!pipeline_plane_grid)return(false); } @@ -81,7 +81,7 @@ private: mi_line=db->CreateMaterialInstance(mtl_line,&vil_config,&yellow_color); if(!mi_line)return(false); - pipeline_line=CreatePipeline(mi_line,InlinePipeline::Solid3D,PrimitiveType::Lines); + pipeline_line=CreatePipeline(mi_line,InlinePipeline::Solid3D); if(!pipeline_line) return(false); diff --git a/inc/hgl/graph/VKMaterial.h b/inc/hgl/graph/VKMaterial.h index 58fb3f48..b78e1ba9 100644 --- a/inc/hgl/graph/VKMaterial.h +++ b/inc/hgl/graph/VKMaterial.h @@ -24,6 +24,8 @@ class Material { AnsiString name; + PrimitiveType prim; ///<图元类型 + VertexInput *vertex_input; ShaderModuleMap *shader_maps; @@ -45,7 +47,7 @@ private: friend class RenderResource; - Material(const AnsiString &); + Material(const AnsiString &,const PrimitiveType &); public: @@ -53,6 +55,8 @@ public: const AnsiString & GetName ()const{return name;} + const PrimitiveType & GetPrimitiveType ()const{return prim;} + const VertexInput * GetVertexInput ()const{return vertex_input;} const ShaderStageCreateInfoList & GetStageList ()const{return shader_stage_list;} diff --git a/inc/hgl/graph/VKRenderPass.h b/inc/hgl/graph/VKRenderPass.h index 35f5236f..9808d5ed 100644 --- a/inc/hgl/graph/VKRenderPass.h +++ b/inc/hgl/graph/VKRenderPass.h @@ -56,15 +56,15 @@ public: public: - Pipeline *CreatePipeline(Material *,const VIL *,const PipelineData *, const PrimitiveType &,const bool prim_restart=false); - Pipeline *CreatePipeline(Material *,const VIL *,const InlinePipeline &, const PrimitiveType &,const bool prim_restart=false); + Pipeline *CreatePipeline(Material *,const VIL *,const PipelineData *, const bool prim_restart=false); + Pipeline *CreatePipeline(Material *,const VIL *,const InlinePipeline &, const bool prim_restart=false); - Pipeline *CreatePipeline(Material *mtl, const PipelineData *, const PrimitiveType &,const bool prim_restart=false); - Pipeline *CreatePipeline(Material *mtl, const InlinePipeline &, const PrimitiveType &,const bool prim_restart=false); + Pipeline *CreatePipeline(Material *mtl, const PipelineData *, const bool prim_restart=false); + Pipeline *CreatePipeline(Material *mtl, const InlinePipeline &, const bool prim_restart=false); - Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &, const PrimitiveType &,const bool prim_restart=false); - Pipeline *CreatePipeline(MaterialInstance *, const PipelineData *, const PrimitiveType &,const bool prim_restart=false); - Pipeline *CreatePipeline(MaterialInstance *, const OSString &, const PrimitiveType &,const bool prim_restart=false); + Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &, const bool prim_restart=false); + Pipeline *CreatePipeline(MaterialInstance *, const PipelineData *, const bool prim_restart=false); + Pipeline *CreatePipeline(MaterialInstance *, const OSString &, const bool prim_restart=false); };//class RenderPass VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_RENDER_PASS_INCLUDE diff --git a/inc/hgl/shadergen/MaterialCreateInfo.h b/inc/hgl/shadergen/MaterialCreateInfo.h index fc888305..75134680 100644 --- a/inc/hgl/shadergen/MaterialCreateInfo.h +++ b/inc/hgl/shadergen/MaterialCreateInfo.h @@ -45,6 +45,8 @@ namespace hgl::graph public: + const PrimitiveType GetPrimitiveType()const{return config->prim;} + const uint32 GetShaderStage ()const{return config->shader_stage_flag_bit;} bool hasShader (const VkShaderStageFlagBits ss)const{return config->shader_stage_flag_bit&ss;} diff --git a/src/SceneGraph/Vulkan/VKMaterial.cpp b/src/SceneGraph/Vulkan/VKMaterial.cpp index 794f1fa6..579eb211 100644 --- a/src/SceneGraph/Vulkan/VKMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKMaterial.cpp @@ -9,9 +9,10 @@ VK_NAMESPACE_BEGIN void ReleaseVertexInput(VertexInput *vi); -Material::Material(const AnsiString &n) +Material::Material(const AnsiString &n,const PrimitiveType &pt) { name=n; + prim=pt; vertex_input=nullptr; shader_maps=new ShaderModuleMap; @@ -22,6 +23,7 @@ Material::Material(const AnsiString &n) mi_data_bytes=0; mi_data_manager=nullptr; + mi_max_count=0; } Material::~Material() diff --git a/src/SceneGraph/Vulkan/VKRenderPass.cpp b/src/SceneGraph/Vulkan/VKRenderPass.cpp index 9d5d3467..6b12d0fe 100644 --- a/src/SceneGraph/Vulkan/VKRenderPass.cpp +++ b/src/SceneGraph/Vulkan/VKRenderPass.cpp @@ -56,11 +56,11 @@ Pipeline *RenderPass::CreatePipeline(const AnsiString &name,PipelineData *pd,con return(new Pipeline(name,device,graphicsPipeline,vil,pd)); } -Pipeline *RenderPass::CreatePipeline(Material *mtl,const VIL *vil,const PipelineData *cpd,const PrimitiveType &prim,const bool prim_restart) +Pipeline *RenderPass::CreatePipeline(Material *mtl,const VIL *vil,const PipelineData *cpd,const bool prim_restart) { PipelineData *pd=new PipelineData(cpd); - pd->SetPrim(prim,prim_restart); + pd->SetPrim(mtl->GetPrimitiveType(),prim_restart); Pipeline *p=CreatePipeline(mtl->GetName(),pd,mtl->GetStageList(),mtl->GetPipelineLayout(),vil); @@ -70,41 +70,41 @@ Pipeline *RenderPass::CreatePipeline(Material *mtl,const VIL *vil,const Pipeline return(p); } -Pipeline *RenderPass::CreatePipeline(Material *mtl,const VIL *vil,const InlinePipeline &ip,const PrimitiveType &prim,const bool prim_restart) +Pipeline *RenderPass::CreatePipeline(Material *mtl,const VIL *vil,const InlinePipeline &ip,const bool prim_restart) { if(!mtl)return(nullptr); - return CreatePipeline(mtl,vil,GetPipelineData(ip),prim,prim_restart); + return CreatePipeline(mtl,vil,GetPipelineData(ip),prim_restart); } -Pipeline *RenderPass::CreatePipeline(Material *mtl,const PipelineData *pd, const PrimitiveType &prim,const bool prim_restart) +Pipeline *RenderPass::CreatePipeline(Material *mtl,const PipelineData *pd,const bool prim_restart) { - return CreatePipeline(mtl,mtl->GetDefaultVIL(),pd,prim,prim_restart); + return CreatePipeline(mtl,mtl->GetDefaultVIL(),pd,prim_restart); } -Pipeline *RenderPass::CreatePipeline(Material *mtl,const InlinePipeline &ip, const PrimitiveType &prim,const bool prim_restart) +Pipeline *RenderPass::CreatePipeline(Material *mtl,const InlinePipeline &ip,const bool prim_restart) { - return CreatePipeline(mtl,mtl->GetDefaultVIL(),ip,prim,prim_restart); + return CreatePipeline(mtl,mtl->GetDefaultVIL(),ip,prim_restart); } -Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip,const PrimitiveType &prim,const bool prim_restart) +Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip,const bool prim_restart) { if(!mi)return(nullptr); - return CreatePipeline(mi->GetMaterial(),mi->GetVIL(),ip,prim,prim_restart); + return CreatePipeline(mi->GetMaterial(),mi->GetVIL(),ip,prim_restart); } -Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const PipelineData *cpd,const PrimitiveType &prim,const bool prim_restart) +Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const PipelineData *cpd,const bool prim_restart) { - return CreatePipeline(mi->GetMaterial(),mi->GetVIL(),cpd,prim,prim_restart); + return CreatePipeline(mi->GetMaterial(),mi->GetVIL(),cpd,prim_restart); } -Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const OSString &pipeline_filename,const PrimitiveType &prim,const bool prim_restart) +Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const OSString &pipeline_filename,const bool prim_restart) { const PipelineData *pd=GetPipelineData(pipeline_filename); if(!pd)return(nullptr); - return CreatePipeline(mi,pd,prim,prim_restart); + return CreatePipeline(mi,pd,prim_restart); } VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp index 0d44df55..9f1ef65a 100644 --- a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp @@ -98,7 +98,7 @@ Material *RenderResource::CreateMaterial(const AnsiString &mtl_name,const mtl::M if(!mci->GetFS()) return(nullptr); - AutoDelete mtl=new Material(mtl_name); + AutoDelete mtl=new Material(mtl_name,mci->GetPrimitiveType()); { const ShaderModule *sm;