更合理的数据分类,建立Renderable,删除vertexinput。

This commit is contained in:
HuYingzhuo 2019-04-28 17:02:38 +08:00
parent 8f60701a51
commit 20f2aa7277
9 changed files with 125 additions and 108 deletions

View File

@ -24,12 +24,12 @@ SET(VULKAN_TEST_SOURCE_FILES main.cpp
VKShaderModule.cpp VKShaderModule.cpp
VKShaderModuleManage.cpp VKShaderModuleManage.cpp
VKVertexAttributeBinding.cpp VKVertexAttributeBinding.cpp
VKVertexInput.cpp
VKPipeline.cpp VKPipeline.cpp
VKSemaphore.cpp VKSemaphore.cpp
VKFramebuffer.cpp VKFramebuffer.cpp
VKFence.cpp VKFence.cpp
VKMaterial.cpp VKMaterial.cpp
VKRenderable.cpp
) )
SET(VULKAN_TEST_HEADER_FILES AssetsManage.h SET(VULKAN_TEST_HEADER_FILES AssetsManage.h
@ -49,13 +49,13 @@ SET(VULKAN_TEST_HEADER_FILES AssetsManage.h
VKRenderPass.h VKRenderPass.h
VKShaderModule.h VKShaderModule.h
VKShaderModuleManage.h VKShaderModuleManage.h
VKVertexInput.h
VKVertexAttributeBinding.h VKVertexAttributeBinding.h
VKSemaphore.h VKSemaphore.h
VKPipeline.h VKPipeline.h
VKFramebuffer.h VKFramebuffer.h
VKFence.h VKFence.h
VKMaterial.h VKMaterial.h
VKRenderable.h
Window.h) Window.h)
SET(SHADER_FILES shader_compile.bat SET(SHADER_FILES shader_compile.bat

View File

@ -4,7 +4,7 @@
#include"VKPipeline.h" #include"VKPipeline.h"
#include"VKPipelineLayout.h" #include"VKPipelineLayout.h"
#include"VKBuffer.h" #include"VKBuffer.h"
#include"VKVertexInput.h" #include"VKRenderable.h"
#include"VKDescriptorSets.h" #include"VKDescriptorSets.h"
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
@ -84,22 +84,22 @@ bool CommandBuffer::Bind(PipelineLayout *pl)
return(true); return(true);
} }
bool CommandBuffer::Bind(VertexInput *vi) bool CommandBuffer::Bind(Renderable *render_obj)
{ {
if(!vi) if(!render_obj)
return(false); return(false);
const uint count=vi->GetCount(); const uint count=render_obj->GetBufferCount();
if(count<=0) if(count<=0)
return(false); 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) 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); return(true);
} }

View File

@ -7,7 +7,7 @@ class RenderPass;
class Framebuffer; class Framebuffer;
class Pipeline; class Pipeline;
class PipelineLayout; class PipelineLayout;
class VertexInput; class Renderable;
class CommandBuffer class CommandBuffer
{ {
@ -46,7 +46,7 @@ public:
bool Begin(RenderPass *rp,Framebuffer *fb); bool Begin(RenderPass *rp,Framebuffer *fb);
bool Bind(Pipeline *p); bool Bind(Pipeline *p);
bool Bind(PipelineLayout *pl); bool Bind(PipelineLayout *pl);
bool Bind(VertexInput *vi); bool Bind(Renderable *);
bool End(); bool End();
public: public:

View File

@ -3,7 +3,8 @@
#include"VKDescriptorSets.h" #include"VKDescriptorSets.h"
#include"VKShaderModule.h" #include"VKShaderModule.h"
#include"VKVertexAttributeBinding.h" #include"VKVertexAttributeBinding.h"
#include"VKVertexInput.h" #include"VKRenderable.h"
#include"VKBuffer.h"
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
Material::Material(Device *dev,ShaderModuleMap *smm) Material::Material(Device *dev,ShaderModuleMap *smm)
{ {
@ -76,6 +77,13 @@ const int Material::GetUBOBinding(const UTF8String &name)const
return(-1); return(-1);
} }
const int Material::GetVBOBinding(const UTF8String &name)const
{
if(!vertex_sm)return(-1);
return vertex_sm->GetBinding(name);
}
MaterialInstance *Material::CreateInstance()const MaterialInstance *Material::CreateInstance()const
{ {
if(!vertex_sm) if(!vertex_sm)
@ -86,23 +94,21 @@ MaterialInstance *Material::CreateInstance()const
if(!vab) if(!vab)
return(nullptr); return(nullptr);
VertexInput *vi=new VertexInput(vertex_sm);
DescriptorSetLayout *dsl=dsl_creater->Create(); 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; mat=m;
vertex_sm=vsm;
vab=v; vab=v;
desc_set_layout=d; desc_set_layout=d;
vi=i;
} }
MaterialInstance::~MaterialInstance() MaterialInstance::~MaterialInstance()
{ {
delete vi;
delete desc_set_layout; delete desc_set_layout;
delete vab; delete vab;
} }
@ -116,4 +122,9 @@ void MaterialInstance::Write(VkPipelineVertexInputStateCreateInfo &vis)const
{ {
return vab->Write(vis); return vab->Write(vis);
} }
Renderable *MaterialInstance::CreateRenderable()
{
return(new Renderable(vertex_sm));
}
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -12,7 +12,8 @@ class DescriptorSetLayoutCreater;
class DescriptorSetLayout; class DescriptorSetLayout;
class MaterialInstance; class MaterialInstance;
class VertexAttributeBinding; class VertexAttributeBinding;
class VertexInput; class VertexBuffer;
class Renderable;
using ShaderModuleMap=hgl::Map<VkShaderStageFlagBits,const ShaderModule *>; using ShaderModuleMap=hgl::Map<VkShaderStageFlagBits,const ShaderModule *>;
@ -35,6 +36,7 @@ public:
~Material(); ~Material();
const int GetUBOBinding(const UTF8String &)const; const int GetUBOBinding(const UTF8String &)const;
const int GetVBOBinding(const UTF8String &)const;
MaterialInstance *CreateInstance()const; MaterialInstance *CreateInstance()const;
@ -49,13 +51,13 @@ public:
class MaterialInstance class MaterialInstance
{ {
const Material *mat; ///<这里的是对material的完全引用不做任何修改 const Material *mat; ///<这里的是对material的完全引用不做任何修改
const VertexShaderModule *vertex_sm;
VertexAttributeBinding *vab; VertexAttributeBinding *vab;
VertexInput *vi;
DescriptorSetLayout *desc_set_layout; DescriptorSetLayout *desc_set_layout;
public: public:
MaterialInstance(const Material *m,VertexAttributeBinding *v,VertexInput *i,DescriptorSetLayout *d); MaterialInstance(const Material *m,const VertexShaderModule *,VertexAttributeBinding *v,DescriptorSetLayout *d);
~MaterialInstance(); ~MaterialInstance();
bool UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info); bool UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info);
@ -67,12 +69,16 @@ public:
return UpdateUBO(mat->GetUBOBinding(name),buf_info); return UpdateUBO(mat->GetUBOBinding(name),buf_info);
} }
const VertexShaderModule * GetVertexShader ()const{return vertex_sm;}
const uint32_t GetStageCount ()const{return mat->GetStageCount();} const uint32_t GetStageCount ()const{return mat->GetStageCount();}
const VkPipelineShaderStageCreateInfo * GetStages ()const{return mat->GetStages();} const VkPipelineShaderStageCreateInfo * GetStages ()const{return mat->GetStages();}
void Write(VkPipelineVertexInputStateCreateInfo &vis)const; void Write(VkPipelineVertexInputStateCreateInfo &vis)const;
VertexInput * GetVI(){return vi;}
DescriptorSetLayout * GetDSL(){return desc_set_layout;} DescriptorSetLayout * GetDSL(){return desc_set_layout;}
Renderable *CreateRenderable();
};//class MaterialInstance };//class MaterialInstance
VK_NAMESPACE_END VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE #endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE

View File

