ULRE/example/Vulkan/VKMaterial.h

88 lines
2.7 KiB
C
Raw Normal View History

2019-04-25 10:09:56 +08:00
#ifndef HGL_GRAPH_VULKAN_MATERIAL_INCLUDE
#define HGL_GRAPH_VULKAN_MATERIAL_INCLUDE
#include"VK.h"
#include<hgl/type/Map.h>
#include<hgl/type/BaseString.h>
2019-04-25 10:09:56 +08:00
VK_NAMESPACE_BEGIN
2019-04-27 01:36:58 +08:00
class Device;
class ShaderModule;
class VertexShaderModule;
2019-04-25 10:09:56 +08:00
class DescriptorSetLayoutCreater;
2019-04-27 02:07:06 +08:00
class DescriptorSetLayout;
2019-04-25 10:09:56 +08:00
class MaterialInstance;
class VertexAttributeBinding;
class VertexBuffer;
class Renderable;
class PipelineLayout;
using ShaderModuleMap=hgl::Map<VkShaderStageFlagBits,const ShaderModule *>;
2019-04-25 10:09:56 +08:00
/**
* <br>
* shaderDescriptorSetLayoutCreater
*/
class Material
{
VkDevice device;
ShaderModuleMap *shader_maps;
VertexShaderModule *vertex_sm;
List<VkPipelineShaderStageCreateInfo> shader_stage_list;
2019-04-27 02:07:06 +08:00
DescriptorSetLayoutCreater *dsl_creater;
2019-04-25 10:09:56 +08:00
public:
Material(Device *dev,ShaderModuleMap *smm);
2019-04-25 10:09:56 +08:00
~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();}
2019-04-25 10:09:56 +08:00
};//class Material
/**
* <br>
* Material的情况下UBO/TEXTURE等pipeline
*/
class MaterialInstance
{
VkDevice device;
const Material *mat; ///<这里的是对material的完全引用不做任何修改
const VertexShaderModule *vertex_sm;
2019-04-27 01:36:58 +08:00
VertexAttributeBinding *vab;
2019-04-27 02:07:06 +08:00
DescriptorSetLayout *desc_set_layout;
2019-04-25 10:09:56 +08:00
VkPipelineLayout pipeline_layout;
2019-04-25 10:09:56 +08:00
public:
MaterialInstance(VkDevice dev,const Material *m,const VertexShaderModule *,VertexAttributeBinding *v,DescriptorSetLayout *d,VkPipelineLayout pl);
2019-04-25 10:09:56 +08:00
~MaterialInstance();
bool UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info);
bool UpdateUBO(const UTF8String &name,const VkDescriptorBufferInfo *buf_info)
{
if(name.IsEmpty()||!buf_info)
return(false);
return UpdateUBO(mat->GetUBOBinding(name),buf_info);
}
const uint32_t GetStageCount ()const{return mat->GetStageCount();}
const VkPipelineShaderStageCreateInfo * GetStages ()const{return mat->GetStages();}
void Write(VkPipelineVertexInputStateCreateInfo &vis)const;
const VkPipelineLayout GetPipelineLayout ()const{return pipeline_layout;}
const List<VkDescriptorSet> * GetDescriptorSets ()const;
Renderable *CreateRenderable();
2019-04-25 10:09:56 +08:00
};//class MaterialInstance
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE