added MIData at Material

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-05-09 22:03:02 +08:00
parent 3f1b8be5d0
commit 7c3d9ecf91
8 changed files with 153 additions and 49 deletions

@ -1 +1 @@
Subproject commit 93a4792af52181fdf30f0573e2a5190f61c10b61 Subproject commit bc0f03e2ba281ec30a331c3d0490e45797da8b17

View File

@ -27,6 +27,9 @@ struct MaterialData
MaterialParameterArray mp_array; MaterialParameterArray mp_array;
uint8 *mi_data; ///<材质实例数据区
uint32_t mi_size; ///<单个材质实例数据长度
private: private:
friend class Material; friend class Material;
@ -42,6 +45,8 @@ class Material
{ {
MaterialData *data; MaterialData *data;
uint32_t mi_count; ///<材质数量
private: private:
friend GPUDevice; friend GPUDevice;
@ -50,8 +55,8 @@ private:
public: public:
Material(MaterialData *md):data(md){} Material(MaterialData *);
~Material(); virtual ~Material();
const UTF8String & GetName ()const{return data->name;} const UTF8String & GetName ()const{return data->name;}
@ -63,6 +68,25 @@ public:
const VkPipelineLayout GetPipelineLayout ()const; const VkPipelineLayout GetPipelineLayout ()const;
const PipelineLayoutData * GetPipelineLayoutData ()const{return data->pipeline_layout_data;} const PipelineLayoutData * GetPipelineLayoutData ()const{return data->pipeline_layout_data;}
public:
const uint32_t GetMICount ()const{return mi_count;}
const uint32_t GetMISize ()const{return mi_size;}
const void * GetMIData ()const{return data->mi_data;}
template<typename T>
T * GetMIData (const uint32_t index)const{return data->mi_data?(T *)(data->mi_data+index*mi_size):nullptr;}
template<typename T>
bool WriteMIData (const uint32_t index,const T *data)
{
if(!data->mi_data)return(false);
if(index>=mi_count)return(false);
memcpy(mi_data+index*mi_size,data,mi_size);
return(true);
}
public: public:
MaterialParameters * GetMP (const DescriptorSetType &type) MaterialParameters * GetMP (const DescriptorSetType &type)

View File

@ -5,48 +5,53 @@
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
/* /**
layout(location=0) in vec4 Position; * <summary>
layout(location=1) in vec3 Normal; *
* layout(location=?) in uint MaterialID
layout(location=?) in uint MaterialID *
* #define MI_MAX_COUNT ??? //该值由引擎根据 UBORange/sizeof(MaterialInstance) 计算出来
#define MI_MAX_COUNT ??? //该值由引擎根据 UBORange/sizeof(MaterialInstance) 计算出来 *
* struct MaterialInstance //这部分数据即为材质实例的具体数据每一个材质实例类负责提供具体数据。由RenderList合并成一整个UBO
struct MaterialInstance //这部分数据即为材质实例的具体数据每一个材质实例类负责提供具体数据。由RenderList合并成一整个UBO * { //该类数据由DescriptorSetType为PerMaterial的参数构成
{ * vec4 BaseColor;
vec4 BaseColor; * vec4 Emissive;
vec4 Emissive; * vec4 ARM;
vec4 ARM; * };
}; *
* layout(set=?,binding=?) uniform Material
layout(set=?,binding=?) uniform Material * {
{ * MaterialInstance mi[MI_MAX_COUNT]
MaterialInstance mi[MI_MAX_COUNT] * }mtl;
}mtl; *
* void main()
void main() * {
{ * MaterialInstance mi=mtl.mi[(MaterialID>=MI_MAX_COUNT)?:0:MaterialID]; //如果超出范围则使用0号材质实例数据
MaterialInstance mi=mtl.mi[(MaterialID>=MI_MAX_COUNT)?:0:MaterialID]; //如果超出范围则使用0号材质实例数据 *
* vec4 BaseColor =mi.BaseColor;
vec4 BaseColor =mi.BaseColor; * vec4 Emissive =mi.Emissive;
vec4 Emissive =mi.Emissive; *
* float AO =mi.ARM.x;
float AO =mi.ARM.x; * float Roughness =mi.ARM.y;
float Roughness =mi.ARM.y; * float Metallic =mi.ARM.z;
float Metallic =mi.ARM.z; *
* </summary>
*/ */
/** /**
* * <br>
* RenderList合并成一个大UBO
*/ */
class MaterialInstance class MaterialInstance
{ {
protected:
Material *material; Material *material;
VIL *vil; VIL *vil;
uint8 mi_id; //材质实例ID
private: private:
friend class GPUDevice; friend class GPUDevice;
@ -59,6 +64,14 @@ public:
Material *GetMaterial(){return material;} Material *GetMaterial(){return material;}
const uint8_t GetID()const{return mi_id;} ///<获取材质实例ID
template<typename T>
T *GetData(){return material->GetMIData<T>(mi_id);} ///<获取材质实例数据
template<typename T>
bool WriteData(const T *data){return material->WriteMIData(mi_id,data);} ///<写入材质实例数据
const VIL *GetVIL()const{return vil;} const VIL *GetVIL()const{return vil;}
MaterialParameters *GetMP(const DescriptorSetType &type){return material->GetMP(type);} MaterialParameters *GetMP(const DescriptorSetType &type){return material->GetMP(type);}

View File

@ -57,6 +57,16 @@ vec3 world_up;
float znear,zfar;)" float znear,zfar;)"
}; };
constexpr const ShaderBufferSource SBS_BoneInfo=
{
"BoneInfo",
"bone",
R"(
mat4 bone_mats[];
)"
};
namespace func namespace func
{ {
constexpr const char GetLocalToWorld[]=R"( constexpr const char GetLocalToWorld[]=R"(
@ -67,6 +77,16 @@ mat4 GetLocalToWorld()
LocalToWorld_2, LocalToWorld_2,
LocalToWorld_3); LocalToWorld_3);
} }
)";
constexpr const char GetBoneMatrix[]=R"(
mat4 GetBoneMatrix()
{
return bone_mats[BoneID.x]*BoneWeight.x+
bone_mats[BoneID.y]*BoneWeight.y+
bone_mats[BoneID.z]*BoneWeight.z+
bone_mats[BoneID.w]*BoneWeight.w;
}
)"; )";
}//namespace func }//namespace func
STD_MTL_NAMESPACE_END STD_MTL_NAMESPACE_END

