diff --git a/example/Vulkan/first_triangle.cpp b/example/Vulkan/first_triangle.cpp index 6484cb4e..5839cba3 100644 --- a/example/Vulkan/first_triangle.cpp +++ b/example/Vulkan/first_triangle.cpp @@ -8,9 +8,11 @@ #include #include #include +#include using namespace hgl; using namespace hgl::graph; +using namespace hgl::shadergen; constexpr uint32_t SCREEN_WIDTH=1280; constexpr uint32_t SCREEN_HEIGHT=720; @@ -62,6 +64,10 @@ class TestApp:public VulkanApplicationFramework { private: +#if defined(USE_HALF_FLOAT_POSITION)||defined(USE_UNORM8_COLOR) + VILConfig vil_config; +#endif + MaterialInstance * material_instance =nullptr; Renderable * render_obj =nullptr; @@ -69,11 +75,8 @@ private: private: - bool InitMaterial() + void InitVIL() { -#if defined(USE_HALF_FLOAT_POSITION)||defined(USE_UNORM8_COLOR) - VILConfig vil_config; - #ifdef USE_HALF_FLOAT_POSITION vil_config.Add(VAN::Position,PositionFormat); #endif//USE_HALF_FLOAT_POSITION @@ -81,19 +84,70 @@ private: #ifdef USE_UNORM8_COLOR vil_config.Add(VAN::Color,ColorFormat); #endif//USE_HALF_FLOAT_POSITION + } + bool InitMaterial() + { +#if defined(USE_HALF_FLOAT_POSITION)||defined(USE_UNORM8_COLOR) material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2DNDC"),&vil_config); #else material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2DNDC")); #endif// - if(!material_instance) + return material_instance; + } + + bool InitAutoMaterial() + { + MaterialCreateInfo mc("VertexColor2D",1,false); + + //vertex部分 + { + ShaderCreateInfoVertex *vsc=mc.GetVS(); + + vsc->AddInput("vec2",VAN::Position); + vsc->AddInput("vec4",VAN::Color); + + vsc->AddOutput("vec4","Color"); + + vsc->SetShaderCodes(R"( + void main() + { + Output.Color=Color; + + gl_Position=vec4(Position,0,1); + })"); + } + + //fragment部分 + { + ShaderCreateInfoFragment *fsc=mc.GetFS(); + + fsc->AddOutput("vec4","Color"); + + fsc->SetShaderCodes(R"( + void main() + { + Color=Input.Color; + })"); + } + + if(!mc.CreateShader()) return(false); + Material *m=db->CreateMaterial(&mc); + + material_instance=db->CreateMaterialInstance(m,&vil_config); + + return material_instance; + } + + bool InitPipeline() + { // 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 - return pipeline; + return pipeline; } bool InitVBO() @@ -118,7 +172,12 @@ public: if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) return(false); - if(!InitMaterial()) + InitVIL(); + + if(!InitAutoMaterial()) + return(false); + + if(!InitPipeline()) return(false); if(!InitVBO()) diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index af15835a..a7c4e697 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -33,6 +33,12 @@ using namespace hgl; using namespace hgl::io; using namespace hgl::graph; +namespace glsl_compiler +{ + bool Init(); + void Close(); +}//namespace glsl_compiler + class VulkanApplicationFramework:WindowEvent { protected: @@ -66,6 +72,8 @@ public: virtual ~VulkanApplicationFramework() { + glsl_compiler::Close(); + win->Unjoin(this); SAFE_CLEAR(db); @@ -78,6 +86,9 @@ public: virtual bool Init(int w,int h) { + if(!glsl_compiler::Init()) + return(false); + clear_color.Set(0,0,0,1); #ifdef _DEBUG diff --git a/inc/hgl/shadergen/MaterialCreateInfo.h b/inc/hgl/shadergen/MaterialCreateInfo.h index 94be2259..e1b6ea51 100644 --- a/inc/hgl/shadergen/MaterialCreateInfo.h +++ b/inc/hgl/shadergen/MaterialCreateInfo.h @@ -42,9 +42,9 @@ public: bool hasFragment()const{return hasShader(VK_SHADER_STAGE_FRAGMENT_BIT);} // bool hasCompute ()const{return hasShader(VK_SHADER_STAGE_COMPUTE_BIT);} - const ShaderCreateInfoVertex * GetVS()const{return vert;} - const ShaderCreateInfoGeometry * GetGS()const{return geom;} - const ShaderCreateInfoFragment * GetFS()const{return frag;} + ShaderCreateInfoVertex * GetVS()const{return vert;} + ShaderCreateInfoGeometry * GetGS()const{return geom;} + ShaderCreateInfoFragment * GetFS()const{return frag;} public: diff --git a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp index e9ad2dbe..73f6b2ef 100644 --- a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp @@ -195,7 +195,7 @@ Material *RenderResource::CreateMaterial(const OSString &filename) mtl=nullptr; } - material_by_name.Add(filename,mtl); + material_by_name.Add(filename,mtl); return(mtl); } @@ -204,6 +204,13 @@ Material *RenderResource::CreateMaterial(const hgl::shadergen::MaterialCreateInf if(!mci) return(nullptr); + Material *mtl; + + const OSString mtl_name=ToOSString(mci->GetName()); + + if(material_by_name.Get(mtl_name,mtl)) + return mtl; + SHADERGEN_NAMESPACE_USING const uint count=GetShaderCountByBits(mci->GetShaderStage()); @@ -212,8 +219,6 @@ Material *RenderResource::CreateMaterial(const hgl::shadergen::MaterialCreateInf ShaderModuleMap *smm=new ShaderModuleMap; VertexInput *vertex_input=nullptr; - const OSString mtl_name=ToOSString(mci->GetName()); - const ShaderCreateInfoVertex *vert=mci->GetVS(); if(vert) @@ -222,13 +227,11 @@ Material *RenderResource::CreateMaterial(const hgl::shadergen::MaterialCreateInf VK_SHADER_STAGE_VERTEX_BIT, vert->GetSPVData(),vert->GetSPVSize()); - if(sm) - { - if(smm->Add(sm)) - vertex_input=new VertexInput(vert->sdm->GetShaderStageIO().input); - } + if(!sm) + return(false); - smm->Add(sm); + if(smm->Add(sm)) + vertex_input=new VertexInput(vert->sdm->GetShaderStageIO().input); } const ShaderCreateInfoGeometry *geom=mci->GetGS(); @@ -253,9 +256,16 @@ Material *RenderResource::CreateMaterial(const hgl::shadergen::MaterialCreateInf smm->Add(sm); } - MaterialDescriptorManager *mdm=new MaterialDescriptorManager(mci->GetName(),mci->GetMDI().Get()); + MaterialDescriptorManager *mdm=nullptr; - Material *mtl=device->CreateMaterial(mci->GetName(),smm,mdm,vertex_input); + { + const auto &mdi=mci->GetMDI(); + + if(mdi.GetCount()>0) + mdm=new MaterialDescriptorManager(mci->GetName(),mdi.Get()); + } + + mtl=device->CreateMaterial(mci->GetName(),smm,mdm,vertex_input); if(!mtl) { @@ -263,6 +273,7 @@ Material *RenderResource::CreateMaterial(const hgl::shadergen::MaterialCreateInf delete smm; } + material_by_name.Add(mtl_name,mtl); return mtl; } VK_NAMESPACE_END