From 20f2aa727787b4a914d99fc283dfe51cb72fc9e0 Mon Sep 17 00:00:00 2001 From: HuYingzhuo Date: Sun, 28 Apr 2019 17:02:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E5=90=88=E7=90=86=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=88=86=E7=B1=BB=EF=BC=8C=E5=BB=BA=E7=AB=8BRenderabl?= =?UTF-8?q?e=EF=BC=8C=E5=88=A0=E9=99=A4vertexinput=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Vulkan/CMakeLists.txt | 4 +- example/Vulkan/VKCommandBuffer.cpp | 14 +++--- example/Vulkan/VKCommandBuffer.h | 4 +- example/Vulkan/VKMaterial.cpp | 23 ++++++--- example/Vulkan/VKMaterial.h | 18 ++++--- example/Vulkan/VKRenderable.cpp | 44 +++++++++++++++++ .../{VKVertexInput.h => VKRenderable.h} | 36 +++++++------- example/Vulkan/VKVertexInput.cpp | 47 ------------------- example/Vulkan/main.cpp | 43 +++++++++-------- 9 files changed, 125 insertions(+), 108 deletions(-) create mode 100644 example/Vulkan/VKRenderable.cpp rename example/Vulkan/{VKVertexInput.h => VKRenderable.h} (50%) delete mode 100644 example/Vulkan/VKVertexInput.cpp diff --git a/example/Vulkan/CMakeLists.txt b/example/Vulkan/CMakeLists.txt index 7271cfce..9800acfd 100644 --- a/example/Vulkan/CMakeLists.txt +++ b/example/Vulkan/CMakeLists.txt @@ -24,12 +24,12 @@ SET(VULKAN_TEST_SOURCE_FILES main.cpp VKShaderModule.cpp VKShaderModuleManage.cpp VKVertexAttributeBinding.cpp - VKVertexInput.cpp VKPipeline.cpp VKSemaphore.cpp VKFramebuffer.cpp VKFence.cpp VKMaterial.cpp + VKRenderable.cpp ) SET(VULKAN_TEST_HEADER_FILES AssetsManage.h @@ -49,13 +49,13 @@ SET(VULKAN_TEST_HEADER_FILES AssetsManage.h VKRenderPass.h VKShaderModule.h VKShaderModuleManage.h - VKVertexInput.h VKVertexAttributeBinding.h VKSemaphore.h VKPipeline.h VKFramebuffer.h VKFence.h VKMaterial.h + VKRenderable.h Window.h) SET(SHADER_FILES shader_compile.bat diff --git a/example/Vulkan/VKCommandBuffer.cpp b/example/Vulkan/VKCommandBuffer.cpp index f0249a0e..774a40af 100644 --- a/example/Vulkan/VKCommandBuffer.cpp +++ b/example/Vulkan/VKCommandBuffer.cpp @@ -4,7 +4,7 @@ #include"VKPipeline.h" #include"VKPipelineLayout.h" #include"VKBuffer.h" -#include"VKVertexInput.h" +#include"VKRenderable.h" #include"VKDescriptorSets.h" VK_NAMESPACE_BEGIN @@ -84,22 +84,22 @@ bool CommandBuffer::Bind(PipelineLayout *pl) return(true); } -bool CommandBuffer::Bind(VertexInput *vi) +bool CommandBuffer::Bind(Renderable *render_obj) { - if(!vi) + if(!render_obj) return(false); - const uint count=vi->GetCount(); + const uint count=render_obj->GetBufferCount(); if(count<=0) return(false); - vkCmdBindVertexBuffers(cmd_buf,0,count,vi->GetBuffer(),vi->GetOffset()); + vkCmdBindVertexBuffers(cmd_buf,0,count,render_obj->GetBuffer(),render_obj->GetOffset()); - IndexBuffer *indices_buffer=vi->GetIndexBuffer(); + IndexBuffer *indices_buffer=render_obj->GetIndexBuffer(); if(indices_buffer) - vkCmdBindIndexBuffer(cmd_buf,*indices_buffer,vi->GetIndexOffset(),indices_buffer->GetType()); + vkCmdBindIndexBuffer(cmd_buf,*indices_buffer,render_obj->GetIndexOffset(),indices_buffer->GetType()); return(true); } diff --git a/example/Vulkan/VKCommandBuffer.h b/example/Vulkan/VKCommandBuffer.h index fb03563c..e19dc038 100644 --- a/example/Vulkan/VKCommandBuffer.h +++ b/example/Vulkan/VKCommandBuffer.h @@ -7,7 +7,7 @@ class RenderPass; class Framebuffer; class Pipeline; class PipelineLayout; -class VertexInput; +class Renderable; class CommandBuffer { @@ -46,7 +46,7 @@ public: bool Begin(RenderPass *rp,Framebuffer *fb); bool Bind(Pipeline *p); bool Bind(PipelineLayout *pl); - bool Bind(VertexInput *vi); + bool Bind(Renderable *); bool End(); public: diff --git a/example/Vulkan/VKMaterial.cpp b/example/Vulkan/VKMaterial.cpp index a5ed9187..098df925 100644 --- a/example/Vulkan/VKMaterial.cpp +++ b/example/Vulkan/VKMaterial.cpp @@ -3,7 +3,8 @@ #include"VKDescriptorSets.h" #include"VKShaderModule.h" #include"VKVertexAttributeBinding.h" -#include"VKVertexInput.h" +#include"VKRenderable.h" +#include"VKBuffer.h" VK_NAMESPACE_BEGIN Material::Material(Device *dev,ShaderModuleMap *smm) { @@ -76,6 +77,13 @@ const int Material::GetUBOBinding(const UTF8String &name)const return(-1); } +const int Material::GetVBOBinding(const UTF8String &name)const +{ + if(!vertex_sm)return(-1); + + return vertex_sm->GetBinding(name); +} + MaterialInstance *Material::CreateInstance()const { if(!vertex_sm) @@ -86,23 +94,21 @@ MaterialInstance *Material::CreateInstance()const if(!vab) return(nullptr); - VertexInput *vi=new VertexInput(vertex_sm); DescriptorSetLayout *dsl=dsl_creater->Create(); - return(new MaterialInstance(this,vab,vi,dsl)); + return(new MaterialInstance(this,vertex_sm,vab,dsl)); } -MaterialInstance::MaterialInstance(const Material *m,VertexAttributeBinding *v,VertexInput *i,DescriptorSetLayout *d) +MaterialInstance::MaterialInstance(const Material *m,const VertexShaderModule *vsm,VertexAttributeBinding *v,DescriptorSetLayout *d) { mat=m; + vertex_sm=vsm; vab=v; desc_set_layout=d; - vi=i; } MaterialInstance::~MaterialInstance() { - delete vi; delete desc_set_layout; delete vab; } @@ -116,4 +122,9 @@ void MaterialInstance::Write(VkPipelineVertexInputStateCreateInfo &vis)const { return vab->Write(vis); } + +Renderable *MaterialInstance::CreateRenderable() +{ + return(new Renderable(vertex_sm)); +} VK_NAMESPACE_END diff --git a/example/Vulkan/VKMaterial.h b/example/Vulkan/VKMaterial.h index 54b08a70..7b019d04 100644 --- a/example/Vulkan/VKMaterial.h +++ b/example/Vulkan/VKMaterial.h @@ -12,7 +12,8 @@ class DescriptorSetLayoutCreater; class DescriptorSetLayout; class MaterialInstance; class VertexAttributeBinding; -class VertexInput; +class VertexBuffer; +class Renderable; using ShaderModuleMap=hgl::Map; @@ -35,11 +36,12 @@ public: ~Material(); const int GetUBOBinding(const UTF8String &)const; + const int GetVBOBinding(const UTF8String &)const; MaterialInstance *CreateInstance()const; - const uint32_t GetStageCount ()const{return shader_stage_list.GetCount();} - const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list.GetData();} + const uint32_t GetStageCount ()const{return shader_stage_list.GetCount();} + const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list.GetData();} };//class Material /** @@ -49,13 +51,13 @@ public: class MaterialInstance { const Material *mat; ///<这里的是对material的完全引用,不做任何修改 + const VertexShaderModule *vertex_sm; VertexAttributeBinding *vab; - VertexInput *vi; DescriptorSetLayout *desc_set_layout; public: - MaterialInstance(const Material *m,VertexAttributeBinding *v,VertexInput *i,DescriptorSetLayout *d); + MaterialInstance(const Material *m,const VertexShaderModule *,VertexAttributeBinding *v,DescriptorSetLayout *d); ~MaterialInstance(); bool UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info); @@ -67,12 +69,16 @@ public: return UpdateUBO(mat->GetUBOBinding(name),buf_info); } + const VertexShaderModule * GetVertexShader ()const{return vertex_sm;} + const uint32_t GetStageCount ()const{return mat->GetStageCount();} const VkPipelineShaderStageCreateInfo * GetStages ()const{return mat->GetStages();} + void Write(VkPipelineVertexInputStateCreateInfo &vis)const; - VertexInput * GetVI(){return vi;} DescriptorSetLayout * GetDSL(){return desc_set_layout;} + + Renderable *CreateRenderable(); };//class MaterialInstance VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE diff --git a/example/Vulkan/VKRenderable.cpp b/example/Vulkan/VKRenderable.cpp new file mode 100644 index 00000000..94331947 --- /dev/null +++ b/example/Vulkan/VKRenderable.cpp @@ -0,0 +1,44 @@ +#include"VKRenderable.h" +#include"VKBuffer.h" +#include"VKShaderModule.h" + +VK_NAMESPACE_BEGIN +Renderable::Renderable(const VertexShaderModule *vsm) +{ + vertex_sm=vsm; + + buf_count=vertex_sm->GetAttrCount(); + + buf_list=hgl_zero_new(buf_count); + buf_offset=hgl_zero_new(buf_count); +} + +Renderable::~Renderable() +{ + delete[] buf_offset; + delete[] buf_list; +} + +bool Renderable::Set(const int binding,VertexBuffer *vbo,VkDeviceSize offset) +{ + if(binding<0||binding>=buf_count||!vbo)return(false); + + const VkVertexInputBindingDescription *desc=vertex_sm->GetDesc(binding); + const VkVertexInputAttributeDescription *attr=vertex_sm->GetAttr(binding); + + if(vbo->GetFormat()!=attr->format)return(false); + if(vbo->GetStride()!=desc->stride)return(false); + + //format信息来自于shader->MaterialInstance,实际中可以不一样。但那样需要为每一个格式产生一个同样shader的material instance,不同的格式又需要不同的pipeline,我们不支持这种行为 + + buf_list[binding]=*vbo; + buf_offset[binding]=offset; + + return(true); +} + +bool Renderable::Set(const UTF8String &name,VertexBuffer *vbo,VkDeviceSize offset) +{ + return Set(vertex_sm->GetBinding(name),vbo,offset); +} +VK_NAMESPACE_END diff --git a/example/Vulkan/VKVertexInput.h b/example/Vulkan/VKRenderable.h similarity index 50% rename from example/Vulkan/VKVertexInput.h rename to example/Vulkan/VKRenderable.h index 5f4143b1..659e19c6 100644 --- a/example/Vulkan/VKVertexInput.h +++ b/example/Vulkan/VKRenderable.h @@ -1,32 +1,32 @@ -#ifndef HGL_GRAPH_VULKAN_VERTEX_INPUT_INCLUDE -#define HGL_GRAPH_VULKAN_VERTEX_INPUT_INCLUDE +#ifndef HGL_GRAPH_VULKAN_RENDERABLE_INCLUDE +#define HGL_GRAPH_VULKAN_RENDERABLE_INCLUDE #include"VK.h" #include VK_NAMESPACE_BEGIN +class VertexShaderModule; class VertexBuffer; class IndexBuffer; -class VertexShaderModule; /** - * 顶点输入配置,负责具体的buffer绑定,提供给CommandBuffer使用
- * 注:本引擎不支持一个Buffer中包括多种数据 - */ -class VertexInput +* 可渲染对象
+* 本对象包含材质实例信息和Mesh信息 +*/ +class Renderable { - const VertexShaderModule *shader; + const VertexShaderModule *vertex_sm; - int buf_count=0; + int buf_count; VkBuffer *buf_list=nullptr; VkDeviceSize *buf_offset=nullptr; - + IndexBuffer *indices_buffer=nullptr; VkDeviceSize indices_offset=0; public: - VertexInput(const VertexShaderModule *); - virtual ~VertexInput(); + Renderable(const VertexShaderModule *); + virtual ~Renderable(); bool Set(const int binding, VertexBuffer *vb,VkDeviceSize offset=0); bool Set(const UTF8String &name,VertexBuffer *vb,VkDeviceSize offset=0); @@ -42,12 +42,12 @@ public: public: - const int GetCount ()const{return buf_count;} - const VkBuffer * GetBuffer ()const{return buf_list;} - const VkDeviceSize * GetOffset ()const{return buf_offset;} + const int GetBufferCount ()const{return buf_count;} + const VkBuffer * GetBuffer ()const{return buf_list;} + const VkDeviceSize * GetOffset ()const{return buf_offset;} - IndexBuffer * GetIndexBuffer() {return indices_buffer;} + IndexBuffer * GetIndexBuffer() {return indices_buffer;} const VkDeviceSize GetIndexOffset()const{return indices_offset;} -};//class VertexInput +};//class Renderable VK_NAMESPACE_END -#endif//HGL_GRAPH_VULKAN_VERTEX_INPUT_INCLUDE +#endif//HGL_GRAPH_VULKAN_RENDERABLE_INCLUDE diff --git a/example/Vulkan/VKVertexInput.cpp b/example/Vulkan/VKVertexInput.cpp deleted file mode 100644 index 6522cd39..00000000 --- a/example/Vulkan/VKVertexInput.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include"VKVertexInput.h" -#include"VKBuffer.h" -#include"VKShaderModule.h" - -VK_NAMESPACE_BEGIN -VertexInput::VertexInput(const VertexShaderModule *s) -{ - shader=s; - - if(!shader) - return; - - buf_count=shader->GetAttrCount(); - - buf_list=hgl_zero_new(buf_count); - buf_offset=hgl_zero_new(buf_count); -} - -VertexInput::~VertexInput() -{ - delete[] buf_offset; - delete[] buf_list; -} - -bool VertexInput::Set(const int index,VertexBuffer *buf,VkDeviceSize offset) -{ - if(index<0||index>=buf_count)return(false); - - const VkVertexInputBindingDescription *desc=shader->GetDesc(index); - const VkVertexInputAttributeDescription *attr=shader->GetAttr(index); - - if(buf->GetFormat()!=attr->format)return(false); - if(buf->GetStride()!=desc->stride)return(false); - - buf_list[index]=*buf; - buf_offset[index]=offset; - - return(true); -} - -bool VertexInput::Set(const UTF8String &name,VertexBuffer *vb,VkDeviceSize offset) -{ - const int binding=shader->GetBinding(name); - - return Set(binding,vb,offset); -} -VK_NAMESPACE_END diff --git a/example/Vulkan/main.cpp b/example/Vulkan/main.cpp index 6d932059..8aa83c64 100644 --- a/example/Vulkan/main.cpp +++ b/example/Vulkan/main.cpp @@ -6,7 +6,7 @@ #include"VKShaderModule.h" #include"VKShaderModuleManage.h" #include"VKImageView.h" -#include"VKVertexInput.h" +#include"VKRenderable.h" #include"VKDescriptorSets.h" #include"VKRenderPass.h" #include"VKPipelineLayout.h" @@ -40,24 +40,31 @@ vulkan::Buffer *CreateUBO(vulkan::Device *dev) return dev->CreateUBO(sizeof(WorldConfig),&world); } -constexpr float vertex_data[]= +constexpr uint32_t VERTEX_COUNT=3; + +constexpr float vertex_data[VERTEX_COUNT][2]= { - SCREEN_WIDTH*0.5, SCREEN_HEIGHT*0.25, - SCREEN_WIDTH*0.75, SCREEN_HEIGHT*0.75, - SCREEN_WIDTH*0.25, SCREEN_HEIGHT*0.75 + {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 color_data[VERTEX_COUNT][3]= +{ {1,0,0}, + {0,1,0}, + {0,0,1} }; -constexpr float color_data[]={1,0,0, 0,1,0, 0,0,1 }; vulkan::VertexBuffer *vertex_buffer=nullptr; vulkan::VertexBuffer *color_buffer=nullptr; -void CreateVertexBuffer(vulkan::Device *dev,vulkan::VertexInput *vi) +void CreateVertexBuffer(vulkan::Device *dev,vulkan::Renderable *render_obj) { - vertex_buffer =dev->CreateVBO(FMT_RG32F, 3,vertex_data); - color_buffer =dev->CreateVBO(FMT_RGB32F, 3,color_data); + vertex_buffer =dev->CreateVBO(FMT_RG32F, VERTEX_COUNT,vertex_data); + color_buffer =dev->CreateVBO(FMT_RGB32F, VERTEX_COUNT,color_data); - vi->Set("Vertex", vertex_buffer); - vi->Set("Color", color_buffer); + render_obj->Set("Vertex", vertex_buffer); + render_obj->Set("Color", color_buffer); } void wait_seconds(int seconds) { @@ -123,6 +130,7 @@ int main(int,char **) return -3; vulkan::MaterialInstance *mi=material->CreateInstance(); + vulkan::Renderable *render_obj=mi->CreateRenderable(); vulkan::Buffer *ubo=CreateUBO(device); @@ -130,7 +138,7 @@ int main(int,char **) mi->UpdateUBO("world",*ubo); - CreateVertexBuffer(device,mi->GetVI()); + CreateVertexBuffer(device,render_obj); vulkan::PipelineLayout *pl=CreatePipelineLayout(*device,mi->GetDSL()); @@ -154,15 +162,15 @@ int main(int,char **) cmd_buf->Begin(device->GetRenderPass(),device->GetFramebuffer(0)); cmd_buf->Bind(pipeline); cmd_buf->Bind(pl); - cmd_buf->Bind(mi->GetVI()); - cmd_buf->Draw(3); + cmd_buf->Bind(render_obj); + cmd_buf->Draw(VERTEX_COUNT); cmd_buf->End(); device->QueueSubmit(cmd_buf); device->Wait(); device->QueuePresent(); - wait_seconds(2); + wait_seconds(1); delete vertex_buffer; delete color_buffer; @@ -170,12 +178,7 @@ int main(int,char **) delete pipeline; delete pl; -// delete dsl; - -// delete vi; delete ubo; - -// delete shader; delete mi; delete cmd_buf;