Shader增加UBO binding记录和获取
This commit is contained in:
parent
6a313c9e25
commit
176d966159
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user