From e61ed1d146e4223d7e36056cbf8a6425d253037f Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 13 Dec 2019 17:55:20 +0800 Subject: [PATCH] first build&test ok of ShaderMaker --- example/Vulkan/CMakeLists.txt | 2 + example/Vulkan/auto_material.cpp | 16 ++++++ inc/hgl/graph/shader/ShaderMaker.h | 4 +- inc/hgl/graph/shader/node/node.h | 36 ++++++++++--- inc/hgl/graph/shader/node/vertex_input.h | 19 +++++++ inc/hgl/graph/shader/param/in.h | 2 + src/RenderDevice/Shader/DefaultShader.cpp | 54 +++++++++++++++---- src/RenderDevice/Shader/node/shader_node.cpp | 38 ++++++++++++- .../Shader/param/shader_param_in.cpp | 2 +- 9 files changed, 151 insertions(+), 22 deletions(-) create mode 100644 example/Vulkan/auto_material.cpp create mode 100644 inc/hgl/graph/shader/node/vertex_input.h diff --git a/example/Vulkan/CMakeLists.txt b/example/Vulkan/CMakeLists.txt index ee7ebd88..cc35ef4f 100644 --- a/example/Vulkan/CMakeLists.txt +++ b/example/Vulkan/CMakeLists.txt @@ -30,3 +30,5 @@ CreateProject(11.PBRBasic PBRBasic.cpp) #CreateProject(12.Deferred Deferred.cpp) CreateProject(12.DeferredModel DeferredModel.cpp) + +CreateProject(13.AutoMaterial auto_material.cpp) diff --git a/example/Vulkan/auto_material.cpp b/example/Vulkan/auto_material.cpp new file mode 100644 index 00000000..31f8f81c --- /dev/null +++ b/example/Vulkan/auto_material.cpp @@ -0,0 +1,16 @@ +#include + +using namespace hgl; +using namespace hgl::graph; +using namespace hgl::graph::shader; + +BEGIN_SHADER_NAMESPACE +bool CreateDefaultMaterial(); +END_SHADER_NAMESPACE + +int main() +{ + CreateDefaultMaterial(); + + return 0; +} diff --git a/inc/hgl/graph/shader/ShaderMaker.h b/inc/hgl/graph/shader/ShaderMaker.h index 7f8540b7..b8ec5bf2 100644 --- a/inc/hgl/graph/shader/ShaderMaker.h +++ b/inc/hgl/graph/shader/ShaderMaker.h @@ -10,9 +10,9 @@ class ShaderMaker public: ShaderMaker(node::Finished *fn){fin_node=fn;} - ~ShaderMaker(); + virtual ~ShaderMaker()=default; - bool Make(); + virtual bool Make(); };//class ShaderMaker END_SHADER_NAMESPACE #endif//HGL_GRAPH_SHADER_MAKER_INCLUDE diff --git a/inc/hgl/graph/shader/node/node.h b/inc/hgl/graph/shader/node/node.h index c51286d3..1236e033 100644 --- a/inc/hgl/graph/shader/node/node.h +++ b/inc/hgl/graph/shader/node/node.h @@ -3,19 +3,22 @@ #include #include +#include #include #include BEGIN_SHADER_NODE_NAMESPACE -#define SHADER_INPUT_PARAM(mj,name,type) input_params.Add(new SHADER_PARAM_NAMESPACE::InputParam(mj,#name,SHADER_PARAM_NAMESPACE::ParamType::type)); -#define SHADER_OUTPUT_PARAM(name,type) output_params.Add(new SHADER_PARAM_NAMESPACE::Param(#name,SHADER_PARAM_NAMESPACE::ParamType::type)); +#define SHADER_INPUT_PARAM(mj,name,type) AddInput(mj,#name,SHADER_PARAM_NAMESPACE::ParamType::type); +#define SHADER_OUTPUT_PARAM(name,type) AddOutput(#name,SHADER_PARAM_NAMESPACE::ParamType::type)); using InputParamList=ObjectList; using OutputParamList=ObjectList; +using InputParamMapByName=Map; +using OutputParamMapByName=Map; /** - * Shader 节点是所有Shader的基础,它可以是一个简单的计算,也可以是一段复杂的函数 + * Shader 节点是所有Shader的基础,它可以是一个数据转接(纹理或流),也可以是一个纯粹的计算公式 */ class Node { @@ -23,27 +26,46 @@ class Node protected: - UTF8String name; ///<节点用户自定义名称 + UTF8String user_name; ///<节点用户自定义名称 InputParamList input_params; OutputParamList output_params; + InputParamMapByName input_params_by_name; + OutputParamMapByName output_params_by_name; + +protected: + + void AddInput (bool mj,const UTF8String &n,const param::ParamType &pt); + void AddOutput (const UTF8String &n,const param::ParamType &pt); + + param::InputParam * GetInput (const UTF8String &n) ///<根据名称获取输入参数 + {return GetListObject(input_params_by_name,n);} + + param::OutputParam *GetOutput (const UTF8String &n) ///<根据名称获取输出参数 + {return GetListObject(output_params_by_name,n);} + public: Node(const UTF8String &n){type_name=n;} + Node(const UTF8String &tn,const UTF8String &n){type_name=tn;user_name=n;} virtual ~Node()=default; const UTF8String & GetTypename ()const{return type_name;} - const UTF8String & GetName ()const{return name;} - void SetName (const UTF8String &n){name=n;} + const UTF8String & GetUsername ()const{return user_name;} + void SetUsername (const UTF8String &n){user_name=n;} + +public: //参数相关 InputParamList & GetInputParamList (){return input_params;} OutputParamList & GetOutputParamList (){return output_params;} + virtual bool JoinInput (const UTF8String &,node::Node *,const UTF8String &); + public: //参数相关 - virtual bool IsOutputParam(param::OutputParam *); + virtual bool IsOutput(param::OutputParam *); virtual bool Check(); ///<检测当前节点是否可用 };//class Node diff --git a/inc/hgl/graph/shader/node/vertex_input.h b/inc/hgl/graph/shader/node/vertex_input.h new file mode 100644 index 00000000..4c9b3328 --- /dev/null +++ b/inc/hgl/graph/shader/node/vertex_input.h @@ -0,0 +1,19 @@ +#ifndef HGL_GRAPH_SHADER_NODE_VERTEX_INPUT_INCLUDE +#define HGL_GRAPH_SHADER_NODE_VERTEX_INPUT_INCLUDE + +#include +BEGIN_SHADER_NODE_NAMESPACE +/** + * 顶点输入流节点 + */ +class VertexInput:public Node +{ +public: + + VertexInput(const UTF8String &n,const param::ParamType &pt):Node("VertexInput",n) + { + AddOutput(n,pt); + } +};//class VertexInput:public Node +END_SHADER_NODE_NAMESPACE +#endif//HGL_GRAPH_SHADER_NODE_VERTEX_INPUT_INCLUDE diff --git a/inc/hgl/graph/shader/param/in.h b/inc/hgl/graph/shader/param/in.h index 76cd4010..22bb5a7d 100644 --- a/inc/hgl/graph/shader/param/in.h +++ b/inc/hgl/graph/shader/param/in.h @@ -39,6 +39,8 @@ public: InputParam(const bool mj,const UTF8String &n,const ParamType &t):Param(n,t) { must_join=mj; + join_node=nullptr; + join_param=nullptr; } virtual ~InputParam()=default; diff --git a/src/RenderDevice/Shader/DefaultShader.cpp b/src/RenderDevice/Shader/DefaultShader.cpp index f4c90326..a6ac6373 100644 --- a/src/RenderDevice/Shader/DefaultShader.cpp +++ b/src/RenderDevice/Shader/DefaultShader.cpp @@ -1,20 +1,52 @@ -#include +#include +#include #include #include -#include +#include BEGIN_SHADER_NAMESPACE +namespace +{ + #define SHADER_VERTEX_INPUT_POSITION "Position" + + bool CreateDefaultVertexShader() + { + node::VertexFinished vs_fin_node; //创建一个vs最终节点 + + //创建一个顶点输入节点 + node::VertexInput ni( SHADER_VERTEX_INPUT_POSITION, //该节点shader名称 + param::ParamType::Float3); //该节点数据类型 + + //对接顶点输入节点到VS最终节点 + vs_fin_node.JoinInput( SHADER_VERTEX_INPUT_POSITION, //最终节点名称 + &ni, //要接入的节点 + SHADER_VERTEX_INPUT_POSITION); //要入节点的输出参数名称 (注:这里只是碰巧名字一样,所以共用一个宏) + + ShaderMaker vs_maker(&vs_fin_node); + + if(!vs_maker.Make()) + return(false); + + return(true); + } + + bool CreateDefaultFragmentVertex() + { + node::FragmentFinished fs_fin_node; + + ShaderMaker fs_maker(&fs_fin_node); + + if(!fs_maker.Make()) + return(false); + + return(true); + } +}//namespace + bool CreateDefaultMaterial() { - ShaderMaker vs_maker(new node::VertexFinished()); - - if(!vs_maker.Make()) - return(false); - - ShaderMaker fs_maker(new node::FragmentFinished()); - - if(!fs_maker.Make()) - return(false); + if(!CreateDefaultVertexShader())return(false); + if(!CreateDefaultFragmentVertex())return(false); return(true); } diff --git a/src/RenderDevice/Shader/node/shader_node.cpp b/src/RenderDevice/Shader/node/shader_node.cpp index ffe75571..0da884dc 100644 --- a/src/RenderDevice/Shader/node/shader_node.cpp +++ b/src/RenderDevice/Shader/node/shader_node.cpp @@ -1,7 +1,43 @@ #include BEGIN_SHADER_NODE_NAMESPACE -bool Node::IsOutputParam(param::OutputParam *op) +void Node::AddInput(bool mj,const UTF8String &n,const param::ParamType &pt) +{ + param::InputParam *ip=new param::InputParam(mj,n,pt); + + input_params.Add(ip); + + input_params_by_name.Add(n,ip); +} + +void Node::AddOutput(const UTF8String &n,const param::ParamType &pt) +{ + param::OutputParam *op=new param::OutputParam(n,pt); + + output_params.Add(op); + + output_params_by_name.Add(n,op); +} + +bool Node::JoinInput(const UTF8String ¶m_name,node::Node *n,const UTF8String &op_name) +{ + if(param_name.IsEmpty()||!n) + return(false); + + param::OutputParam *op=n->GetOutput(op_name); + + if(!op) + return(false); + + param::InputParam *ip=GetInput(param_name); + + if(!ip) + return(false); + + return ip->Join(n,op); +} + +bool Node::IsOutput(param::OutputParam *op) { if(!op)return(false); diff --git a/src/RenderDevice/Shader/param/shader_param_in.cpp b/src/RenderDevice/Shader/param/shader_param_in.cpp index 57c2ab99..a7848149 100644 --- a/src/RenderDevice/Shader/param/shader_param_in.cpp +++ b/src/RenderDevice/Shader/param/shader_param_in.cpp @@ -6,7 +6,7 @@ bool InputParam::Join(node::Node *n,param::OutputParam *op) { if(!n||!op)return(false); - if(!n->IsOutputParam(op)) + if(!n->IsOutput(op)) return(false); if(!JoinCheck(n,op))