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
|
||||
VKFramebuffer.cpp
|
||||
VKFence.cpp
|
||||
VKMaterial.cpp
|
||||
#VKMaterial.cpp
|
||||
)
|
||||
|
||||
SET(VULKAN_TEST_HEADER_FILES VK.h
|
||||
|
@ -3,10 +3,10 @@
|
||||
layout(location = 0) in vec2 Vertex;
|
||||
layout(location = 1) in vec3 Color;
|
||||
|
||||
layout(binding = 0) uniform MVPMatrix
|
||||
layout(binding = 0) uniform WorldConfig
|
||||
{
|
||||
mat4 MVP;
|
||||
} ubo;
|
||||
mat4 mvp;
|
||||
} world;
|
||||
|
||||
layout(location = 0) out vec4 FragmentColor;
|
||||
|
||||
@ -14,5 +14,5 @@ void main()
|
||||
{
|
||||
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
|
||||
Material::~Material()
|
||||
{
|
||||
delete dsl_creater;
|
||||
delete shader;
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
delete vab;
|
||||
delete dsl_creater;
|
||||
}
|
||||
VK_NAMESPACE_END
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
#include"VK.h"
|
||||
VK_NAMESPACE_BEGIN
|
||||
class Device;
|
||||
class Shader;
|
||||
class DescriptorSetLayoutCreater;
|
||||
class MaterialInstance;
|
||||
@ -14,15 +15,15 @@ class VertexAttributeBinding;
|
||||
*/
|
||||
class Material
|
||||
{
|
||||
Device *device;
|
||||
Shader *shader;
|
||||
DescriptorSetLayoutCreater *dsl_creater;
|
||||
|
||||
public:
|
||||
|
||||
Material(Shader *s,DescriptorSetLayoutCreater *dslc)
|
||||
Material(Device *dev,Shader *s)
|
||||
{
|
||||
device=dev;
|
||||
shader=s;
|
||||
dsl_creater=dslc;
|
||||
}
|
||||
~Material();
|
||||
|
||||
@ -36,16 +37,12 @@ public:
|
||||
class MaterialInstance
|
||||
{
|
||||
const Material *mat; ///<这里的是对material的完全引用,不做任何修改
|
||||
VertexAttributeBinding *vab; ///<这里的vis是Material中vis的复制体
|
||||
VertexAttributeBinding *vab;
|
||||
DescriptorSetLayoutCreater *dsl_creater;
|
||||
|
||||
public:
|
||||
|
||||
MaterialInstance(Material *m,VertexAttributeBinding *vi)
|
||||
{
|
||||
mat=m;
|
||||
vab=vi;
|
||||
}
|
||||
|
||||
MaterialInstance(Material *m);
|
||||
~MaterialInstance();
|
||||
};//class MaterialInstance
|
||||
VK_NAMESPACE_END
|
||||
|
@ -81,6 +81,14 @@ bool Shader::ParseVertexShader(const void *spv_data,const uint32_t spv_size)
|
||||
++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);
|
||||
}
|
||||
|
||||
|
@ -22,6 +22,7 @@ private:
|
||||
VkVertexInputAttributeDescription *attribute_list;
|
||||
|
||||
Map<UTF8String,VkVertexInputAttributeDescription *> stage_input_locations;
|
||||
Map<UTF8String,int> ubo_list;
|
||||
|
||||
Set<VertexAttributeBinding *> vab_sets;
|
||||
|
||||
@ -61,6 +62,8 @@ public: //shader部分
|
||||
const uint32_t GetStageCount ()const{return shader_stage_list.GetCount();}
|
||||
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部分
|
||||
|
||||
VertexAttributeBinding * CreateVertexAttributeBinding();
|
||||
|
@ -29,10 +29,10 @@ constexpr uint32_t SCREEN_HEIGHT=720;
|
||||
VkShaderModule vs=nullptr;
|
||||
VkShaderModule fs=nullptr;
|
||||
|
||||
struct
|
||||
struct WorldConfig
|
||||
{
|
||||
Matrix4f mvp;
|
||||
}ubo_vs;
|
||||
}world;
|
||||
|
||||
char *LoadFile(const char *filename,uint32_t &file_length)
|
||||
{
|
||||
@ -86,16 +86,16 @@ vulkan::Buffer *CreateUBO(vulkan::Device *dev)
|
||||
{
|
||||
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();
|
||||
|
||||
if(p)
|
||||
{
|
||||
memcpy(p,&ubo_vs,sizeof(ubo_vs));
|
||||
memcpy(p,&world,sizeof(WorldConfig));
|
||||
ubo->Unmap();
|
||||
}
|
||||
|
||||
@ -196,13 +196,13 @@ int main(int,char **)
|
||||
|
||||
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();
|
||||
|
||||
dsl->UpdateUBO(mvp_binding,*ubo);
|
||||
dsl->UpdateUBO(ubo_world_config,*ubo);
|
||||
|
||||
vulkan::PipelineLayout *pl=CreatePipelineLayout(*device,dsl);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user