2019-04-25 10:09:56 +08:00
|
|
|
|
#ifndef HGL_GRAPH_VULKAN_MATERIAL_INCLUDE
|
|
|
|
|
#define HGL_GRAPH_VULKAN_MATERIAL_INCLUDE
|
|
|
|
|
|
2020-10-21 11:43:18 +08:00
|
|
|
|
#include<hgl/graph/VK.h>
|
2019-04-28 16:06:53 +08:00
|
|
|
|
#include<hgl/type/Map.h>
|
2020-09-05 17:54:21 +08:00
|
|
|
|
#include<hgl/type/String.h>
|
2020-10-21 11:43:18 +08:00
|
|
|
|
#include<hgl/graph/VKShaderModuleMap.h>
|
2023-03-02 20:19:25 +08:00
|
|
|
|
#include<hgl/graph/VKDescriptorSetType.h>
|
2023-09-19 21:09:09 +08:00
|
|
|
|
|
|
|
|
|
namespace hgl
|
|
|
|
|
{
|
|
|
|
|
class ActiveMemoryBlockManager;
|
|
|
|
|
}
|
2019-04-25 10:09:56 +08:00
|
|
|
|
VK_NAMESPACE_BEGIN
|
2021-11-29 17:31:15 +08:00
|
|
|
|
using ShaderStageCreateInfoList=List<VkPipelineShaderStageCreateInfo>;
|
|
|
|
|
|
2023-06-14 18:20:23 +08:00
|
|
|
|
/**
|
|
|
|
|
* 材质类<br>
|
|
|
|
|
* 用于管理shader,提供DescriptorSetLayoutCreater
|
|
|
|
|
*/
|
|
|
|
|
class Material
|
2019-04-25 10:09:56 +08:00
|
|
|
|
{
|
2023-06-14 16:49:19 +08:00
|
|
|
|
AnsiString name;
|
2021-05-10 15:19:16 +08:00
|
|
|
|
|
2024-05-28 02:21:33 +08:00
|
|
|
|
VertexInput *vertex_input;
|
2023-03-19 19:41:21 +08:00
|
|
|
|
|
2019-04-28 16:06:53 +08:00
|
|
|
|
ShaderModuleMap *shader_maps;
|
2021-09-13 20:39:25 +08:00
|
|
|
|
|
2023-03-21 21:46:16 +08:00
|
|
|
|
MaterialDescriptorManager *desc_manager;
|
2021-09-14 20:31:15 +08:00
|
|
|
|
|
2021-11-29 17:31:15 +08:00
|
|
|
|
ShaderStageCreateInfoList shader_stage_list;
|
2019-05-05 21:30:55 +08:00
|
|
|
|
|
2021-09-14 20:31:15 +08:00
|
|
|
|
PipelineLayoutData *pipeline_layout_data;
|
2019-05-05 21:30:55 +08:00
|
|
|
|
|
2023-06-05 21:39:12 +08:00
|
|
|
|
MaterialParameters *mp_array[DESCRIPTOR_SET_TYPE_COUNT];
|
|
|
|
|
|
2023-06-14 16:49:19 +08:00
|
|
|
|
uint32_t mi_data_bytes; ///<实例数据大小
|
2023-09-19 21:44:48 +08:00
|
|
|
|
uint32_t mi_max_count; ///<实例一次渲染最大数量限制
|
2023-09-19 21:09:09 +08:00
|
|
|
|
|
|
|
|
|
ActiveMemoryBlockManager *mi_data_manager;
|
2021-06-15 21:20:57 +08:00
|
|
|
|
|
2021-09-14 20:31:15 +08:00
|
|
|
|
private:
|
|
|
|
|
|
2023-06-14 18:20:23 +08:00
|
|
|
|
friend class RenderResource;
|
2021-09-14 20:31:15 +08:00
|
|
|
|
|
2023-09-19 21:09:09 +08:00
|
|
|
|
Material(const AnsiString &);
|
|
|
|
|
|
2019-04-25 10:09:56 +08:00
|
|
|
|
public:
|
|
|
|
|
|
2023-05-09 22:03:02 +08:00
|
|
|
|
virtual ~Material();
|
2019-04-25 10:09:56 +08:00
|
|
|
|
|
2024-03-10 00:35:35 +08:00
|
|
|
|
const AnsiString & GetName ()const{return name;}
|
2021-05-10 15:19:16 +08:00
|
|
|
|
|
2024-05-28 02:21:33 +08:00
|
|
|
|
const VertexInput * GetVertexInput ()const{return vertex_input;}
|
2019-04-28 16:06:53 +08:00
|
|
|
|
|
2023-06-14 18:20:23 +08:00
|
|
|
|
const ShaderStageCreateInfoList & GetStageList ()const{return shader_stage_list;}
|
2019-04-28 16:06:53 +08:00
|
|
|
|
|
2024-03-10 00:35:35 +08:00
|
|
|
|
// const MaterialDescriptorManager * GetDescriptorManager ()const{return desc_manager;}
|
2020-09-20 03:15:50 +08:00
|
|
|
|
const VkPipelineLayout GetPipelineLayout ()const;
|
2024-03-10 00:35:35 +08:00
|
|
|
|
// const PipelineLayoutData * GetPipelineLayoutData ()const{return pipeline_layout_data;}
|
2019-04-28 17:02:38 +08:00
|
|
|
|
|
2020-09-20 03:15:50 +08:00
|
|
|
|
public:
|
2019-04-28 16:06:53 +08:00
|
|
|
|
|
2023-02-22 21:53:51 +08:00
|
|
|
|
MaterialParameters * GetMP (const DescriptorSetType &type)
|
2021-06-16 11:43:19 +08:00
|
|
|
|
{
|
2023-02-22 21:50:18 +08:00
|
|
|
|
RANGE_CHECK_RETURN_NULLPTR(type)
|
|
|
|
|
|
2023-06-14 18:20:23 +08:00
|
|
|
|
return mp_array[size_t(type)];
|
2021-06-16 11:43:19 +08:00
|
|
|
|
}
|
2023-02-22 21:50:18 +08:00
|
|
|
|
|
2023-02-22 21:53:51 +08:00
|
|
|
|
const bool hasSet (const DescriptorSetType &type)const;
|
2023-03-19 19:41:21 +08:00
|
|
|
|
|
2023-09-20 21:53:30 +08:00
|
|
|
|
const VIL * GetDefaultVIL()const;
|
2023-03-19 19:41:21 +08:00
|
|
|
|
VIL * CreateVIL(const VILConfig *format_map=nullptr);
|
|
|
|
|
bool Release(VIL *);
|
|
|
|
|
const uint GetVILCount();
|
2023-06-05 20:17:16 +08:00
|
|
|
|
|
2023-09-25 21:49:35 +08:00
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
bool BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic=false);
|
|
|
|
|
bool BindSSBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic=false);
|
|
|
|
|
bool BindImageSampler(const DescriptorSetType &type,const AnsiString &name,Texture *tex,Sampler *sampler);
|
|
|
|
|
|
2023-10-12 01:40:59 +08:00
|
|
|
|
void Update();
|
|
|
|
|
|
2023-06-05 20:17:16 +08:00
|
|
|
|
public:
|
|
|
|
|
|
2023-09-20 21:53:30 +08:00
|
|
|
|
const bool HasMI ()const{return mi_data_bytes>0;}
|
2023-09-19 22:04:34 +08:00
|
|
|
|
const uint32_t GetMIDataBytes ()const{return mi_data_bytes;}
|
|
|
|
|
const uint32_t GetMIMaxCount ()const{return mi_max_count;}
|
2023-09-19 21:09:09 +08:00
|
|
|
|
|
|
|
|
|
void ReleaseMI(int); ///<释放材质实例
|
|
|
|
|
void *GetMIData(int); ///<取得指定ID号的材质实例数据访问指针
|
2023-09-07 18:09:31 +08:00
|
|
|
|
|
2023-06-05 20:17:16 +08:00
|
|
|
|
MaterialInstance *CreateMI(const VILConfig *vil_cfg=nullptr);
|
2019-04-28 21:25:52 +08:00
|
|
|
|
};//class Material
|
2023-03-24 22:14:43 +08:00
|
|
|
|
|
|
|
|
|
using MaterialSets=SortedSets<Material *>;
|
2019-04-25 10:09:56 +08:00
|
|
|
|
VK_NAMESPACE_END
|
|
|
|
|
#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE
|