From 7998fa6e411096e0d424ebeccbc114b0fd1ff1aa Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sat, 17 Oct 2020 22:13:08 +0800 Subject: [PATCH] OffscreenRender example,but it doesn't run. --- .gitignore | 1 + example/Vulkan/DeferredModel.cpp | 2 +- example/Vulkan/Geometry3D.cpp | 6 +- example/Vulkan/OffscreenRender.cpp | 168 ++++++++++++++++++++++++++-- example/Vulkan/first_triangle.cpp | 5 +- example/common/VulkanAppFramework.h | 26 ++++- inc/hgl/graph/vulkan/VKDevice.h | 2 + 7 files changed, 193 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index b6b1689e..83de64c9 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ *.lib *.ninja *.check_cache +/out diff --git a/example/Vulkan/DeferredModel.cpp b/example/Vulkan/DeferredModel.cpp index 978e518c..22da1587 100644 --- a/example/Vulkan/DeferredModel.cpp +++ b/example/Vulkan/DeferredModel.cpp @@ -192,7 +192,7 @@ private: vulkan::CreateColorAttachmentReference(gbuffer.attachment.color_ref_list,3); vulkan::CreateDepthAttachmentReference(&gbuffer.attachment.depth_ref); - if(!vulkan::CreateAttachment( gbuffer.attachment.desc_list, + if(!vulkan::CreateAttachmentDescription( gbuffer.attachment.desc_list, gbuffer.gbuffer_format_list, gbuffer.depth->GetFormat())) return(false); diff --git a/example/Vulkan/Geometry3D.cpp b/example/Vulkan/Geometry3D.cpp index fb59d216..b92953ab 100644 --- a/example/Vulkan/Geometry3D.cpp +++ b/example/Vulkan/Geometry3D.cpp @@ -94,17 +94,17 @@ private: pgci.side_step.u=10; pgci.side_step.v=10; - pgci.color.Set(0.75,0,0,1); + pgci.color.Set(0.5,0,0,1); pgci.side_color.Set(1,0,0,1); ro_plane_grid[0]=CreateRenderablePlaneGrid(db,m3d.material,&pgci); - pgci.color.Set(0,0.75,0,1); + pgci.color.Set(0,0.5,0,1); pgci.side_color.Set(0,1,0,1); ro_plane_grid[1]=CreateRenderablePlaneGrid(db,m3d.material,&pgci); - pgci.color.Set(0,0,0.75,1); + pgci.color.Set(0,0,0.5,1); pgci.side_color.Set(0,0,1,1); ro_plane_grid[2]=CreateRenderablePlaneGrid(db,m3d.material,&pgci); diff --git a/example/Vulkan/OffscreenRender.cpp b/example/Vulkan/OffscreenRender.cpp index ca144d45..17331539 100644 --- a/example/Vulkan/OffscreenRender.cpp +++ b/example/Vulkan/OffscreenRender.cpp @@ -8,19 +8,156 @@ constexpr uint OFFSCREEN_SIZE =512; constexpr uint SCREEN_WIDTH =1024; constexpr uint SCREEN_HEIGHT =(SCREEN_WIDTH/16)*9; -class OffscreenRender:public VulkanApplicationFramework +constexpr uint32_t TRIANGLE_VERTEX_COUNT=3; + +constexpr float triangle_vertex_data[TRIANGLE_VERTEX_COUNT][2]= { - vulkan::RenderTarget *os_rt; + {SCREEN_WIDTH*0.5, SCREEN_HEIGHT*0.25}, + {SCREEN_WIDTH*0.75, SCREEN_HEIGHT*0.75}, + {SCREEN_WIDTH*0.25, SCREEN_HEIGHT*0.75} +}; + +constexpr float triangle_color_data[TRIANGLE_VERTEX_COUNT][3]= +{ {1,0,0}, + {0,1,0}, + {0,0,1} +}; + +constexpr uint32_t RECT_VERTEX_COUNT=4; + +constexpr float rect_vertex_data[RECT_VERTEX_COUNT][2]= +{ + {0, 0}, + {SCREEN_WIDTH, 0}, + {0, SCREEN_HEIGHT}, + {SCREEN_WIDTH, SCREEN_HEIGHT} +}; + +constexpr float rect_texcoord_data[RECT_VERTEX_COUNT][2]= +{ + {0,0}, + {1,0}, + {0,1}, + {1,1} +}; + +constexpr uint32_t RECT_INDEX_COUNT=6; + +constexpr uint16 rect_index_data[RECT_INDEX_COUNT]= +{ + 0,1,3, + 0,3,2 +}; + +class TestApp:public VulkanApplicationFramework +{ + struct RenderObject + { + Camera cam; + + vulkan::MaterialInstance * material_instance =nullptr; + vulkan::Buffer * ubo_world_matrix =nullptr; + }; + + struct:public RenderObject + { + vulkan::RenderTarget * render_taget =nullptr; + + vulkan::Pipeline * pipeline =nullptr; + vulkan::RenderableInstance *renderable_instance =nullptr; + }os; + + struct:public RenderObject + { + Camera cam; + + vulkan::Sampler * sampler =nullptr; + + vulkan::Pipeline * pipeline =nullptr; + vulkan::RenderableInstance *renderable_instance =nullptr; + }rect; public: - ~OffscreenRender() + bool InitUBO(RenderObject *ro,const VkExtent2D &extent) { + ro->cam.width=extent.width; + ro->cam.height=extent.height; + + ro->cam.Refresh(); + + ro->ubo_world_matrix=db->CreateUBO(sizeof(WorldMatrix),&ro->cam.matrix); + + if(!ro->ubo_world_matrix) + return(false); + + ro->material_instance->BindUBO("world",ro->ubo_world_matrix); + ro->material_instance->Update(); + return(true); } - bool InitOffscreenRT() + bool InitOffscreen() { - os_rt=vulkan::CreateColorFramebuffer( + os.render_taget=device->CreateRenderTarget(OFFSCREEN_SIZE,OFFSCREEN_SIZE,UFMT_RGBA8,FMT_D16UN); + if(!os.render_taget)return(false); + + os.material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D")); + if(!os.material_instance)return(false); + + os.pipeline=db->CreatePipeline(os.material_instance,os.render_taget,vulkan::InlinePipeline::Solid2D); + if(!os.pipeline)return(false); + + if(!InitUBO(&os,os.render_taget->GetExtent())) + return(false); + + { + vulkan::Renderable *render_obj=db->CreateRenderable(TRIANGLE_VERTEX_COUNT); + if(!render_obj)return(false); + + if(!render_obj->Set(VAN::Position, db->CreateVAB(VAF_VEC2,TRIANGLE_VERTEX_COUNT,triangle_vertex_data)))return(false); + if(!render_obj->Set(VAN::Color, db->CreateVAB(VAF_VEC3,TRIANGLE_VERTEX_COUNT,triangle_color_data)))return(false); + + os.renderable_instance=db->CreateRenderableInstance(render_obj,os.material_instance,os.pipeline); + + if(!os.renderable_instance)return(false); + } + + BuildCommandBuffer(os.render_taget,os.renderable_instance); + + os.render_taget->Submit(nullptr); + os.render_taget->QueueWaitIdle(); + os.render_taget->Wait(); + + return(true); + } + + bool InitRectangle() + { + rect.material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/Texture2D")); + if(!rect.material_instance)return(false); + + rect.pipeline=CreatePipeline(rect.material_instance,vulkan::InlinePipeline::Solid2D); + if(!rect.pipeline)return(false); + + rect.sampler=db->CreateSampler(); + rect.material_instance->BindSampler("tex",os.render_taget->GetColorTexture(),rect.sampler); + + if(!InitUBO(&rect,sc_render_target->GetExtent())) + return(false); + + { + vulkan::Renderable *render_obj=db->CreateRenderable(RECT_VERTEX_COUNT); + if(!render_obj)return(false); + + if(!render_obj->Set(VAN::Position,db->CreateVAB(VAF_VEC2,RECT_VERTEX_COUNT,rect_vertex_data)))return(false); + if(!render_obj->Set(VAN::TexCoord,db->CreateVAB(VAF_VEC2,RECT_VERTEX_COUNT,rect_texcoord_data)))return(false); + if(!render_obj->Set(db->CreateIBO16(RECT_INDEX_COUNT,rect_index_data)))return(false); + + rect.renderable_instance=db->CreateRenderableInstance(render_obj,rect.material_instance,rect.pipeline); + } + + BuildCommandBuffer(rect.renderable_instance); + return(true); } bool Init() @@ -28,16 +165,31 @@ public: if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) return(false); - if(!InitOffscreenRT()) + if(!InitOffscreen()) + return(false); + + if(!InitRectangle()) return(false); return(true); + } + + void Resize(int w,int h)override + { + rect.cam.width=w; + rect.cam.height=h; + + rect.cam.Refresh(); + + rect.ubo_world_matrix->Write(&rect.cam.matrix); + + BuildCommandBuffer(rect.renderable_instance); } -};//class OffscreenRender:public VulkanApplicationFramework +};//class TestApp:public VulkanApplicationFramework int main(int,char **) { - OffscreenRender app; + TestApp app; if(!app.Init()) return(-1); diff --git a/example/Vulkan/first_triangle.cpp b/example/Vulkan/first_triangle.cpp index 9c5bcc5a..3e83295c 100644 --- a/example/Vulkan/first_triangle.cpp +++ b/example/Vulkan/first_triangle.cpp @@ -50,10 +50,7 @@ private: // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); pipeline=CreatePipeline(material_instance,vulkan::InlinePipeline::Solid2D); //等同上一行,为Framework重载,默认使用swapchain的render target - if(!pipeline) - return(false); - - return(true); + return pipeline; } bool InitUBO() diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index caad09a3..34ef7cc3 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -173,6 +173,29 @@ public: } } + void BuildCommandBuffer(vulkan::RenderTarget *rt,vulkan::RenderableInstance *ri) + { + if(!rt||!ri) + return; + + vulkan::CommandBuffer *cb=rt->GetCommandBuffer(); + const vulkan::IndexBuffer *ib=ri->GetIndexBuffer(); + + cb->Begin(); + cb->BeginRenderPass(rt->GetRenderPass(),rt->GetFramebuffer()); + cb->BindPipeline(ri->GetPipeline()); + cb->BindDescriptorSets(ri->GetDescriptorSets()); + cb->BindVAB(ri); + + if (ib) + cb->DrawIndexed(ib->GetCount()); + else + cb->Draw(ri->GetDrawCount()); + + cb->EndRenderPass(); + cb->End(); + } + void BuildCommandBuffer(uint32_t index,vulkan::RenderableInstance *ri) { if(!ri) @@ -243,8 +266,9 @@ public: { VkCommandBuffer cb=*cmd_buf[index]; - sc_render_target->Submit(cb,present_complete_semaphore,render_complete_semaphore); + sc_render_target->SubmitQueue::Submit(cb,present_complete_semaphore,render_complete_semaphore); sc_render_target->PresentBackbuffer(*render_complete_semaphore); + sc_render_target->QueueWaitIdle(); sc_render_target->Wait(); } diff --git a/inc/hgl/graph/vulkan/VKDevice.h b/inc/hgl/graph/vulkan/VKDevice.h index c4c9ed97..217570b3 100644 --- a/inc/hgl/graph/vulkan/VKDevice.h +++ b/inc/hgl/graph/vulkan/VKDevice.h @@ -307,6 +307,8 @@ public: Pipeline *CreatePipeline(const InlinePipeline &,const Material *,const RenderTarget *); Pipeline *CreatePipeline( PipelineData *, const Material *,const RenderTarget *); +public: + TileData *CreateTileData(const VkFormat video_format,const uint width,const uint height,const uint count); ///<创建一个Tile数据集 TileFont *CreateTileFont(FontSource *fs,int limit_count=-1); ///<创建一个Tile字体