added MIData at Material

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

View File

@@ -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);}