diff --git a/example/Basic/BillboardTest.cpp b/example/Basic/BillboardTest.cpp index 6a1cc7ae..3d70962f 100644 --- a/example/Basic/BillboardTest.cpp +++ b/example/Basic/BillboardTest.cpp @@ -38,7 +38,7 @@ private: MaterialInstance * mi_billboard =nullptr; Pipeline * pipeline_billboard =nullptr; - Mesh * ro_billboard =nullptr; + Mesh * ro_billboard =nullptr; Texture2D * texture =nullptr; Sampler * sampler =nullptr; @@ -47,7 +47,7 @@ private: bool InitPlaneGridMP() { - mtl::Material3DCreateConfig cfg(device->GetDevAttr(),"VertexLuminance3D",PrimitiveType::Lines); + mtl::Material3DCreateConfig cfg(PrimitiveType::Lines); cfg.local_to_world=true; @@ -73,14 +73,12 @@ private: bool InitBillboardMP() { - mtl::BillboardMaterialCreateConfig cfg(device->GetDevAttr(),"Billboard2D",PrimitiveType::Billboard); + mtl::BillboardMaterialCreateConfig cfg(PrimitiveType::Billboard); { cfg.fixed_size=true; - AutoDelete mci=mtl::CreateBillboard2D(&cfg); - - mi_billboard=db->CreateMaterialInstance(mci); + mi_billboard=CreateMaterialInstance(mtl::inline_material::Billboard2D,&cfg); if(!mi_billboard)return(false); pipeline_billboard=CreatePipeline(mi_billboard,InlinePipeline::Solid3D,PrimitiveType::Billboard); diff --git a/example/Basic/CMakeLists.txt b/example/Basic/CMakeLists.txt index 68f6fe6a..206ef392 100644 --- a/example/Basic/CMakeLists.txt +++ b/example/Basic/CMakeLists.txt @@ -1,6 +1,6 @@ macro(CreateProject name) - add_executable(${name} ${ARGN} ${VULKAN_APP_FRAMEWORK} MaterialLoader/MaterialLoader.cpp) + add_executable(${name} ${ARGN} ${VULKAN_APP_FRAMEWORK}) target_link_libraries(${name} ${ULRE}) IF(MSVC) diff --git a/example/Basic/auto_instance.cpp b/example/Basic/auto_instance.cpp index c4e0dc68..605d4efd 100644 --- a/example/Basic/auto_instance.cpp +++ b/example/Basic/auto_instance.cpp @@ -38,7 +38,7 @@ private: SceneNode render_root; MaterialInstance * material_instance =nullptr; - Mesh * render_obj =nullptr; + Mesh * render_obj =nullptr; Pipeline * pipeline =nullptr; @@ -47,18 +47,15 @@ private: bool InitMaterial() { { - mtl::Material2DCreateConfig cfg(GetDevAttr(),"VertexColor2D",PrimitiveType::Triangles); - - cfg.coordinate_system=CoordinateSystem2D::NDC; - cfg.local_to_world=true; - - AutoDelete mci=mtl::CreateVertexColor2D(&cfg); + mtl::Material2DCreateConfig cfg(PrimitiveType::Triangles, + CoordinateSystem2D::NDC, + mtl::WithLocalToWorld::With); VILConfig vil_config; vil_config.Add(VAN::Color,VF_V4UN8); - material_instance=db->CreateMaterialInstance(mci,&vil_config); + material_instance=CreateMaterialInstance(mtl::inline_material::VertexColor2D,&cfg,&vil_config); } if(!material_instance) diff --git a/example/Basic/auto_merge_material_instance.cpp b/example/Basic/auto_merge_material_instance.cpp index e324031c..6081023c 100644 --- a/example/Basic/auto_merge_material_instance.cpp +++ b/example/Basic/auto_merge_material_instance.cpp @@ -38,7 +38,7 @@ private: struct { MaterialInstance * mi; - Mesh * r; + Mesh * mesh; }render_obj[DRAW_OBJECT_COUNT]{}; Pipeline * pipeline =nullptr; @@ -48,10 +48,7 @@ private: bool InitMaterial() { { - mtl::Material2DCreateConfig cfg(GetDevAttr(),"PureColor2D",PrimitiveType::Triangles); - - cfg.coordinate_system=CoordinateSystem2D::NDC; - cfg.local_to_world=true; + mtl::Material2DCreateConfig cfg(PrimitiveType::Triangles,CoordinateSystem2D::NDC,mtl::WithLocalToWorld::With); #ifndef USE_MATERIAL_FILE AutoDelete mci=mtl::CreatePureColor2D(&cfg); //走程序内置材质创建函数 @@ -95,14 +92,14 @@ private: for(uint i=0;iCreateMesh(prim,render_obj[i].mi,pipeline); + render_obj[i].mesh=db->CreateMesh(prim,render_obj[i].mi,pipeline); - if(!render_obj[i].r) + if(!render_obj[i].mesh) return(false); mat=rotate(deg2rad(TRI_ROTATE_ANGLE*i),AxisVector::Z); - render_root.Add(new SceneNode(mat,render_obj[i].r)); + render_root.Add(new SceneNode(mat,render_obj[i].mesh)); } render_root.RefreshMatrix(); diff --git a/example/Basic/draw_triangle_in_NDC.cpp b/example/Basic/draw_triangle_in_NDC.cpp index 2c14ace3..7a7d76c1 100644 --- a/example/Basic/draw_triangle_in_NDC.cpp +++ b/example/Basic/draw_triangle_in_NDC.cpp @@ -87,14 +87,11 @@ private: bool InitAutoMaterial() { - mtl::Material2DCreateConfig cfg(GetDevAttr(),"VertexColor2d",PrimitiveType::Triangles); + mtl::Material2DCreateConfig cfg(PrimitiveType::Triangles, + CoordinateSystem2D::NDC, + mtl::WithLocalToWorld::Without); - cfg.coordinate_system=CoordinateSystem2D::NDC; - cfg.local_to_world=false; - - AutoDelete mci=mtl::CreateVertexColor2D(&cfg); - - material_instance=db->CreateMaterialInstance(mci,&vil_config); + material_instance=CreateMaterialInstance(mtl::inline_material::VertexColor2D,&cfg,&vil_config); return material_instance; } diff --git a/example/Basic/draw_triangle_use_UBO.cpp b/example/Basic/draw_triangle_use_UBO.cpp index 1f90047b..b07a0bb7 100644 --- a/example/Basic/draw_triangle_use_UBO.cpp +++ b/example/Basic/draw_triangle_use_UBO.cpp @@ -38,7 +38,7 @@ private: Color4f clear_color =Color4f(0.2f,0.2f,0.2f,1.0f); MaterialInstance * material_instance =nullptr; - Mesh * render_obj =nullptr; + Mesh * render_obj =nullptr; Pipeline * pipeline =nullptr; @@ -46,12 +46,12 @@ private: bool InitMaterial() { - mtl::Material2DCreateConfig cfg(GetDevAttr(),"VertexColor2D",PrimitiveType::Triangles); + mtl::Material2DCreateConfig cfg(PrimitiveType::Triangles, + CoordinateSystem2D::Ortho, + mtl::WithLocalToWorld::Without); VILConfig vil_config; - cfg.coordinate_system =CoordinateSystem2D::Ortho; - cfg.position_format = POSITION_SHADER_FORMAT; //这里指定shader中使用ivec2当做顶点输入格式 // ^ // + 这上下两种格式要配套,否则会出错 @@ -60,11 +60,7 @@ private: vil_config.Add(VAN::Color, COLOR_DATA_FORMAT); //这里指定VAB中使用RGBA8UNorm当做颜色数据格式 - cfg.local_to_world=false; - - AutoDelete mci=mtl::CreateVertexColor2D(&cfg); - - material_instance=db->CreateMaterialInstance(mci,&vil_config); + material_instance=CreateMaterialInstance(mtl::inline_material::VertexColor2D,&cfg,&vil_config); if(!material_instance) return(false); diff --git a/example/Basic/rf_test.cpp b/example/Basic/rf_test.cpp index 43dc83f4..bcc0d88e 100644 --- a/example/Basic/rf_test.cpp +++ b/example/Basic/rf_test.cpp @@ -34,7 +34,7 @@ private: Color4f clear_color =Color4f(0.2f,0.2f,0.2f,1.0f); MaterialInstance * material_instance =nullptr; - Mesh * render_obj =nullptr; + Mesh * render_obj =nullptr; Pipeline * pipeline =nullptr; @@ -46,7 +46,7 @@ private: CoordinateSystem2D::NDC, mtl::WithLocalToWorld::Without); - material_instance=CreateMaterialInstance("VertexColor2D",&cfg); //这个是使用名称创建 + material_instance=CreateMaterialInstance(mtl::inline_material::VertexColor2D,&cfg); //这个是使用名称创建 return material_instance; } diff --git a/example/Texture/texture_rect_array.cpp b/example/Texture/texture_rect_array.cpp index d2efb423..13e47143 100644 --- a/example/Texture/texture_rect_array.cpp +++ b/example/Texture/texture_rect_array.cpp @@ -61,7 +61,7 @@ private: struct { MaterialInstance * mi; - Mesh * r; + Mesh * mesh; }render_obj[TexCount]{}; private: @@ -144,14 +144,14 @@ private: for(uint32_t i=0;iCreateMesh(prim_rectangle,render_obj[i].mi,pipeline); + render_obj[i].mesh=db->CreateMesh(prim_rectangle,render_obj[i].mi,pipeline); - if(!render_obj[i].r) + if(!render_obj[i].mesh) return(false); offset.x=position_data[2]*float(i); - render_root.CreateSubNode(translate(offset),render_obj[i].r); + render_root.CreateSubNode(translate(offset),render_obj[i].mesh); } render_root.RefreshMatrix(); diff --git a/inc/hgl/graph/mtl/MaterialLibrary.h b/inc/hgl/graph/mtl/MaterialLibrary.h index e21a2e01..6ac46f41 100644 --- a/inc/hgl/graph/mtl/MaterialLibrary.h +++ b/inc/hgl/graph/mtl/MaterialLibrary.h @@ -45,6 +45,11 @@ public: };//class RegistryMaterialFactoryClass #define DEFINE_MATERIAL_FACTORY_CLASS(name,cfg_type) \ +namespace inline_material \ +{ \ + constexpr const char name[]=#name; \ +} \ +\ MaterialCreateInfo *Create##name(const VulkanDevAttr *dev_attr,cfg_type *); \ \ namespace \ diff --git a/inc/hgl/shadergen/MaterialCreateInfo.h b/inc/hgl/shadergen/MaterialCreateInfo.h index cbc21d5f..3ca21485 100644 --- a/inc/hgl/shadergen/MaterialCreateInfo.h +++ b/inc/hgl/shadergen/MaterialCreateInfo.h @@ -74,6 +74,8 @@ namespace hgl::graph MaterialCreateInfo(const MaterialCreateConfig *); ~MaterialCreateInfo()=default; + void SetDevice(const VulkanDevAttr *dev_attr); + bool SetMaterialInstance(const AnsiString &mi_glsl_codes,const uint32_t mi_struct_bytes,const uint32_t shader_stage_flag_bits); bool SetLocalToWorld(const uint32_t shader_stage_flag_bits); @@ -87,7 +89,7 @@ namespace hgl::graph bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name); - bool CreateShader(const VulkanDevAttr *dev_attr); + bool CreateShader(); };//class MaterialCreateInfo }//namespace mtl }//namespace hgl::graph diff --git a/src/ShaderGen/MaterialCreateInfo.cpp b/src/ShaderGen/MaterialCreateInfo.cpp index 10706ce5..86c505a9 100644 --- a/src/ShaderGen/MaterialCreateInfo.cpp +++ b/src/ShaderGen/MaterialCreateInfo.cpp @@ -225,14 +225,17 @@ bool MaterialCreateInfo::SetLocalToWorld(const uint32_t shader_stage_flag_bits) return(true); } -bool MaterialCreateInfo::CreateShader(const VulkanDevAttr *dev_attr) +void MaterialCreateInfo::SetDevice(const VulkanDevAttr *dev_attr) +{ + ubo_range=dev_attr->physical_device->GetUBORange(); //Mali-T系/G71为16k,nVidia和Mali-G系列除G71外为64k,Intel/PowerVR为128M,AMD无限制。 + ssbo_range=dev_attr->physical_device->GetSSBORange(); +} + +bool MaterialCreateInfo::CreateShader() { if(shader_map.IsEmpty()) return(false); - ubo_range=dev_attr->physical_device->GetUBORange(); //Mali-T系/G71为16k,nVidia和Mali-G系列除G71外为64k,Intel/PowerVR为128M,AMD无限制。 - ssbo_range=dev_attr->physical_device->GetSSBORange(); - mdi.Resort(); ShaderCreateInfo *sc,*last=nullptr; diff --git a/src/ShaderGen/StandardMaterial.cpp b/src/ShaderGen/StandardMaterial.cpp index ca2aba70..4834e2a1 100644 --- a/src/ShaderGen/StandardMaterial.cpp +++ b/src/ShaderGen/StandardMaterial.cpp @@ -10,6 +10,8 @@ StdMaterial::StdMaterial(const MaterialCreateConfig *mcc) MaterialCreateInfo *StdMaterial::Create(const VulkanDevAttr *dev_attr) { + mci->SetDevice(dev_attr); + if(!BeginCustomShader()) return(nullptr); @@ -28,7 +30,7 @@ MaterialCreateInfo *StdMaterial::Create(const VulkanDevAttr *dev_attr) if(!EndCustomShader()) return(nullptr); - if(!mci->CreateShader(dev_attr)) + if(!mci->CreateShader()) return(nullptr); return(mci);