@ -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<VkBuffer>(buf_count);
buf_offset=hgl_zero_new<VkDeviceSize>(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

View File

@ -1,22 +1,22 @@
#ifndef HGL_GRAPH_VULKAN_VERTEX_INPUT_INCLUDE #ifndef HGL_GRAPH_VULKAN_RENDERABLE_INCLUDE
#define HGL_GRAPH_VULKAN_VERTEX_INPUT_INCLUDE #define HGL_GRAPH_VULKAN_RENDERABLE_INCLUDE
#include"VK.h" #include"VK.h"
#include<hgl/type/BaseString.h> #include<hgl/type/BaseString.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
class VertexShaderModule;
class VertexBuffer; class VertexBuffer;
class IndexBuffer; class IndexBuffer;
class VertexShaderModule;
/** /**
* buffer绑定CommandBuffer使用<br> * <br>
* Buffer中包括多种数据 * Mesh信息
*/ */
class VertexInput class Renderable
{ {
const VertexShaderModule *shader; const VertexShaderModule *vertex_sm;
int buf_count=0; int buf_count;
VkBuffer *buf_list=nullptr; VkBuffer *buf_list=nullptr;
VkDeviceSize *buf_offset=nullptr; VkDeviceSize *buf_offset=nullptr;
@ -25,8 +25,8 @@ class VertexInput
public: public:
VertexInput(const VertexShaderModule *); Renderable(const VertexShaderModule *);
virtual ~VertexInput(); virtual ~Renderable();
bool Set(const int binding, VertexBuffer *vb,VkDeviceSize offset=0); bool Set(const int binding, VertexBuffer *vb,VkDeviceSize offset=0);
bool Set(const UTF8String &name,VertexBuffer *vb,VkDeviceSize offset=0); bool Set(const UTF8String &name,VertexBuffer *vb,VkDeviceSize offset=0);
@ -42,12 +42,12 @@ public:
public: public:
const int GetCount ()const{return buf_count;} const int GetBufferCount ()const{return buf_count;}
const VkBuffer * GetBuffer ()const{return buf_list;} const VkBuffer * GetBuffer ()const{return buf_list;}
const VkDeviceSize * GetOffset ()const{return buf_offset;} const VkDeviceSize * GetOffset ()const{return buf_offset;}
IndexBuffer * GetIndexBuffer() {return indices_buffer;} IndexBuffer * GetIndexBuffer() {return indices_buffer;}
const VkDeviceSize GetIndexOffset()const{return indices_offset;} const VkDeviceSize GetIndexOffset()const{return indices_offset;}
};//class VertexInput };//class Renderable
VK_NAMESPACE_END VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_VERTEX_INPUT_INCLUDE #endif//HGL_GRAPH_VULKAN_RENDERABLE_INCLUDE

View File

@ -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<VkBuffer>(buf_count);
buf_offset=hgl_zero_new<VkDeviceSize>(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

View File

@ -6,7 +6,7 @@
#include"VKShaderModule.h" #include"VKShaderModule.h"
#include"VKShaderModuleManage.h" #include"VKShaderModuleManage.h"
#include"VKImageView.h" #include"VKImageView.h"
#include"VKVertexInput.h" #include"VKRenderable.h"
#include"VKDescriptorSets.h" #include"VKDescriptorSets.h"
#include"VKRenderPass.h" #include"VKRenderPass.h"
#include"VKPipelineLayout.h" #include"VKPipelineLayout.h"
@ -40,24 +40,31 @@ vulkan::Buffer *CreateUBO(vulkan::Device *dev)
return dev->CreateUBO(sizeof(WorldConfig),&world); 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.5, SCREEN_HEIGHT*0.25},
SCREEN_WIDTH*0.75, SCREEN_HEIGHT*0.75, {SCREEN_WIDTH*0.75, SCREEN_HEIGHT*0.75},
SCREEN_WIDTH*0.25, 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 *vertex_buffer=nullptr;
vulkan::VertexBuffer *color_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); vertex_buffer =dev->CreateVBO(FMT_RG32F, VERTEX_COUNT,vertex_data);
color_buffer =dev->CreateVBO(FMT_RGB32F, 3,color_data); color_buffer =dev->CreateVBO(FMT_RGB32F, VERTEX_COUNT,color_data);
vi->Set("Vertex", vertex_buffer); render_obj->Set("Vertex", vertex_buffer);
vi->Set("Color", color_buffer); render_obj->Set("Color", color_buffer);
} }
void wait_seconds(int seconds) { void wait_seconds(int seconds) {
@ -123,6 +130,7 @@ int main(int,char **)
return -3; return -3;
vulkan::MaterialInstance *mi=material->CreateInstance(); vulkan::MaterialInstance *mi=material->CreateInstance();
vulkan::Renderable *render_obj=mi->CreateRenderable();
vulkan::Buffer *ubo=CreateUBO(device); vulkan::Buffer *ubo=CreateUBO(device);
@ -130,7 +138,7 @@ int main(int,char **)
mi->UpdateUBO("world",*ubo); mi->UpdateUBO("world",*ubo);
CreateVertexBuffer(device,mi->GetVI()); CreateVertexBuffer(device,render_obj);
vulkan::PipelineLayout *pl=CreatePipelineLayout(*device,mi->GetDSL()); 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->Begin(device->GetRenderPass(),device->GetFramebuffer(0));
cmd_buf->Bind(pipeline); cmd_buf->Bind(pipeline);
cmd_buf->Bind(pl); cmd_buf->Bind(pl);
cmd_buf->Bind(mi->GetVI()); cmd_buf->Bind(render_obj);
cmd_buf->Draw(3); cmd_buf->Draw(VERTEX_COUNT);
cmd_buf->End(); cmd_buf->End();
device->QueueSubmit(cmd_buf); device->QueueSubmit(cmd_buf);
device->Wait(); device->Wait();
device->QueuePresent(); device->QueuePresent();
wait_seconds(2); wait_seconds(1);
delete vertex_buffer; delete vertex_buffer;
delete color_buffer; delete color_buffer;
@ -170,12 +178,7 @@ int main(int,char **)
delete pipeline; delete pipeline;
delete pl; delete pl;
// delete dsl;
// delete vi;
delete ubo; delete ubo;
// delete shader;
delete mi; delete mi;
delete cmd_buf; delete cmd_buf;