From e7ad21c82ec23bcdf561799c9beb8b34b54259da Mon Sep 17 00:00:00 2001 From: hyzboy Date: Tue, 30 Nov 2021 15:01:55 +0800 Subject: [PATCH] used VABConfigInfo at CreateMaterialInstance of TextRenderable --- CMSceneGraph | 2 +- example/2dVector/line.cpp | 2 +- example/Vulkan/Atomsphere.cpp | 2 +- .../Vulkan/DeferredRenderMultiCmdBuffer.cpp | 24 ++++---- example/Vulkan/DrawText.cpp | 18 +++++- example/Vulkan/DrawTile.cpp | 4 +- example/Vulkan/FragCoordTest.cpp | 8 ++- example/Vulkan/Geometry3D.cpp | 8 ++- example/Vulkan/InlineGeometryScene.cpp | 18 +++--- example/Vulkan/OffscreenRender.cpp | 5 +- example/Vulkan/RectanglePrimitive.cpp | 4 +- example/Vulkan/first_triangle.cpp | 4 +- example/Vulkan/indices_rect.cpp | 2 +- example/Vulkan/texture_rect.cpp | 4 +- example/Vulkan/two_triangle.cpp | 4 +- inc/hgl/graph/InlineGeometry.h | 28 ++++----- inc/hgl/graph/VK.h | 4 +- inc/hgl/graph/VKRenderPass.h | 4 +- inc/hgl/graph/VKRenderResource.h | 4 +- inc/hgl/graph/VKShaderResource.h | 2 - res | 2 +- src/SceneGraph/InlineGeometry.cpp | 58 +++++++++---------- src/SceneGraph/RenderableCreater.cpp | 8 ++- src/SceneGraph/VertexAttribData.cpp | 4 +- src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp | 1 - .../Vulkan/VKDeviceRenderPassManage.cpp | 13 +++++ src/SceneGraph/Vulkan/VKMaterialInstance.cpp | 6 -- src/SceneGraph/Vulkan/VKRenderResource.cpp | 8 +-- src/SceneGraph/Vulkan/VKShaderResource.cpp | 4 -- src/SceneGraph/font/TextRenderable.cpp | 4 +- 30 files changed, 142 insertions(+), 117 deletions(-) diff --git a/CMSceneGraph b/CMSceneGraph index 41b0c430..3031a9e4 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit 41b0c430ed3cc09384a59f3d29e6d6405b8a045d +Subproject commit 3031a9e4e4881060352475686cb6b9b6b84e9b24 diff --git a/example/2dVector/line.cpp b/example/2dVector/line.cpp index efa35a77..41655eb4 100644 --- a/example/2dVector/line.cpp +++ b/example/2dVector/line.cpp @@ -101,7 +101,7 @@ private: Renderable *render_obj=db->CreateRenderable(VERTEX_COUNT); if(!render_obj)return(false); - if(!render_obj->Set(VAN::Position, db->CreateVBO(VF_VEC2,VERTEX_COUNT,vertex_data)))return(false); + if(!render_obj->Set(VAN::Position, db->CreateVBO(VF_V2F,VERTEX_COUNT,vertex_data)))return(false); render_instance=db->CreateRenderableInstance(render_obj,material_instance,pipeline); return(true); diff --git a/example/Vulkan/Atomsphere.cpp b/example/Vulkan/Atomsphere.cpp index 2ec723f3..c3727f4b 100644 --- a/example/Vulkan/Atomsphere.cpp +++ b/example/Vulkan/Atomsphere.cpp @@ -81,7 +81,7 @@ private: bool InitScene() { - ro_sphere=CreateRenderableSphere(db,material_instance->GetMaterial(),128); + ro_sphere=CreateRenderableSphere(db,material_instance->GetVAB(),128); render_root.CreateSubNode(scale(100),db->CreateRenderableInstance(ro_sphere,material_instance,pipeline_solid)); diff --git a/example/Vulkan/DeferredRenderMultiCmdBuffer.cpp b/example/Vulkan/DeferredRenderMultiCmdBuffer.cpp index 7c8c3d91..e2df5329 100644 --- a/example/Vulkan/DeferredRenderMultiCmdBuffer.cpp +++ b/example/Vulkan/DeferredRenderMultiCmdBuffer.cpp @@ -171,18 +171,18 @@ private: bool InitGBufferPipeline(SubpassParam *sp) { - sp->pipeline_triangles =gbuffer.rp->CreatePipeline(sp->material,InlinePipeline::Solid3D,Prim::Triangles); + sp->pipeline_triangles =gbuffer.rp->CreatePipeline(sp->material_instance,InlinePipeline::Solid3D,Prim::Triangles); if(!sp->pipeline_triangles) return(false); - sp->pipeline_fan =gbuffer.rp->CreatePipeline(sp->material,InlinePipeline::Solid3D,Prim::Fan); + sp->pipeline_fan =gbuffer.rp->CreatePipeline(sp->material_instance,InlinePipeline::Solid3D,Prim::Fan); return sp->pipeline_fan; } bool InitCompositionPipeline(SubpassParam *sp) { - sp->pipeline_fan=device_render_pass->CreatePipeline(sp->material,InlinePipeline::Solid2D,Prim::Fan); + sp->pipeline_fan=device_render_pass->CreatePipeline(sp->material_instance,InlinePipeline::Solid2D,Prim::Fan); return sp->pipeline_fan; } @@ -287,20 +287,20 @@ private: return(true); } - void CreateRenderObject(Material *mtl) + void CreateRenderObject(const VAB *vab) { { struct PlaneCreateInfo pci; - ro_plane=CreateRenderablePlane(db,mtl,&pci); + ro_plane=CreateRenderablePlane(db,vab,&pci); } { struct CubeCreateInfo cci; - ro_cube=CreateRenderableCube(db,mtl,&cci); + ro_cube=CreateRenderableCube(db,vab,&cci); } { - ro_sphere=CreateRenderableSphere(db,mtl,64); + ro_sphere=CreateRenderableSphere(db,vab,64); } { @@ -315,7 +315,7 @@ private: tci.uv_scale.x=4; tci.uv_scale.y=1; - ro_torus=CreateRenderableTorus(db,mtl,&tci); + ro_torus=CreateRenderableTorus(db,vab,&tci); } { @@ -325,7 +325,7 @@ private: cci.radius=10; cci.numberSlices=32; - ro_cylinder=CreateRenderableCylinder(db,mtl,&cci); + ro_cylinder=CreateRenderableCylinder(db,vab,&cci); } { @@ -336,13 +336,13 @@ private: cci.numberSlices=128; cci.numberStacks=32; - ro_cone=CreateRenderableCone(db,mtl,&cci); + ro_cone=CreateRenderableCone(db,vab,&cci); } } bool InitCompositionRenderable() { - ro_gbc_plane=CreateRenderableGBufferComposition(db,sp_composition.material); + ro_gbc_plane=CreateRenderableGBufferComposition(db,sp_composition.material_instance->GetVAB()); if(!ro_gbc_plane)return(false); ro_gbc_plane_ri=db->CreateRenderableInstance(ro_gbc_plane,sp_composition.material_instance,sp_composition.pipeline_fan); @@ -353,7 +353,7 @@ private: bool InitScene(SubpassParam *sp) { - CreateRenderObject(sp->material); + CreateRenderObject(sp->material_instance->GetVAB()); render_root.CreateSubNode( scale(100,100,1), db->CreateRenderableInstance(ro_plane ,sp->material_instance,sp->pipeline_fan )); render_root.CreateSubNode( db->CreateRenderableInstance(ro_torus ,sp->material_instance,sp->pipeline_triangles)); render_root.CreateSubNode( scale(20,20,20), db->CreateRenderableInstance(ro_sphere ,sp->material_instance,sp->pipeline_triangles)); diff --git a/example/Vulkan/DrawText.cpp b/example/Vulkan/DrawText.cpp index c4a64cf1..bb57f61c 100644 --- a/example/Vulkan/DrawText.cpp +++ b/example/Vulkan/DrawText.cpp @@ -27,6 +27,7 @@ class TestApp:public VulkanApplicationFramework private: Sampler * sampler =nullptr; + Material * material =nullptr; MaterialInstance * material_instance =nullptr; GPUBuffer * ubo_camera_info =nullptr; GPUBuffer * ubo_color =nullptr; @@ -56,8 +57,21 @@ private: bool InitMaterial() { - material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/LumTextureRect2D")); - if(!material_instance)return(false); + material=db->CreateMaterial(OS_TEXT("res/material/LumTextureRect2D")); + + //文本渲染Position坐标全部是使用整数,这里强制要求Position输入流使用RGBA16I格式 + { + VABConfigInfo vab_config; + VAConfig va_cfg; + + va_cfg.format=VF_V4I16; + va_cfg.instance=false; + + vab_config.Add("Position",va_cfg); + + material_instance=db->CreateMaterialInstance(material,&vab_config); + if(!material_instance)return(false); + } pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::SolidRectangles); if(!pipeline)return(false); diff --git a/example/Vulkan/DrawTile.cpp b/example/Vulkan/DrawTile.cpp index e4f07936..fc82a245 100644 --- a/example/Vulkan/DrawTile.cpp +++ b/example/Vulkan/DrawTile.cpp @@ -215,8 +215,8 @@ private: render_obj=db->CreateRenderable(tile_count); if(!render_obj)return(false); - render_obj->Set(VAN::Position,db->CreateVBO(VF_VEC4,tile_count,vertex_data)); - render_obj->Set(VAN::TexCoord,db->CreateVBO(VF_VEC4,tile_count,tex_coord_data)); + render_obj->Set(VAN::Position,db->CreateVBO(VF_V4F,tile_count,vertex_data)); + render_obj->Set(VAN::TexCoord,db->CreateVBO(VF_V4F,tile_count,tex_coord_data)); render_instance=db->CreateRenderableInstance(render_obj,material_instance,pipeline); diff --git a/example/Vulkan/FragCoordTest.cpp b/example/Vulkan/FragCoordTest.cpp index 9a497218..bace6033 100644 --- a/example/Vulkan/FragCoordTest.cpp +++ b/example/Vulkan/FragCoordTest.cpp @@ -7,8 +7,8 @@ using namespace hgl; using namespace hgl::graph; -constexpr uint32_t SCREEN_WIDTH=128; -constexpr uint32_t SCREEN_HEIGHT=128; +constexpr uint32_t SCREEN_WIDTH=256; +constexpr uint32_t SCREEN_HEIGHT=256; constexpr uint32_t VERTEX_COUNT=4; @@ -78,7 +78,7 @@ private: auto render_obj=db->CreateRenderable(VERTEX_COUNT); if(!render_obj)return(false); - if(!render_obj->Set(VAN::Position,db->CreateVBO(VF_VEC2,VERTEX_COUNT,vertex_data)))return(false); + if(!render_obj->Set(VAN::Position,db->CreateVBO(VF_V2F,VERTEX_COUNT,vertex_data)))return(false); renderable_instance=db->CreateRenderableInstance(render_obj,material_instance,pipeline); return(true); @@ -107,6 +107,8 @@ public: void Resize(int w,int h)override { + cam.width=w; + cam.height=h; cam.vp_width=w; cam.vp_height=h; diff --git a/example/Vulkan/Geometry3D.cpp b/example/Vulkan/Geometry3D.cpp index 0cf81af9..ce00fa32 100644 --- a/example/Vulkan/Geometry3D.cpp +++ b/example/Vulkan/Geometry3D.cpp @@ -85,16 +85,18 @@ private: pgci.color.Set(0.5,0,0,1); pgci.side_color.Set(1,0,0,1); - ro_plane_grid[0]=CreateRenderablePlaneGrid(db,material,&pgci); + const VAB *vab=material_instance->GetVAB(); + + ro_plane_grid[0]=CreateRenderablePlaneGrid(db,vab,&pgci); pgci.color.Set(0,0.5,0,1); pgci.side_color.Set(0,1,0,1); - ro_plane_grid[1]=CreateRenderablePlaneGrid(db,material,&pgci); + ro_plane_grid[1]=CreateRenderablePlaneGrid(db,vab,&pgci); pgci.color.Set(0,0,0.5,1); pgci.side_color.Set(0,0,1,1); - ro_plane_grid[2]=CreateRenderablePlaneGrid(db,material,&pgci); + ro_plane_grid[2]=CreateRenderablePlaneGrid(db,vab,&pgci); camera->pos=Vector4f(200,200,200,1.0); } diff --git a/example/Vulkan/InlineGeometryScene.cpp b/example/Vulkan/InlineGeometryScene.cpp index b956bb95..10a38a5d 100644 --- a/example/Vulkan/InlineGeometryScene.cpp +++ b/example/Vulkan/InlineGeometryScene.cpp @@ -85,7 +85,7 @@ private: axis_mi=db->CreateMaterialInstance(axis_material); if(!axis_mi)return(false); - axis_pipeline=CreatePipeline(axis_material,InlinePipeline::Solid3D,Prim::Lines); + axis_pipeline=CreatePipeline(axis_mi,InlinePipeline::Solid3D,Prim::Lines); if(!axis_pipeline)return(false); } @@ -143,7 +143,7 @@ private: pipeline_data=GetPipelineData(InlinePipeline::Solid3D); if(!pipeline_data)return(false); - pipeline_solid=CreatePipeline(material,pipeline_data,Prim::Triangles); + pipeline_solid=CreatePipeline(material_instance,pipeline_data,Prim::Triangles); if(!pipeline_solid)return(false); return(true); @@ -156,18 +156,20 @@ private: aci.size=200; - ro_axis=CreateRenderableAxis(db,axis_material,&aci); + ro_axis=CreateRenderableAxis(db,axis_mi->GetVAB(),&aci); } + + const VAB *vab=material_instance->GetVAB(); { struct CubeCreateInfo cci; cci.has_color=true; cci.color=Vector4f(1,1,1,1); - ro_cube=CreateRenderableCube(db,material,&cci); + ro_cube=CreateRenderableCube(db,vab,&cci); } { - ro_sphere=CreateRenderableSphere(db,material,64); + ro_sphere=CreateRenderableSphere(db,vab,64); } { @@ -182,7 +184,7 @@ private: tci.uv_scale.x=4; tci.uv_scale.y=1; - ro_torus=CreateRenderableTorus(db,material,&tci); + ro_torus=CreateRenderableTorus(db,vab,&tci); } { @@ -192,7 +194,7 @@ private: cci.radius=10; cci.numberSlices=32; - ro_cylinder=CreateRenderableCylinder(db,material,&cci); + ro_cylinder=CreateRenderableCylinder(db,vab,&cci); } { @@ -203,7 +205,7 @@ private: cci.numberSlices=128; cci.numberStacks=32; - ro_cone=CreateRenderableCone(db,material,&cci); + ro_cone=CreateRenderableCone(db,vab,&cci); } } diff --git a/example/Vulkan/OffscreenRender.cpp b/example/Vulkan/OffscreenRender.cpp index 7fedae0c..6ec433bc 100644 --- a/example/Vulkan/OffscreenRender.cpp +++ b/example/Vulkan/OffscreenRender.cpp @@ -56,6 +56,7 @@ public: ~TestApp() { SAFE_CLEAR(cube.render_list); + SAFE_CLEAR(os.pipeline); SAFE_CLEAR(os.render_taget); } @@ -114,7 +115,7 @@ public: cci.center_color=Vector4f(1,1,1,1); cci.border_color=Vector4f(1,1,1,0); - Renderable *render_obj=CreateRenderableCircle(db,os.material_instance->GetMaterial(),&cci); + Renderable *render_obj=CreateRenderableCircle(db,os.material_instance->GetVAB(),&cci); if(!render_obj)return(false); os.renderable_instance=db->CreateRenderableInstance(render_obj,os.material_instance,os.pipeline); @@ -156,7 +157,7 @@ public: { CubeCreateInfo cci; - Renderable *render_obj=CreateRenderableCube(db,cube.material_instance->GetMaterial(),&cci); + Renderable *render_obj=CreateRenderableCube(db,cube.material_instance->GetVAB(),&cci); if(!render_obj)return(false); cube.renderable_instance=db->CreateRenderableInstance(render_obj,cube.material_instance,cube.pipeline); diff --git a/example/Vulkan/RectanglePrimitive.cpp b/example/Vulkan/RectanglePrimitive.cpp index 245b79e3..1f66cb5f 100644 --- a/example/Vulkan/RectanglePrimitive.cpp +++ b/example/Vulkan/RectanglePrimitive.cpp @@ -109,8 +109,8 @@ private: if(!render_obj)return(false); - render_obj->Set(VAN::Position,db->CreateVBO(VF_VEC4,VERTEX_COUNT,vertex_data)); - render_obj->Set(VAN::TexCoord,db->CreateVBO(VF_VEC4,VERTEX_COUNT,tex_coord_data)); + render_obj->Set(VAN::Position,db->CreateVBO(VF_V4F,VERTEX_COUNT,vertex_data)); + render_obj->Set(VAN::TexCoord,db->CreateVBO(VF_V4F,VERTEX_COUNT,tex_coord_data)); render_instance=db->CreateRenderableInstance(render_obj,material_instance,pipeline); diff --git a/example/Vulkan/first_triangle.cpp b/example/Vulkan/first_triangle.cpp index 935b24b6..963b20f5 100644 --- a/example/Vulkan/first_triangle.cpp +++ b/example/Vulkan/first_triangle.cpp @@ -87,8 +87,8 @@ private: Renderable *render_obj=db->CreateRenderable(VERTEX_COUNT); if(!render_obj)return(false); - if(!render_obj->Set(VAN::Position, db->CreateVBO(VF_VEC2,VERTEX_COUNT,vertex_data)))return(false); - if(!render_obj->Set(VAN::Color, db->CreateVBO(VF_VEC4,VERTEX_COUNT,color_data)))return(false); + if(!render_obj->Set(VAN::Position, db->CreateVBO(VF_V2F,VERTEX_COUNT,vertex_data)))return(false); + if(!render_obj->Set(VAN::Color, db->CreateVBO(VF_V4F,VERTEX_COUNT,color_data)))return(false); render_instance=db->CreateRenderableInstance(render_obj,material_instance,pipeline); return(true); diff --git a/example/Vulkan/indices_rect.cpp b/example/Vulkan/indices_rect.cpp index ed0e94ef..eb255882 100644 --- a/example/Vulkan/indices_rect.cpp +++ b/example/Vulkan/indices_rect.cpp @@ -87,7 +87,7 @@ private: auto render_obj=db->CreateRenderable(VERTEX_COUNT); if(!render_obj)return(false); - if(!render_obj->Set(VAN::Position,db->CreateVBO(VF_VEC2,VERTEX_COUNT,vertex_data)))return(false); + if(!render_obj->Set(VAN::Position,db->CreateVBO(VF_V2F,VERTEX_COUNT,vertex_data)))return(false); if(!render_obj->Set(db->CreateIBO16(INDEX_COUNT,index_data)))return(false); renderable_instance=db->CreateRenderableInstance(render_obj,material_instance,pipeline); diff --git a/example/Vulkan/texture_rect.cpp b/example/Vulkan/texture_rect.cpp index 85b1f61f..7e4d8b0a 100644 --- a/example/Vulkan/texture_rect.cpp +++ b/example/Vulkan/texture_rect.cpp @@ -121,8 +121,8 @@ private: auto render_obj=db->CreateRenderable(VERTEX_COUNT); if(!render_obj)return(false); - if(!render_obj->Set(VAN::Position,db->CreateVBO(VF_VEC2,VERTEX_COUNT,vertex_data)))return(false); - if(!render_obj->Set(VAN::TexCoord,db->CreateVBO(VF_VEC2,VERTEX_COUNT,tex_coord_data)))return(false); + if(!render_obj->Set(VAN::Position,db->CreateVBO(VF_V2F,VERTEX_COUNT,vertex_data)))return(false); + if(!render_obj->Set(VAN::TexCoord,db->CreateVBO(VF_V2F,VERTEX_COUNT,tex_coord_data)))return(false); if(!render_obj->Set(db->CreateIBO16(INDEX_COUNT,index_data)))return(false); renderable_instance=db->CreateRenderableInstance(render_obj,material_instance,pipeline); diff --git a/example/Vulkan/two_triangle.cpp b/example/Vulkan/two_triangle.cpp index 1a680f5f..67e5b55f 100644 --- a/example/Vulkan/two_triangle.cpp +++ b/example/Vulkan/two_triangle.cpp @@ -87,8 +87,8 @@ private: Renderable *render_obj=db->CreateRenderable(VERTEX_COUNT); if(!render_obj)return(false); - if(!render_obj->Set(VAN::Position, db->CreateVBO(VF_VEC2,VERTEX_COUNT,vertex_data)))return(false); - if(!render_obj->Set(VAN::Color, db->CreateVBO(VF_VEC4,VERTEX_COUNT,color_data)))return(false); + if(!render_obj->Set(VAN::Position, db->CreateVBO(VF_V2F,VERTEX_COUNT,vertex_data)))return(false); + if(!render_obj->Set(VAN::Color, db->CreateVBO(VF_V4F,VERTEX_COUNT,color_data)))return(false); render_instance=db->CreateRenderableInstance(render_obj,material_instance,pipeline); diff --git a/inc/hgl/graph/InlineGeometry.h b/inc/hgl/graph/InlineGeometry.h index 89eb7127..5a8cedb4 100644 --- a/inc/hgl/graph/InlineGeometry.h +++ b/inc/hgl/graph/InlineGeometry.h @@ -18,12 +18,12 @@ namespace hgl RectScope2f scope; };//struct RectangleCreateInfo - Renderable *CreateRenderableRectangle(RenderResource *db,Material *mtl,const RectangleCreateInfo *rci); + Renderable *CreateRenderableRectangle(RenderResource *db,const VAB *vab,const RectangleCreateInfo *rci); /** * 创建延迟渲染用全屏平面 */ - Renderable *CreateRenderableGBufferComposition(RenderResource *db,Material *mtl); + Renderable *CreateRenderableGBufferComposition(RenderResource *db,const VAB *vab); /** * 圆角矩形创建信息(扇形/线圈) @@ -34,7 +34,7 @@ namespace hgl uint32_t round_per; ///<圆角精度 };//struct RoundRectangleCreateInfo:public RectangleCreateInfo - Renderable *CreateRenderableRoundRectangle(RenderResource *db,Material *mtl,const RoundRectangleCreateInfo *rci); + Renderable *CreateRenderableRoundRectangle(RenderResource *db,const VAB *vab,const RoundRectangleCreateInfo *rci); /** * 圆形创建信息 @@ -54,7 +54,7 @@ namespace hgl /** * 创建一个2D圆形(扇形/线圈) */ - Renderable *CreateRenderableCircle(RenderResource *db,Material *mtl,const CircleCreateInfo *cci); + Renderable *CreateRenderableCircle(RenderResource *db,const VAB *vab,const CircleCreateInfo *cci); /** * 平面网格创建信息 @@ -73,7 +73,7 @@ namespace hgl /** * 创建一个平面网格(线条) */ - Renderable *CreateRenderablePlaneGrid(RenderResource *db,Material *mtl,const PlaneGridCreateInfo *pgci); + Renderable *CreateRenderablePlaneGrid(RenderResource *db,const VAB *vab,const PlaneGridCreateInfo *pgci); struct PlaneCreateInfo { @@ -91,7 +91,7 @@ namespace hgl /** * 创建一个平面(三角形) */ - Renderable *CreateRenderablePlane(RenderResource *db,Material *mtl,const PlaneCreateInfo *pci); + Renderable *CreateRenderablePlane(RenderResource *db,const VAB *vab,const PlaneCreateInfo *pci); struct CubeCreateInfo { @@ -131,17 +131,17 @@ namespace hgl /** * 创建一个立方体(三角形) */ - Renderable *CreateRenderableCube(RenderResource *db,Material *mtl,const CubeCreateInfo *cci); + Renderable *CreateRenderableCube(RenderResource *db,const VAB *vab,const CubeCreateInfo *cci); /** * 创建一个绑定盒(线条) */ - Renderable *CreateRenderableBoundingBox(RenderResource *db,Material *mtl,const CubeCreateInfo *cci); + Renderable *CreateRenderableBoundingBox(RenderResource *db,const VAB *vab,const CubeCreateInfo *cci); /** * 创建一个球心坐标为0,0,0,半径为1的球体(三角形) */ - Renderable *CreateRenderableSphere(RenderResource *db,Material *mtl,const uint numberSlices); + Renderable *CreateRenderableSphere(RenderResource *db,const VAB *vab,const uint numberSlices); struct DomeCreateInfo { @@ -152,7 +152,7 @@ namespace hgl /** * 创建一个穹顶(三角形) */ - Renderable *CreateRenderableDome(RenderResource *db,Material *mtl, const DomeCreateInfo *); + Renderable *CreateRenderableDome(RenderResource *db,const VAB *vab, const DomeCreateInfo *); struct TorusCreateInfo { @@ -168,7 +168,7 @@ namespace hgl /** * 创建一个圆环(三角形) */ - Renderable *CreateRenderableTorus(RenderResource *db,Material *mtl,const TorusCreateInfo *tci); + Renderable *CreateRenderableTorus(RenderResource *db,const VAB *vab,const TorusCreateInfo *tci); struct CylinderCreateInfo { @@ -180,7 +180,7 @@ namespace hgl /** * 创建一个圆柱(三角形) */ - Renderable *CreateRenderableCylinder(RenderResource *db,Material *mtl,const CylinderCreateInfo *cci); + Renderable *CreateRenderableCylinder(RenderResource *db,const VAB *vab,const CylinderCreateInfo *cci); struct ConeCreateInfo { @@ -193,7 +193,7 @@ namespace hgl /** * 创建一个圆锥(三角形) */ - Renderable *CreateRenderableCone(RenderResource *db,Material *mtl,const ConeCreateInfo *cci); + Renderable *CreateRenderableCone(RenderResource *db,const VAB *vab,const ConeCreateInfo *cci); struct AxisCreateInfo { @@ -214,7 +214,7 @@ namespace hgl /** * 创建一个坐标线(线条) */ - Renderable *CreateRenderableAxis(RenderResource *db,Material *mtl,const AxisCreateInfo *aci); + Renderable *CreateRenderableAxis(RenderResource *db,const VAB *vab,const AxisCreateInfo *aci); }//namespace graph };//namespace hgl #endif//HGL_GRAPH_INLINE_GEOMETRY_INCLUDE diff --git a/inc/hgl/graph/VK.h b/inc/hgl/graph/VK.h index dd4df8d1..f2149b74 100644 --- a/inc/hgl/graph/VK.h +++ b/inc/hgl/graph/VK.h @@ -117,8 +117,8 @@ class Pipeline; struct VAConfig { - VkFormat format; - bool instance; + VkFormat format=PF_UNDEFINED; + bool instance=false; public: diff --git a/inc/hgl/graph/VKRenderPass.h b/inc/hgl/graph/VKRenderPass.h index ce4f09da..7a15c894 100644 --- a/inc/hgl/graph/VKRenderPass.h +++ b/inc/hgl/graph/VKRenderPass.h @@ -52,8 +52,8 @@ public: public: - Pipeline *CreatePipeline(MaterialInstance *, PipelineData *); - Pipeline *CreatePipeline(MaterialInstance *,const InlinePipeline &); + Pipeline *CreatePipeline(MaterialInstance *, PipelineData *); + Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &); public: diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index 69ad166d..79544a0b 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -90,8 +90,8 @@ public: //Material const ShaderModule *CreateShaderModule(const OSString &filename,ShaderResource *shader_resource); Material * CreateMaterial(const OSString &); - MaterialInstance * CreateMaterialInstance(Material *); - MaterialInstance * CreateMaterialInstance(const OSString &); + MaterialInstance * CreateMaterialInstance(Material *,const VABConfigInfo *vab_cfg=nullptr); + MaterialInstance * CreateMaterialInstance(const OSString &,const VABConfigInfo *vab_cfg=nullptr); Renderable * CreateRenderable(const uint32_t vertex_count=0); TextRenderable * CreateTextRenderable(Material *); diff --git a/inc/hgl/graph/VKShaderResource.h b/inc/hgl/graph/VKShaderResource.h index a4f807b0..8fc13342 100644 --- a/inc/hgl/graph/VKShaderResource.h +++ b/inc/hgl/graph/VKShaderResource.h @@ -15,8 +15,6 @@ struct ShaderStage VertexAttribType type; ///<成份数量(如vec4中的4) - uint binding; - bool global; ///<是否全局数据 bool dynamic; ///<是否动态数量 };//struct ShaderStage diff --git a/res b/res index 10431c5b..cff431d2 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit 10431c5bb52464f73911c503e236baa3d0663037 +Subproject commit cff431d24a2e511112e26b6d75b74286cf697dfd diff --git a/src/SceneGraph/InlineGeometry.cpp b/src/SceneGraph/InlineGeometry.cpp index 96e3cb32..b6cb029c 100644 --- a/src/SceneGraph/InlineGeometry.cpp +++ b/src/SceneGraph/InlineGeometry.cpp @@ -12,9 +12,9 @@ namespace hgl { namespace graph { - Renderable *CreateRenderableRectangle(RenderResource *db,Material *mtl,const RectangleCreateInfo *rci) + Renderable *CreateRenderableRectangle(RenderResource *db,const VAB *vab,const RectangleCreateInfo *rci) { - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); if(!rc.Init(4)) return(nullptr); @@ -29,18 +29,18 @@ namespace hgl return rc.Finish(); } - Renderable *CreateRenderableGBufferComposition(RenderResource *db,Material *mtl) + Renderable *CreateRenderableGBufferComposition(RenderResource *db,const VAB *vab) { RectangleCreateInfo rci; rci.scope.Set(-1,-1,2,2); - return CreateRenderableRectangle(db,mtl,&rci); + return CreateRenderableRectangle(db,vab,&rci); } - Renderable *CreateRenderableRoundRectangle(RenderResource *db,Material *mtl,const RoundRectangleCreateInfo *rci) + Renderable *CreateRenderableRoundRectangle(RenderResource *db,const VAB *vab,const RoundRectangleCreateInfo *rci) { - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); if(rci->radius==0||rci->round_per<=1) //这是要画矩形 { @@ -112,9 +112,9 @@ namespace hgl return rc.Finish(); } - Renderable *CreateRenderableCircle(RenderResource *db,Material *mtl,const CircleCreateInfo *cci) + Renderable *CreateRenderableCircle(RenderResource *db,const VAB *vab,const CircleCreateInfo *cci) { - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); uint edge; @@ -160,9 +160,9 @@ namespace hgl return rc.Finish(); } - Renderable *CreateRenderablePlaneGrid(RenderResource *db,Material *mtl,const PlaneGridCreateInfo *pgci) + Renderable *CreateRenderablePlaneGrid(RenderResource *db,const VAB *vab,const PlaneGridCreateInfo *pgci) { - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); if(!rc.Init(((pgci->step.x+1)+(pgci->step.y+1))*2)) return(nullptr); @@ -207,14 +207,14 @@ namespace hgl return rc.Finish(); } - Renderable *CreateRenderablePlane(RenderResource *db,Material *mtl,const PlaneCreateInfo *pci) + Renderable *CreateRenderablePlane(RenderResource *db,const VAB *vab,const PlaneCreateInfo *pci) { const float xy_vertices [] = { -0.5f,-0.5f,0.0f, +0.5f,-0.5f,0.0f, +0.5f,+0.5f,0.0f, -0.5f,+0.5f,0.0f }; float xy_tex_coord[] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; const Vector3f xy_normal(0.0f,0.0f,1.0f); const Vector3f xy_tangent(1.0f,0.0f,0.0f); - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); if(!rc.Init(4)) return(nullptr); @@ -248,7 +248,7 @@ namespace hgl return rc.Finish(); } - Renderable *CreateRenderableCube(RenderResource *db,Material *mtl,const CubeCreateInfo *cci) + Renderable *CreateRenderableCube(RenderResource *db,const VAB *vab,const CubeCreateInfo *cci) { // Points of a cube. /* 4 5 */ constexpr float points[]={ -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, +0.5f, +0.5f, -0.5f, +0.5f, +0.5f, -0.5f, -0.5f, -0.5f, +0.5f, -0.5f, -0.5f, +0.5f, +0.5f, /* *------------* */ +0.5f, +0.5f, +0.5f, +0.5f, +0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, +0.5f, -0.5f, +0.5f, +0.5f, -0.5f, +0.5f, -0.5f, -0.5f, @@ -271,7 +271,7 @@ namespace hgl 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }; - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); if(!rc.Init(24)) return(nullptr); @@ -426,9 +426,9 @@ namespace hgl * @param numberSlices 切片数 * @return 可渲染数据 */ - Renderable *CreateRenderableSphere(RenderResource *db,Material *mtl,const uint numberSlices) + Renderable *CreateRenderableSphere(RenderResource *db,const VAB *vab,const uint numberSlices) { - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); uint numberParallels = (numberSlices+1) / 2; uint numberVertices = (numberParallels + 1) * (numberSlices + 1); @@ -502,9 +502,9 @@ namespace hgl return rc.Finish(); } - Renderable *CreateRenderableDome(RenderResource *db,Material *mtl,const DomeCreateInfo *dci) + Renderable *CreateRenderableDome(RenderResource *db,const VAB *vab,const DomeCreateInfo *dci) { - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); uint i, j; @@ -621,9 +621,9 @@ namespace hgl } }//namespace - Renderable *CreateRenderableTorus(RenderResource *db,Material *mtl,const TorusCreateInfo *tci) + Renderable *CreateRenderableTorus(RenderResource *db,const VAB *vab,const TorusCreateInfo *tci) { - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); // s, t = parametric values of the equations, in the range [0,1] float s = 0; @@ -777,14 +777,14 @@ namespace hgl } }//namespace - Renderable *CreateRenderableCylinder(RenderResource *db,Material *mtl,const CylinderCreateInfo *cci) + Renderable *CreateRenderableCylinder(RenderResource *db,const VAB *vab,const CylinderCreateInfo *cci) { uint numberIndices = cci->numberSlices * 3 * 2 + cci->numberSlices * 6; if(numberIndices<=0) return(nullptr); - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); uint numberVertices = (cci->numberSlices + 2) * 2 + (cci->numberSlices + 1) * 2; @@ -996,9 +996,9 @@ namespace hgl } }//namespace - Renderable *CreateRenderableCone(RenderResource *db,Material *mtl,const ConeCreateInfo *cci) + Renderable *CreateRenderableCone(RenderResource *db,const VAB *vab,const ConeCreateInfo *cci) { - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); uint i, j; @@ -1123,11 +1123,11 @@ namespace hgl return rc.Finish(); } - Renderable *CreateRenderableAxis(RenderResource *db,Material *mtl,const AxisCreateInfo *aci) + Renderable *CreateRenderableAxis(RenderResource *db,const VAB *vab,const AxisCreateInfo *aci) { - if(!db||!mtl||!aci)return(nullptr); + if(!db||!vab||!aci)return(nullptr); - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); if(!rc.Init(6)) return(nullptr); @@ -1150,7 +1150,7 @@ namespace hgl return rc.Finish(); } - Renderable *CreateRenderableBoundingBox(RenderResource *db,Material *mtl,const CubeCreateInfo *cci) + Renderable *CreateRenderableBoundingBox(RenderResource *db,const VAB *vab,const CubeCreateInfo *cci) { // Points of a cube. /* 4 5 */ const float points[]={ -0.5,-0.5, 0.5, 0.5,-0.5,0.5, 0.5,-0.5,-0.5, -0.5,-0.5,-0.5, @@ -1172,7 +1172,7 @@ namespace hgl 0,4, 1,5, 2,6, 3,7 }; - RenderableCreater rc(db,mtl); + RenderableCreater rc(db,vab); if(!rc.Init(8)) return(nullptr); diff --git a/src/SceneGraph/RenderableCreater.cpp b/src/SceneGraph/RenderableCreater.cpp index 7cb33004..36ac8ebc 100644 --- a/src/SceneGraph/RenderableCreater.cpp +++ b/src/SceneGraph/RenderableCreater.cpp @@ -38,9 +38,14 @@ namespace hgl if(ssb_map.Get(name,ssb)) return ssb->data; + VAD *vad=hgl::graph::CreateVertexAttribData(vertices_number,va->format,va->vec_size,va->stride); + + if(!vad) + return(nullptr); + ssb=new ShaderStageBind; - ssb->data =hgl::graph::CreateVertexAttribData(vertices_number,va->format,va->vec_size,va->stride); + ssb->data =vad; ssb->name =name; ssb->binding=va->binding; @@ -49,7 +54,6 @@ namespace hgl ssb_map.Add(name,ssb); return ssb->data; - } bool RenderableCreater::WriteVAD(const AnsiString &name,const void *data,const uint32_t bytes) diff --git a/src/SceneGraph/VertexAttribData.cpp b/src/SceneGraph/VertexAttribData.cpp index 1cc2c4b2..b8c0122c 100644 --- a/src/SceneGraph/VertexAttribData.cpp +++ b/src/SceneGraph/VertexAttribData.cpp @@ -6,10 +6,10 @@ namespace hgl { VAD *CreateVertexAttribData(const uint32_t vertex_count,const VkFormat fmt,const int vec_size,const uint stride) { - if(!vertex_count<=0 + if(vertex_count<=0 ||vec_size<1||vec_size>4 ||stride<1||stride>8*4 - ||CheckVulkanFormat(fmt)) + ||!CheckVulkanFormat(fmt)) return(nullptr); return(new VertexAttribData(vertex_count,vec_size,stride,fmt)); diff --git a/src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp b/src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp index f8d5e0e2..7df6b7e1 100644 --- a/src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp @@ -15,7 +15,6 @@ void GPUDevice::InitRenderPassManage() void GPUDevice::ClearRenderPassManage() { - SAFE_CLEAR(device_render_pass); SAFE_CLEAR(render_pass_manage); } diff --git a/src/SceneGraph/Vulkan/VKDeviceRenderPassManage.cpp b/src/SceneGraph/Vulkan/VKDeviceRenderPassManage.cpp index 9bacbc6a..afbc839d 100644 --- a/src/SceneGraph/Vulkan/VKDeviceRenderPassManage.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceRenderPassManage.cpp @@ -195,6 +195,19 @@ DeviceRenderPassManage::DeviceRenderPassManage(VkDevice dev,VkPipelineCache pc) DeviceRenderPassManage::~DeviceRenderPassManage() { SAFE_CLEAR(hash); + + const int count=RenderPassList.GetCount(); + + auto *obj=RenderPassList.GetDataList(); + + for(int i=0;iright; + + ++obj; + } + + RenderPassList.Clear(); } namespace diff --git a/src/SceneGraph/Vulkan/VKMaterialInstance.cpp b/src/SceneGraph/Vulkan/VKMaterialInstance.cpp index 7bf1c8d5..9cee676b 100644 --- a/src/SceneGraph/Vulkan/VKMaterialInstance.cpp +++ b/src/SceneGraph/Vulkan/VKMaterialInstance.cpp @@ -17,12 +17,6 @@ MaterialInstance *GPUDevice::CreateMI(Material *mtl,const VABConfigInfo *vab_cfg MaterialParameters *mp=CreateMP(mtl,DescriptorSetsType::Value); - if(!mp) - { - delete vab; - return nullptr; - } - return(new MaterialInstance(mtl,vab,mp)); } diff --git a/src/SceneGraph/Vulkan/VKRenderResource.cpp b/src/SceneGraph/Vulkan/VKRenderResource.cpp index a96924f5..37913a83 100644 --- a/src/SceneGraph/Vulkan/VKRenderResource.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResource.cpp @@ -50,11 +50,11 @@ IndexBuffer *RenderResource::CreateIBO(IndexType index_type,uint32_t count,const return(buf); } -MaterialInstance *RenderResource::CreateMaterialInstance(Material *mtl) +MaterialInstance *RenderResource::CreateMaterialInstance(Material *mtl,const VABConfigInfo *vab_cfg) { if(!mtl)return(nullptr); - MaterialInstance *mi=device->CreateMI(mtl); + MaterialInstance *mi=device->CreateMI(mtl,vab_cfg); if(mi) Add(mi); @@ -62,14 +62,14 @@ MaterialInstance *RenderResource::CreateMaterialInstance(Material *mtl) return mi; } -MaterialInstance *RenderResource::CreateMaterialInstance(const OSString &mtl_filename) +MaterialInstance *RenderResource::CreateMaterialInstance(const OSString &mtl_filename,const VABConfigInfo *vab_cfg) { Material *mtl=this->CreateMaterial(mtl_filename); if(!mtl) return(nullptr); - return CreateMaterialInstance(mtl); + return CreateMaterialInstance(mtl,vab_cfg); } Renderable *RenderResource::CreateRenderable(const uint32_t vertex_count) diff --git a/src/SceneGraph/Vulkan/VKShaderResource.cpp b/src/SceneGraph/Vulkan/VKShaderResource.cpp index 5753e3f6..3dbb0dc5 100644 --- a/src/SceneGraph/Vulkan/VKShaderResource.cpp +++ b/src/SceneGraph/Vulkan/VKShaderResource.cpp @@ -42,14 +42,10 @@ VK_NAMESPACE_BEGIN ss->type.basetype =(VertexAttribBaseType)*data++; ss->type.vec_size =*data++; -// ss->format =VK_NAMESPACE::GetVulkanFormat(&(ss->type)); - str_len=*data++; ss->name.SetString((char *)data,str_len); data+=str_len; - ss->binding=i; - ss_list.Add(ss); } diff --git a/src/SceneGraph/font/TextRenderable.cpp b/src/SceneGraph/font/TextRenderable.cpp index 7d282d6d..b38819ec 100644 --- a/src/SceneGraph/font/TextRenderable.cpp +++ b/src/SceneGraph/font/TextRenderable.cpp @@ -35,7 +35,7 @@ namespace hgl if(vbo_position) delete vbo_position; - vbo_position =device->CreateVBO(PF_RGBA16I,max_count); + vbo_position =device->CreateVBO(VF_V4I16,max_count); Set(VAN::Position,vbo_position); } @@ -43,7 +43,7 @@ namespace hgl if(vbo_tex_coord) delete vbo_tex_coord; - vbo_tex_coord =device->CreateVBO(VF_VEC4,max_count); + vbo_tex_coord =device->CreateVBO(VF_V4F,max_count); Set(VAN::TexCoord,vbo_tex_coord); } }