added MIData at Material
This commit is contained in:
@@ -27,6 +27,9 @@ struct MaterialData
|
||||
|
||||
MaterialParameterArray mp_array;
|
||||
|
||||
uint8 *mi_data; ///<材质实例数据区
|
||||
uint32_t mi_size; ///<单个材质实例数据长度
|
||||
|
||||
private:
|
||||
|
||||
friend class Material;
|
||||
@@ -42,6 +45,8 @@ class Material
|
||||
{
|
||||
MaterialData *data;
|
||||
|
||||
uint32_t mi_count; ///<材质数量
|
||||
|
||||
private:
|
||||
|
||||
friend GPUDevice;
|
||||
@@ -50,8 +55,8 @@ private:
|
||||
|
||||
public:
|
||||
|
||||
Material(MaterialData *md):data(md){}
|
||||
~Material();
|
||||
Material(MaterialData *);
|
||||
virtual ~Material();
|
||||
|
||||
const UTF8String & GetName ()const{return data->name;}
|
||||
|
||||
@@ -63,6 +68,25 @@ public:
|
||||
const VkPipelineLayout GetPipelineLayout ()const;
|
||||
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:
|
||||
|
||||
MaterialParameters * GetMP (const DescriptorSetType &type)
|
||||
|
@@ -5,48 +5,53 @@
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
|
||||
/*
|
||||
layout(location=0) in vec4 Position;
|
||||
layout(location=1) in vec3 Normal;
|
||||
|
||||
layout(location=?) in uint MaterialID
|
||||
|
||||
#define MI_MAX_COUNT ??? //该值由引擎根据 UBORange/sizeof(MaterialInstance) 计算出来
|
||||
|
||||
struct MaterialInstance //这部分数据,即为材质实例的具体数据,每一个材质实例类负责提供具体数据。由RenderList合并成一整个UBO
|
||||
{
|
||||
vec4 BaseColor;
|
||||
vec4 Emissive;
|
||||
vec4 ARM;
|
||||
};
|
||||
|
||||
layout(set=?,binding=?) uniform Material
|
||||
{
|
||||
MaterialInstance mi[MI_MAX_COUNT]
|
||||
}mtl;
|
||||
|
||||
void main()
|
||||
{
|
||||
MaterialInstance mi=mtl.mi[(MaterialID>=MI_MAX_COUNT)?:0:MaterialID]; //如果超出范围则使用0号材质实例数据
|
||||
|
||||
vec4 BaseColor =mi.BaseColor;
|
||||
vec4 Emissive =mi.Emissive;
|
||||
|
||||
float AO =mi.ARM.x;
|
||||
float Roughness =mi.ARM.y;
|
||||
float Metallic =mi.ARM.z;
|
||||
|
||||
/**
|
||||
* <summary>
|
||||
*
|
||||
* layout(location=?) in uint MaterialID
|
||||
*
|
||||
* #define MI_MAX_COUNT ??? //该值由引擎根据 UBORange/sizeof(MaterialInstance) 计算出来
|
||||
*
|
||||
* struct MaterialInstance //这部分数据,即为材质实例的具体数据,每一个材质实例类负责提供具体数据。由RenderList合并成一整个UBO
|
||||
* { //该类数据,由DescriptorSetType为PerMaterial的参数构成
|
||||
* vec4 BaseColor;
|
||||
* vec4 Emissive;
|
||||
* vec4 ARM;
|
||||
* };
|
||||
*
|
||||
* layout(set=?,binding=?) uniform Material
|
||||
* {
|
||||
* MaterialInstance mi[MI_MAX_COUNT]
|
||||
* }mtl;
|
||||
*
|
||||
* void main()
|
||||
* {
|
||||
* MaterialInstance mi=mtl.mi[(MaterialID>=MI_MAX_COUNT)?:0:MaterialID]; //如果超出范围则使用0号材质实例数据
|
||||
*
|
||||
* vec4 BaseColor =mi.BaseColor;
|
||||
* vec4 Emissive =mi.Emissive;
|
||||
*
|
||||
* float AO =mi.ARM.x;
|
||||
* float Roughness =mi.ARM.y;
|
||||
* float Metallic =mi.ARM.z;
|
||||
*
|
||||
* </summary>
|
||||
*/
|
||||
|
||||
/**
|
||||
* 材质实例类
|
||||
* 材质实例类<br>
|
||||
* 材质实例类本质只是提供一个数据区,供RenderList合并成一个大UBO。
|
||||
*/
|
||||
class MaterialInstance
|
||||
{
|
||||
protected:
|
||||
|
||||
Material *material;
|
||||
|
||||
VIL *vil;
|
||||
|
||||
uint8 mi_id; //材质实例ID
|
||||
|
||||
private:
|
||||
|
||||
friend class GPUDevice;
|
||||
@@ -59,6 +64,14 @@ public:
|
||||
|
||||
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;}
|
||||
MaterialParameters *GetMP(const DescriptorSetType &type){return material->GetMP(type);}
|
||||
|
||||
|
@@ -57,6 +57,16 @@ vec3 world_up;
|
||||
float znear,zfar;)"
|
||||
};
|
||||
|
||||
constexpr const ShaderBufferSource SBS_BoneInfo=
|
||||
{
|
||||
"BoneInfo",
|
||||
"bone",
|
||||
|
||||
R"(
|
||||
mat4 bone_mats[];
|
||||
)"
|
||||
};
|
||||
|
||||
namespace func
|
||||
{
|
||||
constexpr const char GetLocalToWorld[]=R"(
|
||||
@@ -67,6 +77,16 @@ mat4 GetLocalToWorld()
|
||||
LocalToWorld_2,
|
||||
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
|
||||
STD_MTL_NAMESPACE_END
|
||||
|
Reference in New Issue
Block a user