更合理的数据分类,建立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
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

View File

@ -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);
}

View File

@ -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:

View File

@ -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

View File

@ -12,7 +12,8 @@ class DescriptorSetLayoutCreater;
class DescriptorSetLayout;
class MaterialInstance;
class VertexAttributeBinding;
class VertexInput;
class VertexBuffer;
class Renderable;
using ShaderModuleMap=hgl::Map<VkShaderStageFlagBits,const ShaderModule *>;
@ -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

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
#define HGL_GRAPH_VULKAN_VERTEX_INPUT_INCLUDE
#ifndef HGL_GRAPH_VULKAN_RENDERABLE_INCLUDE
#define HGL_GRAPH_VULKAN_RENDERABLE_INCLUDE
#include"VK.h"
#include<hgl/type/BaseString.h>
VK_NAMESPACE_BEGIN
class VertexShaderModule;
class VertexBuffer;
class IndexBuffer;
class VertexShaderModule;
/**
* buffer绑定CommandBuffer使用<br>
* Buffer中包括多种数据
*/
class VertexInput
* <br>
* 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;
@ -25,8 +25,8 @@ class VertexInput
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

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"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;