View File

@ -21,23 +21,23 @@ namespace hgl
void AddMaterialID() void AddMaterialID()
{ {
VAT vat{VertexAttribType::BaseType::UInt,1}; //使用uint16 constexpr const VAT vat{VertexAttribType::BaseType::UInt,1}; //使用uint8
AddInput(vat,VAN::MaterialID,VK_VERTEX_INPUT_RATE_VERTEX,VertexInputGroup::Material); AddInput(vat,VAN::MaterialID,VK_VERTEX_INPUT_RATE_VERTEX,VertexInputGroup::MaterialID);
} }
void AddBone() void AddBone()
{ {
VAT id {VertexAttribType::BaseType::UInt,4}; //使用uint8[4] constexpr const VAT id {VertexAttribType::BaseType::UInt,4}; //使用uint8[4]
VAT weight {VertexAttribType::BaseType::Float,4}; //使用uint8[4] constexpr const VAT weight {VertexAttribType::BaseType::Float,4}; //使用uint8[4]
AddInput(id, VAN::BoneID, VK_VERTEX_INPUT_RATE_VERTEX,VertexInputGroup::Bone); AddInput(id, VAN::BoneID, VK_VERTEX_INPUT_RATE_VERTEX,VertexInputGroup::BoneID);
AddInput(weight,VAN::BoneWeight,VK_VERTEX_INPUT_RATE_VERTEX,VertexInputGroup::Bone); AddInput(weight,VAN::BoneWeight,VK_VERTEX_INPUT_RATE_VERTEX,VertexInputGroup::BoneWeight);
} }
void AddLocalToWorld() void AddLocalToWorld()
{ {
VAT vat{VertexAttribType::BaseType::Float,4}; //使用float[4] constexpr const VAT vat{VertexAttribType::BaseType::Float,4}; //使用float[4]
char name[]= "LocalToWorld_?"; char name[]= "LocalToWorld_?";

View File

@ -65,6 +65,12 @@ namespace hgl
{ {
uint count; uint count;
VBO *mi_id;
VkBuffer *mi_id_buffer;
VBO *bone_id,*bone_weight;
VkBuffer bone_id_buffer,bone_weight_buffer;
VBO *l2w_vbo[4]; VBO *l2w_vbo[4];
VkBuffer l2w_buffer[4]; VkBuffer l2w_buffer[4];
@ -82,6 +88,11 @@ namespace hgl
void Clear() void Clear()
{ {
SAFE_CLEAR(mi_id)
SAFE_CLEAR(bone_id)
SAFE_CLEAR(bone_weight)
SAFE_CLEAR(l2w_vbo[0]) SAFE_CLEAR(l2w_vbo[0])
SAFE_CLEAR(l2w_vbo[1]) SAFE_CLEAR(l2w_vbo[1])
SAFE_CLEAR(l2w_vbo[2]) SAFE_CLEAR(l2w_vbo[2])
@ -262,7 +273,7 @@ namespace hgl
if(count<binding_count) //材质组 if(count<binding_count) //材质组
{ {
const uint mtl_binding_count=vil->GetCount(VertexInputGroup::Material); const uint mtl_binding_count=vil->GetCount(VertexInputGroup::MaterialID);
if(mtl_binding_count>0) if(mtl_binding_count>0)
{ {
@ -275,14 +286,29 @@ namespace hgl
if(count<binding_count) //Bone组暂未支持 if(count<binding_count) //Bone组暂未支持
{ {
const uint bone_binding_count=vil->GetCount(VertexInputGroup::Bone); const uint boneId_binding_count=vil->GetCount(VertexInputGroup::BoneID);
if(bone_binding_count>0) //有骨骼矩阵信息 if(boneId_binding_count>0) //有骨骼矩阵信息
{ {
if(bone_binding_count!=2) //只有BoneID/BondWeight不是2的话根本就不对 count+=boneId_binding_count;
return(false);
count+=bone_binding_count; if(count<binding_count) //BoneWeight组
{
const uint boneWeight_binding_count=vil->GetCount(VertexInputGroup::BoneWeight);
if(boneWeight_binding_count!=1)
{
++count;
}
else //BoneWieght不为1是个bug除非未来支持8骨骼权重
{
return(false);
}
}
else //有BoneID没有BoneWeight? 这是个BUG
{
return(false);
}
} }
} }

View File

@ -117,6 +117,19 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *
else else
hgl_zero(data->mp_array); hgl_zero(data->mp_array);
const VkDeviceSize ubo_range=this->GetUBORange();
if(desc_manager->hasSet(DescriptorSetType::PerMaterial))
{
data->mi_data=new uint8[ubo_range];
data->mi_size
}
else
{
data->mi_data=nullptr;
data->mi_size=0;
}
return(new Material(data)); return(new Material(data));
} }
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -16,8 +16,16 @@ MaterialData::~MaterialData()
delete vertex_input; delete vertex_input;
} }
Material::Material(MaterialData *md):data(md)
{
mi_size=0;
mi_count=0;
}
Material::~Material() Material::~Material()
{ {
delete[] data->mi_data;
delete data->pipeline_layout_data; delete data->pipeline_layout_data;
delete data; delete data;
} }