ULRE/inc/hgl/graph/VKMaterialInstance.h

83 lines
2.2 KiB
C
Raw Normal View History

2023-02-22 21:50:18 +08:00
#ifndef HGL_GRAPH_VULKAN_MATERIAL_INSTANCE_INCLUDE
#define HGL_GRAPH_VULKAN_MATERIAL_INSTANCE_INCLUDE
2023-02-22 21:50:18 +08:00
#include<hgl/graph/VKMaterial.h>
VK_NAMESPACE_BEGIN
2023-05-08 22:04:00 +08:00
2023-05-09 22:03:02 +08:00
/**
* <summary>
*
* layout(location=?) in uint MaterialInstanceID
2023-05-09 22:03:02 +08:00
*
* #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[(MaterialInstanceID>=MI_MAX_COUNT)?:0:MaterialInstanceID]; //如果超出范围则使用0号材质实例数据
2023-05-09 22:03:02 +08:00
*
* vec4 BaseColor =mi.BaseColor;
* vec4 Emissive =mi.Emissive;
*
* float AO =mi.ARM.x;
* float Roughness =mi.ARM.y;
* float Metallic =mi.ARM.z;
*
* </summary>
2023-05-08 22:04:00 +08:00
*/
/**
2023-05-09 22:03:02 +08:00
* <br>
* RenderList合并成一个大UBO
2023-05-08 22:04:00 +08:00
*/
class MaterialInstance
{
2023-05-09 22:03:02 +08:00
protected:
Material *material;
VIL *vil;
int mi_id;
public:
Material * GetMaterial () {return material;}
const VIL * GetVIL ()const {return vil;}
2023-05-09 22:03:02 +08:00
private:
friend class Material;
MaterialInstance(Material *,VIL *,const int);
public:
virtual ~MaterialInstance()
{
material->ReleaseMI(mi_id);
}
2023-09-19 21:45:28 +08:00
const int GetMIID ()const{return mi_id;} ///<取得材质实例ID
void * GetMIData (){return material->GetMIData(mi_id);} ///<取得材质实例数据
void WriteMIData (const void *data,const int size); ///<写入材质实例数据
template<typename T>
void WriteMIData (const T &data){WriteMIData(&data,sizeof(T));} ///<写入材质实例数据
};//class MaterialInstance
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_MATERIAL_INSTANCE_INCLUDE