Shader增加UBO binding记录和获取

This commit is contained in:
hyzboy 2019-04-27 01:36:58 +08:00
parent 6a313c9e25
commit 176d966159
7 changed files with 38 additions and 26 deletions

View File

@ -26,7 +26,7 @@ SET(VULKAN_TEST_SOURCE_FILES main.cpp
VKSemaphore.cpp VKSemaphore.cpp
VKFramebuffer.cpp VKFramebuffer.cpp
VKFence.cpp VKFence.cpp
VKMaterial.cpp #VKMaterial.cpp
) )
SET(VULKAN_TEST_HEADER_FILES VK.h SET(VULKAN_TEST_HEADER_FILES VK.h

View File

@ -3,10 +3,10 @@
layout(location = 0) in vec2 Vertex; layout(location = 0) in vec2 Vertex;
layout(location = 1) in vec3 Color; layout(location = 1) in vec3 Color;
layout(binding = 0) uniform MVPMatrix layout(binding = 0) uniform WorldConfig
{ {
mat4 MVP; mat4 mvp;
} ubo; } world;
layout(location = 0) out vec4 FragmentColor; layout(location = 0) out vec4 FragmentColor;
@ -14,5 +14,5 @@ void main()
{ {
FragmentColor=vec4(Color,1.0); FragmentColor=vec4(Color,1.0);
gl_Position=vec4(Vertex,0.0,1.0)*ubo.MVP; gl_Position=vec4(Vertex,0.0,1.0)*world.mvp;
} }

View File

@ -5,19 +5,23 @@
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
Material::~Material() Material::~Material()
{ {
delete dsl_creater;
delete shader; delete shader;
} }
MaterialInstance *Material::CreateInstance() MaterialInstance *Material::CreateInstance()
{ {
VertexAttributeBinding *vab=shader->CreateVertexAttributeBinding(); return(new MaterialInstance(this));
}
return(new MaterialInstance(this,vab)); MaterialInstance::MaterialInstance(Material *m)
{
mat=m;
vab=->CreateVertexAttributeBinding();
} }
MaterialInstance::~MaterialInstance() MaterialInstance::~MaterialInstance()
{ {
delete vab; delete vab;
delete dsl_creater;
} }
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -3,6 +3,7 @@
#include"VK.h" #include"VK.h"
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
class Device;
class Shader; class Shader;
class DescriptorSetLayoutCreater; class DescriptorSetLayoutCreater;
class MaterialInstance; class MaterialInstance;
@ -14,15 +15,15 @@ class VertexAttributeBinding;
*/ */
class Material class Material
{ {
Device *device;
Shader *shader; Shader *shader;
DescriptorSetLayoutCreater *dsl_creater;
public: public:
Material(Shader *s,DescriptorSetLayoutCreater *dslc) Material(Device *dev,Shader *s)
{ {
device=dev;
shader=s; shader=s;
dsl_creater=dslc;
} }
~Material(); ~Material();
@ -36,16 +37,12 @@ public:
class MaterialInstance class MaterialInstance
{ {
const Material *mat; ///<这里的是对material的完全引用不做任何修改 const Material *mat; ///<这里的是对material的完全引用不做任何修改
VertexAttributeBinding *vab; ///<这里的vis是Material中vis的复制体 VertexAttributeBinding *vab;
DescriptorSetLayoutCreater *dsl_creater;
public: public:
MaterialInstance(Material *m,VertexAttributeBinding *vi) MaterialInstance(Material *m);
{
mat=m;
vab=vi;
}
~MaterialInstance(); ~MaterialInstance();
};//class MaterialInstance };//class MaterialInstance
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -81,6 +81,14 @@ bool Shader::ParseVertexShader(const void *spv_data,const uint32_t spv_size)
++binding_index; ++binding_index;
} }
for(auto &ub:res.uniform_buffers)
{
const UTF8String & name =comp.get_name(ub.id).c_str();
const uint binding =comp.get_decoration(ub.id,spv::DecorationBinding);
ubo_list.Add(name,binding);
}
return(true); return(true);
} }

View File

@ -22,6 +22,7 @@ private:
VkVertexInputAttributeDescription *attribute_list; VkVertexInputAttributeDescription *attribute_list;
Map<UTF8String,VkVertexInputAttributeDescription *> stage_input_locations; Map<UTF8String,VkVertexInputAttributeDescription *> stage_input_locations;
Map<UTF8String,int> ubo_list;
Set<VertexAttributeBinding *> vab_sets; Set<VertexAttributeBinding *> vab_sets;
@ -61,6 +62,8 @@ public: //shader部分
const uint32_t GetStageCount ()const{return shader_stage_list.GetCount();} const uint32_t GetStageCount ()const{return shader_stage_list.GetCount();}
const VkPipelineShaderStageCreateInfo * GetShaderStages ()const{return shader_stage_list.GetData();} const VkPipelineShaderStageCreateInfo * GetShaderStages ()const{return shader_stage_list.GetData();}
const int GetUBO(const UTF8String &name)const{int binding;if(ubo_list.Get(name,binding))return binding;else return -1;}
public: //Vertex Input部分 public: //Vertex Input部分
VertexAttributeBinding * CreateVertexAttributeBinding(); VertexAttributeBinding * CreateVertexAttributeBinding();

View File

@ -29,10 +29,10 @@ constexpr uint32_t SCREEN_HEIGHT=720;
VkShaderModule vs=nullptr; VkShaderModule vs=nullptr;
VkShaderModule fs=nullptr; VkShaderModule fs=nullptr;
struct struct WorldConfig
{ {
Matrix4f mvp; Matrix4f mvp;
}ubo_vs; }world;
char *LoadFile(const char *filename,uint32_t &file_length) char *LoadFile(const char *filename,uint32_t &file_length)
{ {
@ -86,16 +86,16 @@ vulkan::Buffer *CreateUBO(vulkan::Device *dev)
{ {
const VkExtent2D extent=dev->GetExtent(); const VkExtent2D extent=dev->GetExtent();
ubo_vs.mvp=ortho(extent.width,extent.height); world.mvp=ortho(extent.width,extent.height);
} }
vulkan::Buffer *ubo=dev->CreateUBO(sizeof(ubo_vs)); vulkan::Buffer *ubo=dev->CreateUBO(sizeof(WorldConfig));
uint8_t *p=ubo->Map(); uint8_t *p=ubo->Map();
if(p) if(p)
{ {
memcpy(p,&ubo_vs,sizeof(ubo_vs)); memcpy(p,&world,sizeof(WorldConfig));
ubo->Unmap(); ubo->Unmap();
} }
@ -196,13 +196,13 @@ int main(int,char **)
vulkan::DescriptorSetLayoutCreater dslc(device); vulkan::DescriptorSetLayoutCreater dslc(device);
const int mvp_binding=0; //shader->GetBinding("MVPMatrix"); 实现从材质shader文件中根据名称获取binding的功能 const int ubo_world_config=shader->GetUBO("world");
dslc.BindUBO(mvp_binding,VK_SHADER_STAGE_VERTEX_BIT); dslc.BindUBO(ubo_world_config,VK_SHADER_STAGE_VERTEX_BIT);
vulkan::DescriptorSetLayout *dsl=dslc.Create(); vulkan::DescriptorSetLayout *dsl=dslc.Create();
dsl->UpdateUBO(mvp_binding,*ubo); dsl->UpdateUBO(ubo_world_config,*ubo);
vulkan::PipelineLayout *pl=CreatePipelineLayout(*device,dsl); vulkan::PipelineLayout *pl=CreatePipelineLayout(*device,dsl);