更合理的数据分类,建立Renderable,删除vertexinput。
This commit is contained in:
parent
8f60701a51
commit
20f2aa7277
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
44
example/Vulkan/VKRenderable.cpp
Normal file
44
example/Vulkan/VKRenderable.cpp
Normal 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
|
@ -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
|
@ -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
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user