diff --git a/example/Vulkan/fourth_triangle.cpp b/example/Vulkan/fourth_triangle.cpp index ed178f20..794a7aad 100644 --- a/example/Vulkan/fourth_triangle.cpp +++ b/example/Vulkan/fourth_triangle.cpp @@ -23,11 +23,14 @@ constexpr float position_data[VERTEX_COUNT*2]= 0.1, 0.9 }; -constexpr float color_data[3][4]= +constexpr float color_data[6][4]= { {1,0,0,1}, + {1,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 @@ -37,8 +40,8 @@ private: SceneNode render_root; RenderList * render_list =nullptr; - MaterialInstance * material_instance =nullptr; - Renderable * render_obj =nullptr; + MaterialInstance * material_instance[6]={nullptr,nullptr,nullptr,nullptr,nullptr,nullptr}; + Renderable * render_obj[6] ={nullptr,nullptr,nullptr,nullptr,nullptr,nullptr}; Pipeline * pipeline =nullptr; @@ -54,36 +57,42 @@ private: AutoDelete 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) - return(false); + if(!material_instance[i]) + return(false); + + material_instance[i]->SetFloat4(0,color_data[i]); + }*/ + } // 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; } 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::Color, VF_V4F, color_data ))return(false); - - render_obj=rpc.Create(material_instance,pipeline); + //if(!rpc.SetVBO(VAN::Position, VF_V2F, position_data))return(false); + // + //render_obj=rpc.Create(material_instance,pipeline); - if(!render_obj) - return(false); - - for(uint i=0;i<12;i++) - render_root.CreateSubNode(rotate(deg2rad(30*i),Vector3f(0,0,1)),render_obj); + //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); + //} - render_root.RefreshMatrix(); + //render_root.RefreshMatrix(); - render_list->Expend(&render_root); + //render_list->Expend(&render_root); return(true); } diff --git a/inc/hgl/graph/VKDescriptorBindingManage.h b/inc/hgl/graph/VKDescriptorBindingManage.h index 086ffd29..e7386b8f 100644 --- a/inc/hgl/graph/VKDescriptorBindingManage.h +++ b/inc/hgl/graph/VKDescriptorBindingManage.h @@ -9,7 +9,7 @@ namespace hgl { class DeviceBuffer; class Texture; - class MaterialInstance; + class Material; class DescriptorBinding { @@ -92,7 +92,7 @@ namespace hgl texture_map.DeleteByValue(tex); } - bool Bind(MaterialInstance *); + bool Bind(Material *); };//class DescriptorBinding }//namespace graph }//namespace hgl diff --git a/inc/hgl/graph/VKMaterial.h b/inc/hgl/graph/VKMaterial.h index 7e77ea9f..6e2284b0 100644 --- a/inc/hgl/graph/VKMaterial.h +++ b/inc/hgl/graph/VKMaterial.h @@ -4,13 +4,12 @@ #include #include #include +#include #include #include VK_NAMESPACE_BEGIN using ShaderStageCreateInfoList=List; -using MaterialParameterArray=MaterialParameters *[DESCRIPTOR_SET_TYPE_COUNT]; - struct MaterialData { UTF8String name; @@ -25,7 +24,9 @@ struct MaterialData PipelineLayoutData *pipeline_layout_data; - MaterialParameterArray mp_array; + MaterialParameters *mp_array[DESCRIPTOR_SET_TYPE_COUNT]; + + uint32_t mi_data_bytes; private: @@ -42,6 +43,8 @@ class Material { MaterialData *data; + Collection *mi_data; + private: friend GPUDevice; diff --git a/inc/hgl/graph/VKMaterialInstance.h b/inc/hgl/graph/VKMaterialInstance.h index 46a8924c..ccf1c88f 100644 --- a/inc/hgl/graph/VKMaterialInstance.h +++ b/inc/hgl/graph/VKMaterialInstance.h @@ -50,6 +50,8 @@ protected: VIL *vil; + + public: Material * GetMaterial () {return material;} diff --git a/inc/hgl/graph/VKRenderable.h b/inc/hgl/graph/VKRenderable.h index 8f7d2775..d7bdd6eb 100644 --- a/inc/hgl/graph/VKRenderable.h +++ b/inc/hgl/graph/VKRenderable.h @@ -75,8 +75,6 @@ public: const AABB & GetBoundingBox ()const{return primitive->GetBoundingBox();} const VertexInputData * GetVertexInputData ()const{return vertex_input;} - - MaterialParameters *GetMP (const DescriptorSetType &type){return mat_inst->GetMP(type);} };//class Renderable Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *); diff --git a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp index 91881065..40019e0d 100644 --- a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp +++ b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp @@ -109,11 +109,12 @@ bool RenderCmdBuffer::BindDescriptorSets(Renderable *ri) uint32_t count=0; MaterialParameters *mp; + Material *mtl=ri->GetMaterial(); VkDescriptorSet ds[DESCRIPTOR_SET_TYPE_COUNT]; ENUM_CLASS_FOR(DescriptorSetType,int,i) { - mp=ri->GetMP((DescriptorSetType)i); + mp=mtl->GetMP((DescriptorSetType)i); if(mp) { diff --git a/src/SceneGraph/Vulkan/VKDescriptorBindingManage.cpp b/src/SceneGraph/Vulkan/VKDescriptorBindingManage.cpp index 5c3647d6..110608ca 100644 --- a/src/SceneGraph/Vulkan/VKDescriptorBindingManage.cpp +++ b/src/SceneGraph/Vulkan/VKDescriptorBindingManage.cpp @@ -3,12 +3,12 @@ #include VK_NAMESPACE_BEGIN -bool DescriptorBinding::Bind(MaterialInstance *mi) +bool DescriptorBinding::Bind(Material *mtl) { - if(!mi) + if(!mtl) return(false); - MaterialParameters *mp=mi->GetMP(set_type); + MaterialParameters *mp=mtl->GetMP(set_type); if(!mp) return(false); diff --git a/src/SceneGraph/Vulkan/VKMaterialInstance.cpp b/src/SceneGraph/Vulkan/VKMaterialInstance.cpp index 1a05f83d..9da6ab85 100644 --- a/src/SceneGraph/Vulkan/VKMaterialInstance.cpp +++ b/src/SceneGraph/Vulkan/VKMaterialInstance.cpp @@ -22,7 +22,7 @@ MaterialInstance::MaterialInstance(Material *mtl,VIL *v) bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic) { - MaterialParameters *mp=GetMP(type); + MaterialParameters *mp=material->GetMP(type); if(!mp) 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) { - MaterialParameters *mp=GetMP(type); + MaterialParameters *mp=material->GetMP(type); if(!mp) 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) { - MaterialParameters *mp=GetMP(type); + MaterialParameters *mp=material->GetMP(type); if(!mp) return(false); diff --git a/src/ShaderGen/MaterialCreateInfo.cpp b/src/ShaderGen/MaterialCreateInfo.cpp index 2e2073fe..e8dc9505 100644 --- a/src/ShaderGen/MaterialCreateInfo.cpp +++ b/src/ShaderGen/MaterialCreateInfo.cpp @@ -141,8 +141,10 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &glsl_codes,const if(data_bytes>0) mi_codes=glsl_codes; - const uint32_t ubo_range=config->dev_attr->physical_device->GetUBORange(); - AnsiString MI_MAX_COUNT=AnsiString::numberOf(ubo_range/data_bytes); + const uint32_t ubo_range=config->dev_attr->physical_device->GetUBORange(); //小部分为16k,大部分为64k,Intel核显为128M,AMD显卡无限制 + 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(SBS_MaterialInstanceData);