added MIData at Material
This commit is contained in:
parent
3f1b8be5d0
commit
7c3d9ecf91
@ -1 +1 @@
|
|||||||
Subproject commit 93a4792af52181fdf30f0573e2a5190f61c10b61
|
Subproject commit bc0f03e2ba281ec30a331c3d0490e45797da8b17
|
@ -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)
|
||||||
|
@ -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);}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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_?";
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user