diff --git a/inc/hgl/graph/VKMaterialInstance.h b/inc/hgl/graph/VKMaterialInstance.h index 16b7bcab..156c6d90 100644 --- a/inc/hgl/graph/VKMaterialInstance.h +++ b/inc/hgl/graph/VKMaterialInstance.h @@ -4,14 +4,49 @@ #include 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; + +*/ + +/** +* 材质实例类 +*/ class MaterialInstance { Material *material; VIL *vil; - MaterialParameters *mp_per_mi; ///<材质实例独有参数,对应PerMaterial合集 - private: friend class GPUDevice; @@ -25,14 +60,7 @@ public: Material *GetMaterial(){return material;} const VIL *GetVIL()const{return vil;} - MaterialParameters *GetMP(){return mp_per_mi;} - MaterialParameters *GetMP(const DescriptorSetType &type) - { - if(type==DescriptorSetType::PerMaterial) - return mp_per_mi; - else - return material->GetMP(type); - } + MaterialParameters *GetMP(const DescriptorSetType &type){return material->GetMP(type);} bool BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic=false); bool BindSSBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic=false); diff --git a/src/SceneGraph/Vulkan/VKMaterialInstance.cpp b/src/SceneGraph/Vulkan/VKMaterialInstance.cpp index cc9fa7a8..82556b41 100644 --- a/src/SceneGraph/Vulkan/VKMaterialInstance.cpp +++ b/src/SceneGraph/Vulkan/VKMaterialInstance.cpp @@ -20,14 +20,6 @@ MaterialInstance::MaterialInstance(Material *mtl,VIL *v) material=mtl; vil=v; - - mp_per_mi=mtl->GetMP(DescriptorSetType::PerMaterial); - - /* - 由于PerMaterial的属性每个MaterialInstance不一样, - 所以理论上需要在这里分配属于它自己的MP做绑定记录 - - */ } bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic)