few about MaterialInstance

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-06-05 21:39:12 +08:00
parent 9d3ea89861
commit ffaa6b5362
9 changed files with 52 additions and 37 deletions

View File

@ -23,11 +23,14 @@ constexpr float position_data[VERTEX_COUNT*2]=
0.1, 0.9 0.1, 0.9
}; };
constexpr float color_data[3][4]= constexpr float color_data[6][4]=
{ {
{1,0,0,1}, {1,0,0,1},
{1,1,0,1},
{0,1,0,1}, {0,1,0,1},
{0,0,1,1} {0,1,1,1},
{0,0,1,1},
{1,0,1,1},
}; };
class TestApp:public VulkanApplicationFramework class TestApp:public VulkanApplicationFramework
@ -37,8 +40,8 @@ private:
SceneNode render_root; SceneNode render_root;
RenderList * render_list =nullptr; RenderList * render_list =nullptr;
MaterialInstance * material_instance =nullptr; MaterialInstance * material_instance[6]={nullptr,nullptr,nullptr,nullptr,nullptr,nullptr};
Renderable * render_obj =nullptr; Renderable * render_obj[6] ={nullptr,nullptr,nullptr,nullptr,nullptr,nullptr};
Pipeline * pipeline =nullptr; Pipeline * pipeline =nullptr;
@ -54,36 +57,42 @@ private:
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreatePureColor2D(&cfg); AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreatePureColor2D(&cfg);
material_instance=db->CreateMaterialInstance(mci); /* for(uint i=0;i<6;i++)
{
material_instance[i]=db->CreateMaterialInstance(mci);
if(!material_instance[i])
return(false);
material_instance[i]->SetFloat4(0,color_data[i]);
}*/
} }
if(!material_instance)
return(false);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行为Framework重载默认使用swapchain的render target // pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline; return pipeline;
} }
bool InitVBO() bool InitVBO()
{ {
RenderablePrimitiveCreater rpc(db,VERTEX_COUNT); //RenderablePrimitiveCreater rpc(db,VERTEX_COUNT);
if(!rpc.SetVBO(VAN::Position, VF_V2F, position_data))return(false); //if(!rpc.SetVBO(VAN::Position, VF_V2F, position_data))return(false);
if(!rpc.SetVBO(VAN::Color, VF_V4F, color_data ))return(false); //
//render_obj=rpc.Create(material_instance,pipeline);
render_obj=rpc.Create(material_instance,pipeline); //if(!render_obj)
// return(false);
//
//for(uint i=0;i<6;i++)
//{
// render_root.CreateSubNode(rotate(deg2rad(60*i),Vector3f(0,0,1)),render_obj);
//}
if(!render_obj) //render_root.RefreshMatrix();
return(false);
for(uint i=0;i<12;i++) //render_list->Expend(&render_root);
render_root.CreateSubNode(rotate(deg2rad(30*i),Vector3f(0,0,1)),render_obj);
render_root.RefreshMatrix();
render_list->Expend(&render_root);
return(true); return(true);
} }

View File

@ -9,7 +9,7 @@ namespace hgl
{ {
class DeviceBuffer; class DeviceBuffer;
class Texture; class Texture;
class MaterialInstance; class Material;
class DescriptorBinding class DescriptorBinding
{ {
@ -92,7 +92,7 @@ namespace hgl
texture_map.DeleteByValue(tex); texture_map.DeleteByValue(tex);
} }
bool Bind(MaterialInstance *); bool Bind(Material *);
};//class DescriptorBinding };//class DescriptorBinding
}//namespace graph }//namespace graph
}//namespace hgl }//namespace hgl

View File

@ -4,13 +4,12 @@
#include<hgl/graph/VK.h> #include<hgl/graph/VK.h>
#include<hgl/type/Map.h> #include<hgl/type/Map.h>
#include<hgl/type/String.h> #include<hgl/type/String.h>
#include<hgl/type/Collection.h>
#include<hgl/graph/VKShaderModuleMap.h> #include<hgl/graph/VKShaderModuleMap.h>
#include<hgl/graph/VKDescriptorSetType.h> #include<hgl/graph/VKDescriptorSetType.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
using ShaderStageCreateInfoList=List<VkPipelineShaderStageCreateInfo>; using ShaderStageCreateInfoList=List<VkPipelineShaderStageCreateInfo>;
using MaterialParameterArray=MaterialParameters *[DESCRIPTOR_SET_TYPE_COUNT];
struct MaterialData struct MaterialData
{ {
UTF8String name; UTF8String name;
@ -25,7 +24,9 @@ struct MaterialData
PipelineLayoutData *pipeline_layout_data; PipelineLayoutData *pipeline_layout_data;
MaterialParameterArray mp_array; MaterialParameters *mp_array[DESCRIPTOR_SET_TYPE_COUNT];
uint32_t mi_data_bytes;
private: private:
@ -42,6 +43,8 @@ class Material
{ {
MaterialData *data; MaterialData *data;
Collection *mi_data;
private: private:
friend GPUDevice; friend GPUDevice;

View File

@ -50,6 +50,8 @@ protected:
VIL *vil; VIL *vil;
public: public:
Material * GetMaterial () {return material;} Material * GetMaterial () {return material;}

View File

@ -75,8 +75,6 @@ public:
const AABB & GetBoundingBox ()const{return primitive->GetBoundingBox();} const AABB & GetBoundingBox ()const{return primitive->GetBoundingBox();}
const VertexInputData * GetVertexInputData ()const{return vertex_input;} const VertexInputData * GetVertexInputData ()const{return vertex_input;}
MaterialParameters *GetMP (const DescriptorSetType &type){return mat_inst->GetMP(type);}
};//class Renderable };//class Renderable
Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *); Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *);

View File

@ -109,11 +109,12 @@ bool RenderCmdBuffer::BindDescriptorSets(Renderable *ri)
uint32_t count=0; uint32_t count=0;
MaterialParameters *mp; MaterialParameters *mp;
Material *mtl=ri->GetMaterial();
VkDescriptorSet ds[DESCRIPTOR_SET_TYPE_COUNT]; VkDescriptorSet ds[DESCRIPTOR_SET_TYPE_COUNT];
ENUM_CLASS_FOR(DescriptorSetType,int,i) ENUM_CLASS_FOR(DescriptorSetType,int,i)
{ {
mp=ri->GetMP((DescriptorSetType)i); mp=mtl->GetMP((DescriptorSetType)i);
if(mp) if(mp)
{ {

View File

@ -3,12 +3,12 @@
#include<hgl/graph/VKMaterialInstance.h> #include<hgl/graph/VKMaterialInstance.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
bool DescriptorBinding::Bind(MaterialInstance *mi) bool DescriptorBinding::Bind(Material *mtl)
{ {
if(!mi) if(!mtl)
return(false); return(false);
MaterialParameters *mp=mi->GetMP(set_type); MaterialParameters *mp=mtl->GetMP(set_type);
if(!mp) if(!mp)
return(false); return(false);

View File

@ -22,7 +22,7 @@ MaterialInstance::MaterialInstance(Material *mtl,VIL *v)
bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic) bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic)
{ {
MaterialParameters *mp=GetMP(type); MaterialParameters *mp=material->GetMP(type);
if(!mp) if(!mp)
return(false); return(false);
@ -35,7 +35,7 @@ bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &n
bool MaterialInstance::BindSSBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic) bool MaterialInstance::BindSSBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic)
{ {
MaterialParameters *mp=GetMP(type); MaterialParameters *mp=material->GetMP(type);
if(!mp) if(!mp)
return(false); return(false);
@ -48,7 +48,7 @@ bool MaterialInstance::BindSSBO(const DescriptorSetType &type,const AnsiString &
bool MaterialInstance::BindImageSampler(const DescriptorSetType &type,const AnsiString &name,Texture *tex,Sampler *sampler) bool MaterialInstance::BindImageSampler(const DescriptorSetType &type,const AnsiString &name,Texture *tex,Sampler *sampler)
{ {
MaterialParameters *mp=GetMP(type); MaterialParameters *mp=material->GetMP(type);
if(!mp) if(!mp)
return(false); return(false);

View File

@ -141,8 +141,10 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &glsl_codes,const
if(data_bytes>0) if(data_bytes>0)
mi_codes=glsl_codes; mi_codes=glsl_codes;
const uint32_t ubo_range=config->dev_attr->physical_device->GetUBORange(); const uint32_t ubo_range=config->dev_attr->physical_device->GetUBORange(); //小部分为16k大部分为64kIntel核显为128MAMD显卡无限制
AnsiString MI_MAX_COUNT=AnsiString::numberOf(ubo_range/data_bytes); const uint32_t mi_max_count=ubo_range/data_bytes;
const AnsiString MI_MAX_COUNT=AnsiString::numberOf(mi_max_count>256?256:mi_max_count); //我们使用uint8传递材质实例ID所以最大数量为256。未来如考虑使用更多需综合考虑
mdi.AddStruct(MaterialInstanceStruct,mi_codes); mdi.AddStruct(MaterialInstanceStruct,mi_codes);
mdi.AddStruct(SBS_MaterialInstanceData); mdi.AddStruct(SBS_MaterialInstanceData);