From 3a3f9d10b7682e6d26c92ace4c306dec87600728 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 9 Oct 2023 01:12:27 +0800 Subject: [PATCH] Parse MaterialInstance filed in MaterialFileLoader.cpp --- example/CMakeLists.txt | 1 - example/MaterialCreaterTest.cpp | 126 --------------------------- inc/hgl/graph/mtl/StdMaterial.h | 5 ++ src/ShaderGen/MaterialFileLoader.cpp | 52 +++++++---- 4 files changed, 38 insertions(+), 146 deletions(-) delete mode 100644 example/MaterialCreaterTest.cpp diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 291fdd77..5a419ee9 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -21,4 +21,3 @@ macro(CreateProject name) set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example") endmacro() -CreateProject(MaterialCreaterTest MaterialCreaterTest.cpp) diff --git a/example/MaterialCreaterTest.cpp b/example/MaterialCreaterTest.cpp deleted file mode 100644 index dfabcfdf..00000000 --- a/example/MaterialCreaterTest.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include - -using namespace hgl; -using namespace hgl::graph; -using namespace hgl::shadergen; - -bool PureColor2DMaterial() -{ - MaterialCreateInfo mc("PureColor2D",1,false); //一个新材质,1个RT输出,默认使用Vertex/Fragment shader - - //vertex部分 - { - ShaderCreateInfoVertex *vsc=mc.GetVS(); //获取vertex shader creater - - //以下代码会被展开为 - /* - layout(location=?) in vec3 Position; //位置属性 - */ - vsc->AddInput("vec2","Position"); //添加一个vec3类型的position属性输入 - - vsc->SetShaderCodes(R"( -void main() -{ - gl_Position=vec4(Position,0,1); -})"); - } - - //添加一个名称为ColorMaterial的UBO定义,其内部有一个vec4 color的属性 - //该代码会被展开为 - /* - struct ColorMaterial - { - vec4 color; - }; - */ - mc.AddStruct("ColorMaterial","vec4 color;"); - - //添加一个UBO,该代码会被展开为 - /* - layout(set=?,binding=?) uniform ColorMaterial mtl; - */ - mc.AddUBO( VK_SHADER_STAGE_FRAGMENT_BIT, //这个UBO出现在fragment shader - DescriptorSetType::PerMaterial, //它属于材质合集 - "ColorMaterial", //UBO名称为ColorMaterial - "mtl"); //UBO变量名称为mtl - - //fragment部分 - { - ShaderCreateInfoFragment *fsc=mc.GetFS(); //获取fragment shader creater - - //以下代码会被展开为 - /* - layout(location=?) out vec4 Color; //颜色输出 - */ - fsc->AddOutput("vec4","Color"); //添加一个vec4类型的color属性输出 - - fsc->SetShaderCodes(R"( -void main() -{ - Color=mtl.color; -})"); - } - - mc.CreateShader(); - - return(true); -} - -bool VertexColor2DMaterial() -{ - MaterialCreateInfo mc("VertexColor2D",1,false); - - //vertex部分 - { - ShaderCreateInfoVertex *vsc=mc.GetVS(); - - vsc->AddInput("vec2","Position"); - vsc->AddInput("vec4","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; -})"); - } - - mc.CreateShader(); - - return(true); -} - -namespace glsl_compiler -{ - bool Init(); - void Close(); -}//namespace glsl_compiler - -int main() -{ - if(!glsl_compiler::Init()) - return -1; - - PureColor2DMaterial(); - VertexColor2DMaterial(); - - glsl_compiler::Close(); - - return 0; -} diff --git a/inc/hgl/graph/mtl/StdMaterial.h b/inc/hgl/graph/mtl/StdMaterial.h index 4abe0f56..f447ebe3 100644 --- a/inc/hgl/graph/mtl/StdMaterial.h +++ b/inc/hgl/graph/mtl/StdMaterial.h @@ -1,5 +1,7 @@ #pragma once +#include + #define STD_MTL_NAMESPACE_BEGIN namespace hgl{namespace graph{namespace mtl{ #define STD_MTL_NAMESPACE_END }}} @@ -45,6 +47,9 @@ namespace hgl virtual MaterialCreateInfo *Create()=0; };//class StdMaterial + + + bool LoadMaterialFromFile(const AnsiString &mtl_filename); }//namespace mtl }//namespace graph }//namespace hgl diff --git a/src/ShaderGen/MaterialFileLoader.cpp b/src/ShaderGen/MaterialFileLoader.cpp index dfb07138..f0af669a 100644 --- a/src/ShaderGen/MaterialFileLoader.cpp +++ b/src/ShaderGen/MaterialFileLoader.cpp @@ -35,23 +35,34 @@ namespace FragmentOutput, FragmentCode, + ENUM_CLASS_RANGE(None,FragmentCode) };//enum class State - constexpr const char *StateNameList[]= + struct MaterialFileStateInfo { - "Material", - "MaterialInstance", - "Vertex", - "Geometry", - "Fragment", + const char *name; + const int len; + MaterialFileState state; }; - const MaterialFileState GetMaterialFileState(const char *str) + #define MFS(name) {#name,sizeof(#name)-1,MaterialFileState::name}, + + constexpr const MaterialFileStateInfo state_list[]= { - for(int i=0;i