From 885cd735cdc92ddb2075b8d7a3b45e653da8910a Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 9 Mar 2022 20:55:09 +0800 Subject: [PATCH] optimized VulkanAppFramework and many examples that I moved Camera to VulkanApplicationFrame from CameraAppFramework --- example/Vulkan/DrawText.cpp | 33 +--------- example/Vulkan/DrawTile.cpp | 35 ++-------- example/Vulkan/FragCoordTest.cpp | 36 +---------- example/Vulkan/RectanglePrimitive.cpp | 33 +--------- example/Vulkan/first_triangle.cpp | 36 ++--------- example/Vulkan/indices_rect.cpp | 34 +--------- example/Vulkan/texture_rect.cpp | 34 +--------- example/Vulkan/two_triangle.cpp | 36 ++--------- example/common/VulkanAppFramework.h | 92 +++++++++++++++------------ 9 files changed, 75 insertions(+), 294 deletions(-) diff --git a/example/Vulkan/DrawText.cpp b/example/Vulkan/DrawText.cpp index f7bcd14c..6a045d0e 100644 --- a/example/Vulkan/DrawText.cpp +++ b/example/Vulkan/DrawText.cpp @@ -10,12 +10,6 @@ constexpr uint32_t SCREEN_HEIGHT=SCREEN_WIDTH/16*9; class TestApp:public VulkanApplicationFramework { - Camera cam; - -private: - - GPUBuffer * ubo_camera_info =nullptr; - private: TextRender * text_render =nullptr; @@ -32,23 +26,6 @@ public: private: - bool InitUBO() - { - const VkExtent2D &extent=sc_render_target->GetExtent(); - - cam.width=extent.width; - cam.height=extent.height; - - cam.RefreshCameraInfo(); - - ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&cam.info); - - if(!ubo_camera_info) - return(false); - - return(true); - } - bool InitTextRenderable() { UTF16String str; @@ -79,9 +56,6 @@ public: if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) return(false); - if(!InitUBO()) - return(false); - if(!InitTextRenderable()) return(false); @@ -92,12 +66,7 @@ public: void Resize(int w,int h)override { - cam.width=w; - cam.height=h; - - cam.RefreshCameraInfo(); - - ubo_camera_info->Write(&cam.info); + VulkanApplicationFramework::Resize(w,h); BuildCommandBuffer(render_instance); } diff --git a/example/Vulkan/DrawTile.cpp b/example/Vulkan/DrawTile.cpp index 1ad675c5..8081db51 100644 --- a/example/Vulkan/DrawTile.cpp +++ b/example/Vulkan/DrawTile.cpp @@ -26,9 +26,7 @@ struct TileBitmap }; class TestApp:public VulkanApplicationFramework -{ - Camera cam; - +{ ObjectList tile_list; TileData *tile_data=nullptr; @@ -44,7 +42,6 @@ private: MaterialInstance * material_instance =nullptr; Renderable * render_obj =nullptr; RenderableInstance *render_instance =nullptr; - GPUBuffer * ubo_camera_info =nullptr; Pipeline * pipeline =nullptr; @@ -162,33 +159,17 @@ private: if(!material_instance) return(false); + BindCameraUBO(material_instance); + pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::SolidRectangles); sampler=db->CreateSampler(); - if(!material_instance->BindUBO(DescriptorSetsType::Global,"g_camera",ubo_camera_info))return(false); if(!material_instance->BindSampler(DescriptorSetsType::Value,"tex",tile_data->GetTexture(),sampler))return(false); return(true); } - bool InitUBO() - { - const VkExtent2D extent=sc_render_target->GetExtent(); - - cam.width=extent.width; - cam.height=extent.height; - - cam.RefreshCameraInfo(); - - ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&cam.info); - - if(!ubo_camera_info) - return(false); - - return(true); - } - bool InitVBO() { const uint tile_count=tile_list.GetCount(); @@ -217,9 +198,6 @@ public: if(!InitTileTexture()) return(false); - if(!InitUBO()) - return(false); - if(!InitMaterial()) return(false); @@ -233,12 +211,7 @@ public: void Resize(int w,int h)override { - cam.width=w; - cam.height=h; - - cam.RefreshCameraInfo(); - - ubo_camera_info->Write(&cam.info); + VulkanApplicationFramework::Resize(w,h); BuildCommandBuffer(render_instance); } diff --git a/example/Vulkan/FragCoordTest.cpp b/example/Vulkan/FragCoordTest.cpp index 867fea40..341167df 100644 --- a/example/Vulkan/FragCoordTest.cpp +++ b/example/Vulkan/FragCoordTest.cpp @@ -24,11 +24,8 @@ class TestApp:public VulkanApplicationFramework { private: - Camera cam; - MaterialInstance * material_instance =nullptr; RenderableInstance *renderable_instance =nullptr; - GPUBuffer * ubo_camera_info =nullptr; Pipeline * pipeline =nullptr; @@ -40,31 +37,14 @@ private: if(!material_instance) return(false); + + BindCameraUBO(material_instance); pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::TriangleStrip); return pipeline; } - bool InitUBO() - { - const VkExtent2D extent=sc_render_target->GetExtent(); - - cam.vp_width=cam.width=extent.width; - cam.vp_height=cam.height=extent.height; - - cam.RefreshCameraInfo(); - - ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&cam.info); - - if(!ubo_camera_info) - return(false); - - if(!material_instance->BindUBO(DescriptorSetsType::Global,"g_camera",ubo_camera_info))return(false); - - return(true); - } - bool InitVBO() { auto render_obj=db->CreateRenderable(VERTEX_COUNT); @@ -86,9 +66,6 @@ public: if(!InitMaterial()) return(false); - if(!InitUBO()) - return(false); - if(!InitVBO()) return(false); @@ -99,14 +76,7 @@ public: void Resize(int w,int h)override { - cam.width=w; - cam.height=h; - cam.vp_width=w; - cam.vp_height=h; - - cam.RefreshCameraInfo(); - - ubo_camera_info->Write(&cam.info); + VulkanApplicationFramework::Resize(w,h); BuildCommandBuffer(renderable_instance); } diff --git a/example/Vulkan/RectanglePrimitive.cpp b/example/Vulkan/RectanglePrimitive.cpp index d9ee11c8..ac246f5b 100644 --- a/example/Vulkan/RectanglePrimitive.cpp +++ b/example/Vulkan/RectanglePrimitive.cpp @@ -32,8 +32,6 @@ constexpr float tex_coord_data[4]= class TestApp:public VulkanApplicationFramework { - Camera cam; - private: Texture2D * texture =nullptr; @@ -41,7 +39,6 @@ private: MaterialInstance * material_instance =nullptr; Renderable * render_obj =nullptr; RenderableInstance *render_instance =nullptr; - GPUBuffer * ubo_camera_info =nullptr; Pipeline * pipeline =nullptr; @@ -52,6 +49,8 @@ private: material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/TextureRect2D")); if(!material_instance)return(false); + BindCameraUBO(material_instance); + pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::SolidRectangles); if(!pipeline)return(false); @@ -60,29 +59,11 @@ private: sampler=db->CreateSampler(); - if(!material_instance->BindUBO(DescriptorSetsType::Global,"g_camera",ubo_camera_info))return(false); if(!material_instance->BindSampler(DescriptorSetsType::Value,"tex",texture,sampler))return(false); return(true); } - bool InitUBO() - { - const VkExtent2D extent=sc_render_target->GetExtent(); - - cam.width=extent.width; - cam.height=extent.height; - - cam.RefreshCameraInfo(); - - ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&cam.info); - - if(!ubo_camera_info) - return(false); - - return(true); - } - bool InitVBO() { render_obj=db->CreateRenderable(VERTEX_COUNT); @@ -104,9 +85,6 @@ public: if(!VulkanApplicationFramework::Init(SCREEN_SIZE,SCREEN_SIZE)) return(false); - if(!InitUBO()) - return(false); - if(!InitMaterial()) return(false); @@ -120,12 +98,7 @@ public: void Resize(int w,int h)override { - cam.width=w; - cam.height=h; - - cam.RefreshCameraInfo(); - - ubo_camera_info->Write(&cam.info); + VulkanApplicationFramework::Resize(w,h); BuildCommandBuffer(render_instance); } diff --git a/example/Vulkan/first_triangle.cpp b/example/Vulkan/first_triangle.cpp index c41f2efe..1c3221a3 100644 --- a/example/Vulkan/first_triangle.cpp +++ b/example/Vulkan/first_triangle.cpp @@ -31,11 +31,8 @@ class TestApp:public VulkanApplicationFramework { private: - Camera cam; - MaterialInstance * material_instance =nullptr; RenderableInstance *render_instance =nullptr; - GPUBuffer * ubo_camera_info =nullptr; Pipeline * pipeline =nullptr; @@ -47,32 +44,15 @@ private: if(!material_instance) return(false); + + BindCameraUBO(material_instance); // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行,为Framework重载,默认使用swapchain的render target return pipeline; } - - bool InitUBO() - { - const VkExtent2D extent=sc_render_target->GetExtent(); - - cam.width=extent.width; - cam.height=extent.height; - - cam.RefreshCameraInfo(); - - ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&cam.info); - - if(!ubo_camera_info) - return(false); - - if(!material_instance->BindUBO(DescriptorSetsType::Global,"g_camera",ubo_camera_info))return(false); - - return(true); - } - + bool InitVBO() { Renderable *render_obj=db->CreateRenderable(VERTEX_COUNT); @@ -95,9 +75,6 @@ public: if(!InitMaterial()) return(false); - if(!InitUBO()) - return(false); - if(!InitVBO()) return(false); @@ -109,12 +86,7 @@ public: void Resize(int w,int h)override { - cam.width=w; - cam.height=h; - - cam.RefreshCameraInfo(); - - ubo_camera_info->Write(&cam.info); + VulkanApplicationFramework::Resize(w,h); BuildCommandBuffer(render_instance); } diff --git a/example/Vulkan/indices_rect.cpp b/example/Vulkan/indices_rect.cpp index 0cf598de..f41ec7bf 100644 --- a/example/Vulkan/indices_rect.cpp +++ b/example/Vulkan/indices_rect.cpp @@ -34,11 +34,8 @@ class TestApp:public VulkanApplicationFramework { private: - Camera cam; - MaterialInstance * material_instance =nullptr; RenderableInstance *renderable_instance =nullptr; - GPUBuffer * ubo_camera_info =nullptr; Pipeline * pipeline =nullptr; @@ -48,31 +45,14 @@ private: { material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/FragColor")); if(!material_instance)return(false); + + BindCameraUBO(material_instance); // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行,为Framework重载,默认使用swapchain的render target return pipeline; } - - bool InitUBO() - { - const VkExtent2D extent=sc_render_target->GetExtent(); - - cam.vp_width=cam.width=extent.width; - cam.vp_height=cam.height=extent.height; - - cam.RefreshCameraInfo(); - - ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&cam.info); - - if(!ubo_camera_info) - return(false); - - if(!material_instance->BindUBO(DescriptorSetsType::Global,"g_camera",ubo_camera_info))return(false); - - return(true); - } bool InitVBO() { @@ -97,9 +77,6 @@ public: if(!InitMaterial()) return(false); - if(!InitUBO()) - return(false); - if(!InitVBO()) return(false); @@ -110,12 +87,7 @@ public: void Resize(int w,int h)override { - cam.vp_width=w; - cam.vp_height=h; - - cam.RefreshCameraInfo(); - - ubo_camera_info->Write(&cam.info); + VulkanApplicationFramework::Resize(w,h); BuildCommandBuffer(renderable_instance); } diff --git a/example/Vulkan/texture_rect.cpp b/example/Vulkan/texture_rect.cpp index 733f3273..86c1af20 100644 --- a/example/Vulkan/texture_rect.cpp +++ b/example/Vulkan/texture_rect.cpp @@ -45,15 +45,12 @@ constexpr uint16 index_data[INDEX_COUNT]= class TestApp:public VulkanApplicationFramework { - Camera cam; - private: Texture2D * texture =nullptr; Sampler * sampler =nullptr; MaterialInstance * material_instance =nullptr; RenderableInstance *renderable_instance =nullptr; - GPUBuffer * ubo_camera_info =nullptr; Pipeline * pipeline =nullptr; private: @@ -63,6 +60,8 @@ private: material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/Texture2D")); if(!material_instance)return(false); + BindCameraUBO(material_instance); + // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行,为Framework重载,默认使用swapchain的render target @@ -79,25 +78,6 @@ private: return(true); } - bool InitUBO() - { - const VkExtent2D extent=sc_render_target->GetExtent(); - - cam.vp_width =cam.width =extent.width; - cam.vp_height=cam.height=extent.height; - - cam.RefreshCameraInfo(); - - ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&cam.info); - - if(!ubo_camera_info) - return(false); - - if(!material_instance->BindUBO(DescriptorSetsType::Global,"g_camera",ubo_camera_info))return(false); - - return(true); - } - bool InitVBO() { auto render_obj=db->CreateRenderable(VERTEX_COUNT); @@ -122,9 +102,6 @@ public: if(!InitMaterial()) return(false); - if(!InitUBO()) - return(false); - if(!InitVBO()) return(false); @@ -135,12 +112,7 @@ public: void Resize(int w,int h)override { - cam.width=w; - cam.height=h; - - cam.RefreshCameraInfo(); - - ubo_camera_info->Write(&cam.info); + VulkanApplicationFramework::Resize(w,h); BuildCommandBuffer(renderable_instance); } diff --git a/example/Vulkan/two_triangle.cpp b/example/Vulkan/two_triangle.cpp index 082b624a..868d8f6a 100644 --- a/example/Vulkan/two_triangle.cpp +++ b/example/Vulkan/two_triangle.cpp @@ -30,14 +30,11 @@ class TestApp:public VulkanApplicationFramework { private: - Camera cam; - SceneNode render_root; RenderList * render_list =nullptr; MaterialInstance * material_instance =nullptr; RenderableInstance *render_instance =nullptr; - GPUBuffer * ubo_camera_info =nullptr; Pipeline * pipeline =nullptr; @@ -49,6 +46,8 @@ private: if(!material_instance) return(false); + + BindCameraUBO(material_instance); // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行,为Framework重载,默认使用swapchain的render target @@ -56,25 +55,6 @@ private: return pipeline; } - bool InitUBO() - { - const VkExtent2D extent=sc_render_target->GetExtent(); - - cam.width=extent.width; - cam.height=extent.height; - - cam.RefreshCameraInfo(); - - ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&cam.info); - - if(!ubo_camera_info) - return(false); - - if(!material_instance->BindUBO(DescriptorSetsType::Global,"g_camera",ubo_camera_info))return(false); - - return(true); - } - bool InitVBO() { Renderable *render_obj=db->CreateRenderable(VERTEX_COUNT); @@ -89,7 +69,7 @@ private: render_root.RefreshMatrix(); - render_list->Expend(cam.info,&render_root); + render_list->Expend(GetCameraInfo(),&render_root); return(true); } @@ -111,9 +91,6 @@ public: if(!InitMaterial()) return(false); - if(!InitUBO()) - return(false); - if(!InitVBO()) return(false); @@ -124,12 +101,7 @@ public: void Resize(int w,int h)override { - cam.width=w; - cam.height=h; - - cam.RefreshCameraInfo(); - - ubo_camera_info->Write(&cam.info); + VulkanApplicationFramework::Resize(w,h); BuildCommandBuffer(render_list); } diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index ddf5698f..3fe629a3 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -56,11 +56,17 @@ protected: protected: RenderResource * db =nullptr; + +protected: + + Camera * camera =nullptr; + GPUBuffer * ubo_camera_info =nullptr; public: virtual ~VulkanApplicationFramework() { + SAFE_CLEAR(camera); win->Unjoin(this); SAFE_CLEAR(db); @@ -119,10 +125,50 @@ public: win->Join(this); + { + camera=new Camera; + + camera->width=w; + camera->height=h; + camera->vp_width=w; + camera->vp_height=h; + + camera->pos=Vector3f(10,10,10); + + camera->RefreshCameraInfo(); + + ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&camera->info); + } + return(true); } - virtual void Resize(int,int)=0; + const CameraInfo &GetCameraInfo() + { + return camera->info; + } + + GPUBuffer *GetCameraInfoBuffer() + { + return ubo_camera_info; + } + + bool BindCameraUBO(MaterialInstance *mi) + { + return mi->BindUBO(DescriptorSetsType::Global,"g_camera",ubo_camera_info); + } + + virtual void Resize(int w,int h) + { + camera->width=w; + camera->height=h; + camera->vp_width=w; + camera->vp_height=h; + + camera->RefreshCameraInfo(); + + ubo_camera_info->Write(&camera->info); + } void SetClearColor(COLOR cc) { @@ -381,13 +427,9 @@ public: class CameraAppFramework:public VulkanApplicationFramework { -private: - - GPUBuffer *ubo_camera_info=nullptr; protected: - Camera *camera=nullptr; FirstPersonCameraControl *camera_control=nullptr; CameraKeyboardControl * ckc=nullptr; @@ -401,7 +443,6 @@ public: { SAFE_CLEAR(ckc); SAFE_CLEAR(cmc); - SAFE_CLEAR(camera); } virtual bool Init(int w,int h) @@ -415,20 +456,9 @@ public: virtual void InitCamera(int w,int h) { - camera=new Camera; - - camera->width=w; - camera->height=h; - camera->vp_width=w; - camera->vp_height=h; - - camera->pos=Vector3f(10,10,10); - camera_control=new FirstPersonCameraControl(camera); camera_control->Refresh(); //更新矩阵计算 - - ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&camera->info); ckc=new CameraKeyboardControl(camera_control); cmc=new CameraMouseControl(camera_control); @@ -441,41 +471,19 @@ public: { camera->width=w; camera->height=h; + camera->vp_width=w; + camera->vp_height=h; camera_control->Refresh(); ubo_camera_info->Write(&camera->info); } - const CameraInfo &GetCameraInfo() - { - return camera->info; - } - - GPUBuffer *GetCameraInfoBuffer() - { - return ubo_camera_info; - } - - bool BindCameraUBO(MaterialInstance *mi) - { - MaterialParameters *mp_global=mi->GetMP(DescriptorSetsType::Global); - - if(!mp_global) - return(false); - - if(!mp_global->BindUBO("g_camera",ubo_camera_info))return(false); - - mp_global->Update(); - - return(true); - } - virtual void BuildCommandBuffer(uint32_t index)=0; virtual void Draw()override { - camera_control->Refresh(); //更新相机矩阵 + camera_control->Refresh(); //更新相机矩阵 ubo_camera_info->Write(&camera->info); //写入缓冲区 const uint32_t index=AcquireNextImage();