diff --git a/CMSceneGraph b/CMSceneGraph index f207c0b8..ba9b1936 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit f207c0b844e4c8474cdd4a94cd276251025f23ed +Subproject commit ba9b1936f65e37c4852f2c59e6adb5d694a4a573 diff --git a/example/Vulkan/first_triangle.cpp b/example/Vulkan/first_triangle.cpp index 0d4edc8b..606dd38e 100644 --- a/example/Vulkan/first_triangle.cpp +++ b/example/Vulkan/first_triangle.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include using namespace hgl; using namespace hgl::graph; @@ -98,7 +98,7 @@ private: bool InitAutoMaterial() { - MaterialCreateInfo *mci=mtl::CreateVertexColor2DNDC(); + MaterialCreateInfo *mci=mtl::CreateVertexColor2D(CoordinateSystem2D::NDC); material_instance=db->CreateMaterialInstance(mci,&vil_config); diff --git a/example/Vulkan/second_triangle.cpp b/example/Vulkan/second_triangle.cpp index 8f254faf..d4283410 100644 --- a/example/Vulkan/second_triangle.cpp +++ b/example/Vulkan/second_triangle.cpp @@ -5,6 +5,7 @@ #include #include #include +#include using namespace hgl; using namespace hgl::graph; @@ -40,8 +41,14 @@ private: private: bool InitMaterial() - { - material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D")); + { + MaterialCreateInfo *mci=mtl::CreateVertexColor2D(CoordinateSystem2D::Ortho); + + //material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D")); + + material_instance=db->CreateMaterialInstance(mci); + + delete mci; if(!material_instance) return(false); diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 1fe42bfe..8209375b 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -116,7 +116,7 @@ public: cili.lunarg.standard_validation = true; cili.khronos.validation = true; - //cili.RenderDoc.Capture = true; + cili.RenderDoc.Capture = true; inst=CreateInstance("VulkanTest",nullptr,&cili); @@ -142,7 +142,7 @@ public: ubo_vp_info=db->CreateUBO(sizeof(ViewportInfo),&vp_info); - db->SetGlobal(GlobalShaderUBO::ViewportInfo,ubo_vp_info); + db->SetGlobal(GlobalDescriptor::ViewportInfo.name,ubo_vp_info); } return(true); diff --git a/inc/hgl/graph/VKMaterialParameters.h b/inc/hgl/graph/VKMaterialParameters.h index dd4db06d..5d66529b 100644 --- a/inc/hgl/graph/VKMaterialParameters.h +++ b/inc/hgl/graph/VKMaterialParameters.h @@ -1,4 +1,4 @@ -#ifndef HGL_GRAPH_VULKAN_MATERIAL_PARAMETERS_INCLUDE +#ifndef HGL_GRAPH_VULKAN_MATERIAL_PARAMETERS_INCLUDE #define HGL_GRAPH_VULKAN_MATERIAL_PARAMETERS_INCLUDE #include @@ -27,10 +27,10 @@ public: DescriptorSet * GetDescriptorSet (){return descriptor_set;} const VkDescriptorSet GetVkDescriptorSet ()const{return descriptor_set->GetDescriptorSet();} - const uint32_t GetDescriptorCount ()const{return desc_manager->GetBindCount(set_type);} ///<ȡܹҪ󶨵 + const uint32_t GetDescriptorCount ()const{return desc_manager->GetBindCount(set_type);} ///<获取总共需要绑定的描述符数量 - const uint32_t GetBoundCount ()const{return descriptor_set->GetCount();} ///<ȡѾõ - const bool IsReady ()const{return descriptor_set->IsReady();} ///<Ƿȫ + const uint32_t GetBoundCount ()const{return descriptor_set->GetCount();} ///<获取已经绑好的数量 + const bool IsReady ()const{return descriptor_set->IsReady();} ///<是否全部绑好了 public: @@ -55,4 +55,4 @@ public: void Update(); };//class MaterialParameters VK_NAMESPACE_END -#endif//HGL_GRAPH_VULKAN_MATERIAL_PARAMETERS_INCLUDE \ No newline at end of file +#endif//HGL_GRAPH_VULKAN_MATERIAL_PARAMETERS_INCLUDE diff --git a/inc/hgl/graph/mtl/StdMaterial.h b/inc/hgl/graph/mtl/StdMaterial.h index f4682687..a826016e 100644 --- a/inc/hgl/graph/mtl/StdMaterial.h +++ b/inc/hgl/graph/mtl/StdMaterial.h @@ -12,8 +12,50 @@ enum class CoordinateSystem2D Ortho //左上角为0,0;右下角为(width-1),(height-1) }; -namespace GlobalShaderUBO +namespace GlobalDescriptor { - constexpr const char ViewportInfo[]="ViewportInfo"; - constexpr const char CameraInfo[]="CameraInfo"; + struct ShaderStruct + { + const char *struct_name; + const char *name; + const char *codes; + }; + + constexpr const ShaderStruct ViewportInfo= + { + "ViewportInfo", + "viewport", + + R"( +mat4 ortho_matrix; + +vec2 canvas_resolution; +vec2 viewport_resolution; +vec2 inv_viewport_resolution; +)" + }; + + constexpr const ShaderStruct CameraInfo= + { + "CameraInfo", + "camera", + + R"( +mat4 projection; +mat4 inverse_projection; + +mat4 view; +mat4 inverse_view; + +mat4 vp; +mat4 inverse_vp; + +mat4 sky; + +vec3 pos; //eye +vec3 view_line; //pos-target +vec3 world_up; + +float znear,zfar;)" + }; } diff --git a/inc/hgl/shadergen/MaterialCreateInfo.h b/inc/hgl/shadergen/MaterialCreateInfo.h index cd0eb108..6f6a51e4 100644 --- a/inc/hgl/shadergen/MaterialCreateInfo.h +++ b/inc/hgl/shadergen/MaterialCreateInfo.h @@ -5,6 +5,7 @@ #include #include #include +#include #include namespace hgl{namespace graph{ @@ -19,7 +20,7 @@ protected: uint32_t shader_stage; ///<着色器阶段 - MaterialDescriptorInfo mdm; ///<材质描述符管理器 + MaterialDescriptorInfo mdi; ///<材质描述符管理器 ShaderCreateInfoMap shader_map; ///<着色器列表 @@ -52,12 +53,24 @@ public: ~MaterialCreateInfo()=default; bool AddStruct(const AnsiString &ubo_typename,const AnsiString &codes); + bool AddStruct(const GlobalDescriptor::ShaderStruct &ss) + { + return AddStruct(ss.struct_name,ss.codes); + } bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name); bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name); + bool AddUBO(const VkShaderStageFlagBits flag_bits,const GlobalDescriptor::ShaderStruct &ss) + { + if(!mdi.hasStruct(ss.struct_name)) + mdi.AddStruct(ss.struct_name,ss.codes); + + return AddUBO(flag_bits,DescriptorSetType::Global,ss.struct_name,ss.name); + } + bool CreateShader(); - const MaterialDescriptorInfo &GetMDI()const{return mdm;} + const MaterialDescriptorInfo &GetMDI()const{return mdi;} };//class MaterialCreateInfo }}//namespace hgl::graph diff --git a/inc/hgl/shadergen/ShaderCreateInfo.h b/inc/hgl/shadergen/ShaderCreateInfo.h index a6749fad..91a134fa 100644 --- a/inc/hgl/shadergen/ShaderCreateInfo.h +++ b/inc/hgl/shadergen/ShaderCreateInfo.h @@ -17,7 +17,7 @@ protected: VkShaderStageFlagBits shader_stage; ///<着色器阶段 - MaterialDescriptorInfo *mdm; + MaterialDescriptorInfo *mdi; protected: diff --git a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp index 492f0d98..a33e6b6b 100644 --- a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp +++ b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp @@ -125,7 +125,7 @@ bool RenderCmdBuffer::BindDescriptorSets(Renderable *ri) if((DescriptorSetType)i==DescriptorSetType::PerObject) { - dynamic_count=mp->GetCount(); + dynamic_count=mp->GetBoundCount(); dynamic_offset=hgl_zero_new(dynamic_count); } diff --git a/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp b/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp index dfc18750..bf50b708 100644 --- a/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp @@ -97,7 +97,7 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap * data->name =mtl_name; data->shader_maps =shader_maps; - data->desc_manager =desc_manager; + data->desc_manager =desc_manager; data->vertex_input =vi; CreateShaderStageList(data->shader_stage_list,shader_maps); diff --git a/src/ShaderGen/2d/VertexColor2D.cpp b/src/ShaderGen/2d/VertexColor2D.cpp index eb2675af..a52cb4d9 100644 --- a/src/ShaderGen/2d/VertexColor2D.cpp +++ b/src/ShaderGen/2d/VertexColor2D.cpp @@ -7,22 +7,32 @@ STD_MTL_NAMESPACE_BEGIN MaterialCreateInfo *CreateVertexColor2D(const CoordinateSystem2D &cs) { - AnsiString mtl_name="VertexColor2D"; + AnsiString mtl_name; - if(cs==CoordinateSystem2D::NDC)mtl_name+="NDC";else - if(cs==CoordinateSystem2D::ZeroToOne)mtl_name+="ZeroToOne";else - if(cs==CoordinateSystem2D::Ortho)mtl_name+="Ortho";else + if(cs==CoordinateSystem2D::NDC )mtl_name="VertexColor2DNDC";else + if(cs==CoordinateSystem2D::ZeroToOne)mtl_name="VertexColor2DZeroToOne";else + if(cs==CoordinateSystem2D::Ortho )mtl_name="VertexColor2DOrtho";else return(nullptr); - MaterialCreateInfo *mci=new MaterialCreateInfo( mtl_name, ///<名称 1, ///<最终一个RT输出 false); ///<无深度输出 + AnsiString sfGetPosition; + if(cs==CoordinateSystem2D::Ortho) { - mci->AddStruct(GlobalShaderUBO::ViewportInfo,""); +// mci->AddStruct(GlobalDescriptor::ViewportInfo); + + mci->AddUBO(VK_SHADER_STAGE_VERTEX_BIT,GlobalDescriptor::ViewportInfo); + + sfGetPosition="vec4 GetPosition(){return viewport.ortho_matrix*vec4(Position,0,1);}"; } + else + if(cs==CoordinateSystem2D::ZeroToOne) + sfGetPosition="vec4 GetPosition(){return vec4(Position*2-1,0,1);}"; + else + sfGetPosition="vec4 GetPosition(){return vec4(Position,0,1);}"; //vertex部分 { @@ -33,12 +43,14 @@ MaterialCreateInfo *CreateVertexColor2D(const CoordinateSystem2D &cs) vsc->AddOutput(VAT_VEC4,"Color"); - vsc->SetShaderCodes(R"( + vsc->SetShaderCodes( + sfGetPosition+ +R"( void main() { Output.Color=Color; - gl_Position=vec4(Position,0,1); + gl_Position=GetPosition(); })"); } diff --git a/src/ShaderGen/CMakeLists.txt b/src/ShaderGen/CMakeLists.txt index 4d317f66..4b21608e 100644 --- a/src/ShaderGen/CMakeLists.txt +++ b/src/ShaderGen/CMakeLists.txt @@ -42,7 +42,8 @@ SET(STD_MTL_2D_HEADER_PATH ${STD_MTL_HEADER_PATH}/2d) SET(STD_MTL_2D_SOURCE_FILES ${STD_MTL_2D_HEADER_PATH}/VertexColor2D.h 2d/VertexColor2D.cpp) -SET(STANDARD_MATERIAL_SOURCE ${STD_MTL_HEADER_PATH}/StdMaterial.h) +SET(STANDARD_MATERIAL_SOURCE ${STD_MTL_HEADER_PATH}/StdMaterial.h + GlobalShaderUBO.cpp) SOURCE_GROUP("Standard Material" FILES ${STANDARD_MATERIAL_SOURCE}) SOURCE_GROUP("Standard Material\\2D" FILES ${STD_MTL_2D_SOURCE_FILES}) diff --git a/src/ShaderGen/MaterialCreateInfo.cpp b/src/ShaderGen/MaterialCreateInfo.cpp index 87f169ec..53762faa 100644 --- a/src/ShaderGen/MaterialCreateInfo.cpp +++ b/src/ShaderGen/MaterialCreateInfo.cpp @@ -14,9 +14,9 @@ MaterialCreateInfo::MaterialCreateInfo(const AnsiString &n,const uint rc,const b shader_stage=ss; - if(hasVertex ())shader_map.Add(vert=new ShaderCreateInfoVertex (&mdm));else vert=nullptr; - if(hasGeometry ())shader_map.Add(geom=new ShaderCreateInfoGeometry(&mdm));else geom=nullptr; - if(hasFragment ())shader_map.Add(frag=new ShaderCreateInfoFragment(&mdm));else frag=nullptr; + if(hasVertex ())shader_map.Add(vert=new ShaderCreateInfoVertex (&mdi));else vert=nullptr; + if(hasGeometry ())shader_map.Add(geom=new ShaderCreateInfoGeometry(&mdi));else geom=nullptr; + if(hasFragment ())shader_map.Add(frag=new ShaderCreateInfoFragment(&mdi));else frag=nullptr; } bool MaterialCreateInfo::AddStruct(const AnsiString &struct_name,const AnsiString &codes) @@ -24,7 +24,7 @@ bool MaterialCreateInfo::AddStruct(const AnsiString &struct_name,const AnsiStrin if(struct_name.IsEmpty()||codes.IsEmpty()) return(false); - return mdm.AddStruct(struct_name,codes); + return mdi.AddStruct(struct_name,codes); } bool MaterialCreateInfo::AddUBO(const VkShaderStageFlagBits flag_bit,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name) @@ -32,7 +32,7 @@ bool MaterialCreateInfo::AddUBO(const VkShaderStageFlagBits flag_bit,const Descr if(!shader_map.KeyExist(flag_bit)) return(false); - if(!mdm.hasStruct(type_name)) + if(!mdi.hasStruct(type_name)) return(false); ShaderCreateInfo *sc=shader_map[flag_bit]; @@ -40,7 +40,7 @@ bool MaterialCreateInfo::AddUBO(const VkShaderStageFlagBits flag_bit,const Descr if(!sc) return(false); - UBODescriptor *ubo=mdm.GetUBO(name); + UBODescriptor *ubo=mdi.GetUBO(name); if(ubo) { @@ -56,9 +56,9 @@ bool MaterialCreateInfo::AddUBO(const VkShaderStageFlagBits flag_bit,const Descr ubo=new UBODescriptor(); ubo->type=type_name; - ubo->name=name; + hgl::strcpy(ubo->name,DESCRIPTOR_NAME_MAX_LENGTH,name); - return sc->sdm->AddUBO(set_type,mdm.AddUBO(flag_bit,set_type,ubo)); + return sc->sdm->AddUBO(set_type,mdi.AddUBO(flag_bit,set_type,ubo)); } } @@ -74,7 +74,7 @@ bool MaterialCreateInfo::AddSampler(const VkShaderStageFlagBits flag_bit,const D if(!sc) return(false); - SamplerDescriptor *sampler=mdm.GetSampler(name); + SamplerDescriptor *sampler=mdi.GetSampler(name); AnsiString st_name=GetSamplerTypeName(st); @@ -92,9 +92,9 @@ bool MaterialCreateInfo::AddSampler(const VkShaderStageFlagBits flag_bit,const D sampler=new SamplerDescriptor(); sampler->type=st_name; - sampler->name=name; + hgl::strcpy(sampler->name,DESCRIPTOR_NAME_MAX_LENGTH,name); - return sc->sdm->AddSampler(set_type,mdm.AddSampler(flag_bit,set_type,sampler)); + return sc->sdm->AddSampler(set_type,mdi.AddSampler(flag_bit,set_type,sampler)); } } @@ -103,7 +103,7 @@ bool MaterialCreateInfo::CreateShader() if(shader_map.IsEmpty()) return(false); - mdm.Resort(); + mdi.Resort(); ShaderCreateInfo *sc,*last=nullptr; diff --git a/src/ShaderGen/ShaderCreateInfo.cpp b/src/ShaderGen/ShaderCreateInfo.cpp index f69804e1..e094e178 100644 --- a/src/ShaderGen/ShaderCreateInfo.cpp +++ b/src/ShaderGen/ShaderCreateInfo.cpp @@ -6,7 +6,7 @@ namespace hgl{namespace graph{ ShaderCreateInfo::ShaderCreateInfo(VkShaderStageFlagBits ss,MaterialDescriptorInfo *m) { shader_stage=ss; - mdm=m; + mdi=m; sdm=new ShaderDescriptorInfo(ss); spv_data=nullptr; @@ -81,7 +81,10 @@ bool ShaderCreateInfo::ProcInput(ShaderCreateInfo *last_sc) AnsiString last_output=last_sc->GetOutputStruct(); if(last_output.IsEmpty()) + { + final_shader+="\n"; return(true); + } final_shader+="layout(location=0) in "; final_shader+=last_output; @@ -131,14 +134,14 @@ bool ShaderCreateInfo::ProcStruct() for(auto &str:struct_list) { - if(!mdm->GetStruct(*str,codes)) + if(!mdi->GetStruct(*str,codes)) return(false); final_shader+="struct "; final_shader+=*str; - final_shader+="\n{\n"; + final_shader+="\n{"; final_shader+=codes; - final_shader+="\n};\n\n"; + final_shader+="};\n\n"; } return(true); @@ -154,6 +157,8 @@ bool ShaderCreateInfo::ProcUBO() auto ubo=ubo_list.GetData(); + AnsiString struct_codes; + for(int i=0;ibinding); final_shader+=") uniform "; final_shader+=(*ubo)->type; - final_shader+=" "; + final_shader+="{\n"; + + if(!mdi->GetStruct((*ubo)->type,struct_codes)) + return(false); + + final_shader+=struct_codes; + + final_shader+="\n}"; final_shader+=(*ubo)->name; - final_shader+="\n"; + final_shader+=";\n"; ++ubo; } @@ -244,8 +256,8 @@ bool ShaderCreateInfo::CreateShader(ShaderCreateInfo *last_sc) return(false); if(!ProcInput(last_sc)) return(false); - if(!ProcStruct()) - return(false); +// if(!ProcStruct()) +// return(false); if(!ProcUBO()) return(false);