split codes of ShaderGen
This commit is contained in:
parent
ca36b4454b
commit
6b8e76b75f
@ -24,7 +24,7 @@ SET(ULRE CMCore
|
||||
CMSceneGraph
|
||||
CMUtil
|
||||
ULRE.Util
|
||||
# ULRE.ShaderGen
|
||||
ULRE.ShaderGen
|
||||
ULRE.SceneGraph
|
||||
${HGL_GLM_LIB}
|
||||
${RENDER_LIBRARY}
|
||||
|
@ -5,3 +5,16 @@ SET(VULKAN_APP_FRAMEWORK ${CMAKE_CURRENT_SOURCE_DIR}/common/VulkanAppFramework.h
|
||||
add_subdirectory(Vulkan)
|
||||
add_subdirectory(2dVector)
|
||||
add_subdirectory(GUI)
|
||||
|
||||
macro(CreateProject name)
|
||||
add_executable(${name} ${ARGN})
|
||||
target_link_libraries(${name} ${ULRE})
|
||||
|
||||
IF(WIN32)
|
||||
set_target_properties(${name} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${ULRE_RUNTIME_PATH})
|
||||
ENDIF()
|
||||
|
||||
set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example")
|
||||
endmacro()
|
||||
|
||||
CreateProject(MaterialCreaterTest MaterialCreaterTest.cpp)
|
||||
|
91
example/MaterialCreaterTest.cpp
Normal file
91
example/MaterialCreaterTest.cpp
Normal file
@ -0,0 +1,91 @@
|
||||
#include<hgl/shadergen/MaterialCreater.h>
|
||||
|
||||
using namespace hgl;
|
||||
using namespace hgl::graph;
|
||||
using namespace hgl::shadergen;
|
||||
|
||||
bool PureColorMaterial()
|
||||
{
|
||||
MaterialCreater mc(1); //一个新材质,1个RT输出,默认使用Vertex/Fragment shader
|
||||
|
||||
//vertex部分
|
||||
{
|
||||
ShaderCreaterVertex *vsc=mc.GetVS(); //获取vertex shader creater
|
||||
|
||||
//以下代码会被展开为
|
||||
/*
|
||||
layout(location=?) in vec3 Position; //位置属性
|
||||
*/
|
||||
vsc->AddInput("vec3","Position"); //添加一个vec3类型的position属性输入
|
||||
|
||||
//以下代码会被展开为
|
||||
/*
|
||||
vec3 GetPosition(void)
|
||||
{
|
||||
return Position;
|
||||
}
|
||||
*/
|
||||
vsc->AddFunction("vec3","GetPosition","void","return Position;");
|
||||
|
||||
//使用缺省main函数,会产生如下代码
|
||||
/*
|
||||
void main()
|
||||
{
|
||||
gl_Position=GetPosition();
|
||||
}
|
||||
*/
|
||||
vsc->UseDefaultMain();
|
||||
}
|
||||
|
||||
//添加一个名称为ColorMaterial的UBO定义,其内部有一个vec4 color的属性
|
||||
//该代码会被展开为
|
||||
/*
|
||||
struct ColorMaterial
|
||||
{
|
||||
vec4 color;
|
||||
};
|
||||
*/
|
||||
mc.AddUBOStruct("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部分
|
||||
{
|
||||
ShaderCreaterFragment *fsc=mc.GetFS(); //获取fragment shader creater
|
||||
|
||||
//以下代码会被合并成 vec4 GetColor(/**/){return mtl.color;}
|
||||
fsc->AddFunction("vec4","GetColor","/**/","return mtl.color;");
|
||||
|
||||
//以下代码会被展开为
|
||||
/*
|
||||
layout(location=?) out vec4 Color; //颜色输出
|
||||
*/
|
||||
fsc->AddOutput("vec4","Color"); //添加一个vec4类型的color属性输出
|
||||
//同时,如果拥有多个输出,会直接根据输出的数量,DefaultMain会根据对应的Output名称,要求GetXXX()函数
|
||||
|
||||
//使用缺省main函数,会产生如下代码
|
||||
/*
|
||||
void main()
|
||||
{
|
||||
Color=GetColor();
|
||||
}
|
||||
*/
|
||||
fsc->UseDefaultMain();
|
||||
}
|
||||
|
||||
return(false);
|
||||
}
|
||||
|
||||
int MaterialCreaterTest()
|
||||
{
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
50
inc/hgl/shadergen/MaterialCreater.h
Normal file
50
inc/hgl/shadergen/MaterialCreater.h
Normal file
@ -0,0 +1,50 @@
|
||||
#pragma once
|
||||
|
||||
#include<hgl/shadergen/MaterialDescriptorManager.h>
|
||||
#include<hgl/shadergen/ShaderCreaterVertex.h>
|
||||
#include<hgl/shadergen/ShaderCreaterGeometry.h>
|
||||
#include<hgl/shadergen/ShaderCreaterFragment.h>
|
||||
#include<hgl/shadergen/ShaderCreaterMap.h>
|
||||
#include<hgl/graph/VKSamplerType.h>
|
||||
|
||||
SHADERGEN_NAMESPACE_BEGIN
|
||||
class MaterialCreater
|
||||
{
|
||||
uint rt_count; ///<输出的RT数量
|
||||
|
||||
uint32_t shader_stage; ///<着色器阶段
|
||||
|
||||
MaterialDescriptorManager MDM; ///<材质描述符管理器
|
||||
|
||||
ShaderCreaterMap shader_map; ///<着色器列表
|
||||
|
||||
ShaderCreaterVertex *vert;
|
||||
ShaderCreaterGeometry *geom;
|
||||
ShaderCreaterFragment *frag;
|
||||
|
||||
public:
|
||||
|
||||
bool hasShader(const VkShaderStageFlagBits ss)const{return shader_stage&ss;}
|
||||
|
||||
bool hasVertex ()const{return hasShader(VK_SHADER_STAGE_VERTEX_BIT);}
|
||||
// bool hasTessCtrl()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);}
|
||||
// bool hasTessEval()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);}
|
||||
bool hasGeometry()const{return hasShader(VK_SHADER_STAGE_GEOMETRY_BIT);}
|
||||
bool hasFragment()const{return hasShader(VK_SHADER_STAGE_FRAGMENT_BIT);}
|
||||
// bool hasCompute ()const{return hasShader(VK_SHADER_STAGE_COMPUTE_BIT);}
|
||||
|
||||
ShaderCreaterVertex * GetVS(){return vert;}
|
||||
ShaderCreaterGeometry * GetGS(){return geom;}
|
||||
ShaderCreaterFragment * GetFS(){return frag;}
|
||||
|
||||
public:
|
||||
|
||||
MaterialCreater(const uint rc,const uint32 ss=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||
~MaterialCreater()=default;
|
||||
|
||||
bool AddUBOStruct(const AnsiString &ubo_typename,const AnsiString &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);
|
||||
};//class MaterialCreater
|
||||
SHADERGEN_NAMESPACE_END
|
@ -2,7 +2,7 @@
|
||||
|
||||
#include<hgl/graph/VKShaderDescriptor.h>
|
||||
#include<hgl/graph/VKDescriptorSetType.h>
|
||||
#include<hgl/shadergen/ShaderCommon.h>
|
||||
#include<hgl/shadergen/ShaderGenNamespace.h>
|
||||
#include<hgl/type/Map.h>
|
||||
|
||||
using namespace hgl;
|
||||
|
39
inc/hgl/shadergen/ShaderCreater.h
Normal file
39
inc/hgl/shadergen/ShaderCreater.h
Normal file
@ -0,0 +1,39 @@
|
||||
#ifndef HGL_SHADER_CREATER_INCLUDE
|
||||
#define HGL_SHADER_CREATER_INCLUDE
|
||||
|
||||
#include<hgl/shadergen/ShaderDescriptorManager.h>
|
||||
|
||||
SHADERGEN_NAMESPACE_BEGIN
|
||||
class ShaderCreater
|
||||
{
|
||||
VkShaderStageFlagBits shader_stage; ///<着色器阶段
|
||||
|
||||
protected:
|
||||
|
||||
AnsiString main_codes;
|
||||
|
||||
public:
|
||||
|
||||
ShaderDescriptorManager sdm;
|
||||
|
||||
VkShaderStageFlagBits GetShaderStage()const{return shader_stage;}
|
||||
|
||||
public:
|
||||
|
||||
ShaderCreater(VkShaderStageFlagBits ss):sdm(ss)
|
||||
{
|
||||
shader_stage=ss;
|
||||
}
|
||||
|
||||
virtual ~ShaderCreater()=default;
|
||||
|
||||
int AddInput(const VAT &type,const AnsiString &name);
|
||||
int AddInput(const AnsiString &type,const AnsiString &name);
|
||||
|
||||
int AddOutput(const VAT &type,const AnsiString &name);
|
||||
int AddOutput(const AnsiString &type,const AnsiString &name);
|
||||
|
||||
bool AddFunction(const AnsiString &return_type,const AnsiString &func_name,const AnsiString ¶m_list,const AnsiString &codes);
|
||||
};//class ShaderCreater
|
||||
SHADERGEN_NAMESPACE_END
|
||||
#endif//HGL_SHADER_CREATER_INCLUDE
|
15
inc/hgl/shadergen/ShaderCreaterFragment.h
Normal file
15
inc/hgl/shadergen/ShaderCreaterFragment.h
Normal file
@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
#include<hgl/shadergen/ShaderCreater.h>
|
||||
|
||||
SHADERGEN_NAMESPACE_BEGIN
|
||||
class ShaderCreaterFragment:public ShaderCreater
|
||||
{
|
||||
public:
|
||||
|
||||
ShaderCreaterFragment():ShaderCreater(VK_SHADER_STAGE_FRAGMENT_BIT){}
|
||||
~ShaderCreaterFragment()=default;
|
||||
|
||||
void UseDefaultMain();
|
||||
};
|
||||
SHADERGEN_NAMESPACE_END
|
13
inc/hgl/shadergen/ShaderCreaterGeometry.h
Normal file
13
inc/hgl/shadergen/ShaderCreaterGeometry.h
Normal file
@ -0,0 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include<hgl/shadergen/ShaderCreater.h>
|
||||
|
||||
SHADERGEN_NAMESPACE_BEGIN
|
||||
class ShaderCreaterGeometry:public ShaderCreater
|
||||
{
|
||||
public:
|
||||
|
||||
ShaderCreaterGeometry():ShaderCreater(VK_SHADER_STAGE_GEOMETRY_BIT){}
|
||||
~ShaderCreaterGeometry()=default;
|
||||
};
|
||||
SHADERGEN_NAMESPACE_END
|
25
inc/hgl/shadergen/ShaderCreaterMap.h
Normal file
25
inc/hgl/shadergen/ShaderCreaterMap.h
Normal file
@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
#include<hgl/shadergen/ShaderCreater.h>
|
||||
|
||||
SHADERGEN_NAMESPACE_BEGIN
|
||||
class ShaderCreaterMap:public ObjectMap<VkShaderStageFlagBits,ShaderCreater>
|
||||
{
|
||||
public:
|
||||
|
||||
using ObjectMap<VkShaderStageFlagBits,ShaderCreater>::ObjectMap;
|
||||
|
||||
bool Add(ShaderCreater *sc)
|
||||
{
|
||||
if(!sc)return(false);
|
||||
|
||||
VkShaderStageFlagBits flag=sc->GetShaderStage();
|
||||
|
||||
if(KeyExist(flag))
|
||||
return(false);
|
||||
|
||||
ObjectMap<VkShaderStageFlagBits,ShaderCreater>::Add(flag,sc);
|
||||
return(true);
|
||||
}
|
||||
};
|
||||
SHADERGEN_NAMESPACE_END
|
15
inc/hgl/shadergen/ShaderCreaterVertex.h
Normal file
15
inc/hgl/shadergen/ShaderCreaterVertex.h
Normal file
@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
#include<hgl/shadergen/ShaderCreater.h>
|
||||
|
||||
SHADERGEN_NAMESPACE_BEGIN
|
||||
class ShaderCreaterVertex:public ShaderCreater
|
||||
{
|
||||
public:
|
||||
|
||||
ShaderCreaterVertex():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){}
|
||||
~ShaderCreaterVertex()=default;
|
||||
|
||||
void UseDefaultMain();
|
||||
};
|
||||
SHADERGEN_NAMESPACE_END
|
@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include<hgl/shadergen/ShaderCommon.h>
|
||||
#include<hgl/shadergen/ShaderGenNamespace.h>
|
||||
#include<hgl/type/Map.h>
|
||||
#include<hgl/graph/VKShaderStage.h>
|
||||
#include<hgl/graph/VKDescriptorSetType.h>
|
||||
|
@ -1,9 +1,29 @@
|
||||
set(SHADERGEN_INCLUDE_PATH ${ROOT_INCLUDE_PATH}/hgl/shadergen)
|
||||
|
||||
SET(SHADERGEN_HEADER_FILES ${SHADERGEN_INCLUDE_PATH}/ShaderCommon.h
|
||||
|
||||
SET(SHADER_CREATER_HEADER_FILES ${SHADERGEN_INCLUDE_PATH}/ShaderCreater.h
|
||||
${SHADERGEN_INCLUDE_PATH}/ShaderCreaterMap.h
|
||||
${SHADERGEN_INCLUDE_PATH}/ShaderCreaterVertex.h
|
||||
${SHADERGEN_INCLUDE_PATH}/ShaderCreaterGeometry.h
|
||||
${SHADERGEN_INCLUDE_PATH}/ShaderCreaterFragment.h)
|
||||
|
||||
SET(SHADER_CREATER_SOURCE_FILES ShaderCreater.cpp
|
||||
ShaderCreaterVertex.cpp
|
||||
ShaderCreaterGeometry.cpp
|
||||
ShaderCreaterFragment.cpp)
|
||||
|
||||
SOURCE_GROUP("Material Creater\\Shader Creater" FILES ${SHADER_CREATER_HEADER_FILES}
|
||||
${SHADER_CREATER_SOURCE_FILES})
|
||||
|
||||
SET(MATERIAL_CREATER_HEADER_FILES ${SHADERGEN_INCLUDE_PATH}/MaterialCreater.h)
|
||||
SET(MATERIAL_CREATER_SOURCE_FILES MaterialCreater.cpp)
|
||||
|
||||
SOURCE_GROUP("Material Creater" FILES ${MATERIAL_CREATER_HEADER_FILES}
|
||||
${MATERIAL_CREATER_SOURCE_FILES})
|
||||
|
||||
SET(SHADERGEN_HEADER_FILES ${SHADERGEN_INCLUDE_PATH}/ShaderGenNamespace.h
|
||||
${SHADERGEN_INCLUDE_PATH}/ShaderDescriptorManager.h
|
||||
${SHADERGEN_INCLUDE_PATH}/MaterialDescriptorManager.h
|
||||
)
|
||||
${SHADERGEN_INCLUDE_PATH}/MaterialDescriptorManager.h)
|
||||
|
||||
SET(SHADERGEN_SOURCE_FILES
|
||||
#PMC.cpp
|
||||
@ -17,4 +37,8 @@ SET(SHADERGEN_SOURCE_FILES
|
||||
|
||||
add_cm_library(ULRE.ShaderGen "ULRE" ${SHADERGEN_HEADER_FILES}
|
||||
${SHADERGEN_SOURCE_FILES}
|
||||
MaterialCreater.cpp)
|
||||
${MATERIAL_CREATER_HEADER_FILES}
|
||||
${MATERIAL_CREATER_SOURCE_FILES}
|
||||
${SHADER_CREATER_HEADER_FILES}
|
||||
${SHADER_CREATER_SOURCE_FILES}
|
||||
)
|
||||
|
@ -1,319 +1,95 @@
|
||||
#include<hgl/graph/VK.h>
|
||||
#include<hgl/type/Map.h>
|
||||
#include<hgl/graph/VKShaderStage.h>
|
||||
#include<hgl/graph/VKShaderDescriptor.h>
|
||||
#include<hgl/graph/VKDescriptorSetType.h>
|
||||
#include<hgl/shadergen/MaterialDescriptorManager.h>
|
||||
#include<hgl/shadergen/ShaderDescriptorManager.h>
|
||||
#include<hgl/graph/VKSamplerType.h>
|
||||
#include<hgl/shadergen/MaterialCreater.h>
|
||||
|
||||
using namespace hgl;
|
||||
using namespace hgl::graph;
|
||||
|
||||
SHADERGEN_NAMESPACE_BEGIN
|
||||
class ShaderCreater
|
||||
MaterialCreater::MaterialCreater(const uint rc,const uint32 ss)
|
||||
{
|
||||
VkShaderStageFlagBits shader_stage; ///<着色器阶段
|
||||
rt_count=rc;
|
||||
shader_stage=ss;
|
||||
|
||||
public:
|
||||
|
||||
ShaderDescriptorManager sdm;
|
||||
|
||||
VkShaderStageFlagBits GetShaderStage()const{return shader_stage;}
|
||||
|
||||
public:
|
||||
|
||||
ShaderCreater(VkShaderStageFlagBits ss):sdm(ss)
|
||||
{
|
||||
shader_stage=ss;
|
||||
}
|
||||
|
||||
~ShaderCreater()
|
||||
{
|
||||
}
|
||||
|
||||
int AddInput(const VAT &type,const AnsiString &name)
|
||||
{
|
||||
ShaderStage *ss=new ShaderStage;
|
||||
|
||||
hgl::strcpy(ss->name,sizeof(ss->name),name.c_str());
|
||||
|
||||
ss->basetype=(uint8) type.basetype;
|
||||
ss->vec_size= type.vec_size;
|
||||
|
||||
return sdm.AddInput(ss);
|
||||
}
|
||||
|
||||
int AddInput(const AnsiString &type,const AnsiString &name)
|
||||
{
|
||||
VAT vat;
|
||||
|
||||
if(!ParseVertexAttribType(&vat,type))
|
||||
return(-2);
|
||||
|
||||
return AddInput(vat,name);
|
||||
}
|
||||
|
||||
int AddOutput(const VAT &type,const AnsiString &name)
|
||||
{
|
||||
ShaderStage *ss=new ShaderStage;
|
||||
|
||||
hgl::strcpy(ss->name,sizeof(ss->name),name.c_str());
|
||||
|
||||
ss->basetype=(uint8) type.basetype;
|
||||
ss->vec_size= type.vec_size;
|
||||
|
||||
return sdm.AddOutput(ss);
|
||||
}
|
||||
|
||||
int AddOutput(const AnsiString &type,const AnsiString &name)
|
||||
{
|
||||
VAT vat;
|
||||
|
||||
if(!ParseVertexAttribType(&vat,type))
|
||||
return(-2);
|
||||
|
||||
return AddOutput(vat,name);
|
||||
}
|
||||
|
||||
bool AddFunction(const AnsiString &return_type,const AnsiString &func_name,const AnsiString ¶m_list,const AnsiString &codes)
|
||||
{
|
||||
//return sdm.AddFunction(return_type,func_name,param_list,code);
|
||||
}
|
||||
};
|
||||
|
||||
class ShaderCreaterMap:public ObjectMap<VkShaderStageFlagBits,ShaderCreater>
|
||||
{
|
||||
public:
|
||||
|
||||
using ObjectMap<VkShaderStageFlagBits,ShaderCreater>::ObjectMap;
|
||||
|
||||
bool Add(ShaderCreater *sc)
|
||||
{
|
||||
if(!sc)return(false);
|
||||
|
||||
VkShaderStageFlagBits flag=sc->GetShaderStage();
|
||||
|
||||
if(KeyExist(flag))
|
||||
return(false);
|
||||
|
||||
ObjectMap<VkShaderStageFlagBits,ShaderCreater>::Add(flag,sc);
|
||||
return(true);
|
||||
}
|
||||
};
|
||||
|
||||
class VertexShaderCreater:public ShaderCreater
|
||||
{
|
||||
public:
|
||||
|
||||
VertexShaderCreater():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){}
|
||||
~VertexShaderCreater()=default;
|
||||
};
|
||||
|
||||
class GeometryShaderCreater:public ShaderCreater
|
||||
{
|
||||
public:
|
||||
|
||||
GeometryShaderCreater():ShaderCreater(VK_SHADER_STAGE_GEOMETRY_BIT){}
|
||||
~GeometryShaderCreater()=default;
|
||||
};
|
||||
|
||||
class FragmentShaderCreater:public ShaderCreater
|
||||
{
|
||||
public:
|
||||
|
||||
FragmentShaderCreater():ShaderCreater(VK_SHADER_STAGE_FRAGMENT_BIT){}
|
||||
~FragmentShaderCreater()=default;
|
||||
};
|
||||
|
||||
class MaterialCreater
|
||||
{
|
||||
uint rt_count; ///<输出的RT数量
|
||||
|
||||
uint32_t shader_stage; ///<着色器阶段
|
||||
|
||||
MaterialDescriptorManager MDM; ///<材质描述符管理器
|
||||
|
||||
ShaderCreaterMap shader_map; ///<着色器列表
|
||||
|
||||
VertexShaderCreater *vert;
|
||||
GeometryShaderCreater *geom;
|
||||
FragmentShaderCreater *frag;
|
||||
|
||||
public:
|
||||
|
||||
bool hasShader(const VkShaderStageFlagBits ss)const{return shader_stage&ss;}
|
||||
|
||||
bool hasVertex ()const{return hasShader(VK_SHADER_STAGE_VERTEX_BIT);}
|
||||
// bool hasTessCtrl()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);}
|
||||
// bool hasTessEval()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);}
|
||||
bool hasGeometry()const{return hasShader(VK_SHADER_STAGE_GEOMETRY_BIT);}
|
||||
bool hasFragment()const{return hasShader(VK_SHADER_STAGE_FRAGMENT_BIT);}
|
||||
// bool hasCompute ()const{return hasShader(VK_SHADER_STAGE_COMPUTE_BIT);}
|
||||
|
||||
VertexShaderCreater * GetVS(){return vert;}
|
||||
GeometryShaderCreater * GetGS(){return geom;}
|
||||
FragmentShaderCreater * GetFS(){return frag;}
|
||||
|
||||
public:
|
||||
|
||||
MaterialCreater(const uint rc,const uint32 ss=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT)
|
||||
{
|
||||
rt_count=rc;
|
||||
shader_stage=ss;
|
||||
|
||||
if(hasVertex ())shader_map.Add(vert=new VertexShaderCreater );else vert=nullptr;
|
||||
if(hasGeometry ())shader_map.Add(geom=new GeometryShaderCreater);else geom=nullptr;
|
||||
if(hasFragment ())shader_map.Add(frag=new FragmentShaderCreater);else frag=nullptr;
|
||||
}
|
||||
|
||||
~MaterialCreater()
|
||||
{
|
||||
}
|
||||
|
||||
bool AddUBOStruct(const AnsiString &ubo_typename,const AnsiString &codes)
|
||||
{
|
||||
if(ubo_typename.IsEmpty()||codes.IsEmpty())
|
||||
return(false);
|
||||
|
||||
return MDM.AddUBOStruct(ubo_typename,codes);
|
||||
}
|
||||
|
||||
bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name)
|
||||
{
|
||||
if(!shader_map.KeyExist(flag_bits))
|
||||
return(false);
|
||||
|
||||
if(!MDM.hasUBOStruct(type_name))
|
||||
return(false);
|
||||
|
||||
ShaderCreater *sc=shader_map[flag_bits];
|
||||
|
||||
if(!sc)
|
||||
return(false);
|
||||
|
||||
UBODescriptor *ubo=MDM.GetUBO(name);
|
||||
|
||||
if(ubo)
|
||||
{
|
||||
if(ubo->type!=type_name)
|
||||
return(false);
|
||||
|
||||
ubo->stage_flag|=flag_bits;
|
||||
|
||||
return sc->sdm.AddUBO(set_type,ubo);
|
||||
}
|
||||
else
|
||||
{
|
||||
ubo=new UBODescriptor();
|
||||
|
||||
ubo->type=type_name;
|
||||
ubo->name=name;
|
||||
|
||||
return sc->sdm.AddUBO(set_type,MDM.AddUBO(flag_bits,set_type,ubo));
|
||||
}
|
||||
}
|
||||
|
||||
bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name)
|
||||
{
|
||||
if(!shader_map.KeyExist(flag_bits))
|
||||
return(false);
|
||||
|
||||
RANGE_CHECK_RETURN_FALSE(st);
|
||||
|
||||
ShaderCreater *sc=shader_map[flag_bits];
|
||||
|
||||
if(!sc)
|
||||
return(false);
|
||||
|
||||
SamplerDescriptor *sampler=MDM.GetSampler(name);
|
||||
|
||||
AnsiString st_name=GetSamplerTypeName(st);
|
||||
|
||||
if(sampler)
|
||||
{
|
||||
if(sampler->type!=st_name)
|
||||
return(false);
|
||||
|
||||
sampler->stage_flag|=flag_bits;
|
||||
|
||||
return sc->sdm.AddSampler(set_type,sampler);
|
||||
}
|
||||
else
|
||||
{
|
||||
sampler=new SamplerDescriptor();
|
||||
|
||||
sampler->type=st_name;
|
||||
sampler->name=name;
|
||||
|
||||
return sc->sdm.AddSampler(set_type,MDM.AddSampler(flag_bits,set_type,sampler));
|
||||
}
|
||||
}
|
||||
};//class MaterialCreater
|
||||
|
||||
#ifdef _DEBUG
|
||||
bool PureColorMaterial()
|
||||
{
|
||||
MaterialCreater mc(1); //一个新材质,1个RT输出,默认使用Vertex/Fragment shader
|
||||
|
||||
//vertex部分
|
||||
{
|
||||
VertexShaderCreater *vsc=mc.GetVS(); //获取vertex shader creater
|
||||
|
||||
//以下代码会被展开为
|
||||
/*
|
||||
layout(location=?) in vec3 Position; //位置属性
|
||||
*/
|
||||
vsc->AddInput("vec3","Position"); //添加一个vec3类型的position属性输入
|
||||
|
||||
//以下代码会被展开为
|
||||
/*
|
||||
vec3 GetPosition(void)
|
||||
{
|
||||
return Position;
|
||||
}
|
||||
*/
|
||||
vsc->AddFunction("vec3","GetPosition","void","return Position;");
|
||||
}
|
||||
|
||||
//添加一个名称为ColorMaterial的UBO定义,其内部有一个vec4 color的属性
|
||||
//该代码会被展开为
|
||||
/*
|
||||
struct ColorMaterial
|
||||
{
|
||||
vec4 color;
|
||||
};
|
||||
*/
|
||||
mc.AddUBOStruct("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部分
|
||||
{
|
||||
FragmentShaderCreater *fsc=mc.GetFS(); //获取fragment shader creater
|
||||
|
||||
//以下代码会被合并成 vec4 GetColor(/**/){return mtl.color;}
|
||||
fsc->AddFunction("vec4","GetColor","/**/","return mtl.color;");
|
||||
|
||||
fsc->AddOutput("vec4","Color"); //添加一个vec4类型的color属性输出
|
||||
|
||||
}
|
||||
|
||||
return(false);
|
||||
if(hasVertex ())shader_map.Add(vert=new ShaderCreaterVertex );else vert=nullptr;
|
||||
if(hasGeometry ())shader_map.Add(geom=new ShaderCreaterGeometry);else geom=nullptr;
|
||||
if(hasFragment ())shader_map.Add(frag=new ShaderCreaterFragment);else frag=nullptr;
|
||||
}
|
||||
|
||||
int MaterialCreaterTest()
|
||||
bool MaterialCreater::AddUBOStruct(const AnsiString &ubo_typename,const AnsiString &codes)
|
||||
{
|
||||
|
||||
if(ubo_typename.IsEmpty()||codes.IsEmpty())
|
||||
return(false);
|
||||
|
||||
return 0;
|
||||
return MDM.AddUBOStruct(ubo_typename,codes);
|
||||
}
|
||||
|
||||
bool MaterialCreater::AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name)
|
||||
{
|
||||
if(!shader_map.KeyExist(flag_bits))
|
||||
return(false);
|
||||
|
||||
if(!MDM.hasUBOStruct(type_name))
|
||||
return(false);
|
||||
|
||||
ShaderCreater *sc=shader_map[flag_bits];
|
||||
|
||||
if(!sc)
|
||||
return(false);
|
||||
|
||||
UBODescriptor *ubo=MDM.GetUBO(name);
|
||||
|
||||
if(ubo)
|
||||
{
|
||||
if(ubo->type!=type_name)
|
||||
return(false);
|
||||
|
||||
ubo->stage_flag|=flag_bits;
|
||||
|
||||
return sc->sdm.AddUBO(set_type,ubo);
|
||||
}
|
||||
else
|
||||
{
|
||||
ubo=new UBODescriptor();
|
||||
|
||||
ubo->type=type_name;
|
||||
ubo->name=name;
|
||||
|
||||
return sc->sdm.AddUBO(set_type,MDM.AddUBO(flag_bits,set_type,ubo));
|
||||
}
|
||||
}
|
||||
|
||||
bool MaterialCreater::AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name)
|
||||
{
|
||||
if(!shader_map.KeyExist(flag_bits))
|
||||
return(false);
|
||||
|
||||
RANGE_CHECK_RETURN_FALSE(st);
|
||||
|
||||
ShaderCreater *sc=shader_map[flag_bits];
|
||||
|
||||
if(!sc)
|
||||
return(false);
|
||||
|
||||
SamplerDescriptor *sampler=MDM.GetSampler(name);
|
||||
|
||||
AnsiString st_name=GetSamplerTypeName(st);
|
||||
|
||||
if(sampler)
|
||||
{
|
||||
if(sampler->type!=st_name)
|
||||
return(false);
|
||||
|
||||
sampler->stage_flag|=flag_bits;
|
||||
|
||||
return sc->sdm.AddSampler(set_type,sampler);
|
||||
}
|
||||
else
|
||||
{
|
||||
sampler=new SamplerDescriptor();
|
||||
|
||||
sampler->type=st_name;
|
||||
sampler->name=name;
|
||||
|
||||
return sc->sdm.AddSampler(set_type,MDM.AddSampler(flag_bits,set_type,sampler));
|
||||
}
|
||||
}
|
||||
#endif//_DEBUG
|
||||
SHADERGEN_NAMESPACE_END
|
||||
|
52
src/ShaderGen/ShaderCreater.cpp
Normal file
52
src/ShaderGen/ShaderCreater.cpp
Normal file
@ -0,0 +1,52 @@
|
||||
#include<hgl/shadergen/ShaderCreater.h>
|
||||
|
||||
SHADERGEN_NAMESPACE_BEGIN
|
||||
int ShaderCreater::AddInput(const VAT &type,const AnsiString &name)
|
||||
{
|
||||
ShaderStage *ss=new ShaderStage;
|
||||
|
||||
hgl::strcpy(ss->name,sizeof(ss->name),name.c_str());
|
||||
|
||||
ss->basetype=(uint8) type.basetype;
|
||||
ss->vec_size= type.vec_size;
|
||||
|
||||
return sdm.AddInput(ss);
|
||||
}
|
||||
|
||||
int ShaderCreater::AddInput(const AnsiString &type,const AnsiString &name)
|
||||
{
|
||||
VAT vat;
|
||||
|
||||
if(!ParseVertexAttribType(&vat,type))
|
||||
return(-2);
|
||||
|
||||
return AddInput(vat,name);
|
||||
}
|
||||
|
||||
int ShaderCreater::AddOutput(const VAT &type,const AnsiString &name)
|
||||
{
|
||||
ShaderStage *ss=new ShaderStage;
|
||||
|
||||
hgl::strcpy(ss->name,sizeof(ss->name),name.c_str());
|
||||
|
||||
ss->basetype=(uint8) type.basetype;
|
||||
ss->vec_size= type.vec_size;
|
||||
|
||||
return sdm.AddOutput(ss);
|
||||
}
|
||||
|
||||
int ShaderCreater::AddOutput(const AnsiString &type,const AnsiString &name)
|
||||
{
|
||||
VAT vat;
|
||||
|
||||
if(!ParseVertexAttribType(&vat,type))
|
||||
return(-2);
|
||||
|
||||
return AddOutput(vat,name);
|
||||
}
|
||||
|
||||
bool ShaderCreater::AddFunction(const AnsiString &return_type,const AnsiString &func_name,const AnsiString ¶m_list,const AnsiString &codes)
|
||||
{
|
||||
//return sdm.AddFunction(return_type,func_name,param_list,code);
|
||||
}
|
||||
SHADERGEN_NAMESPACE_END
|
23
src/ShaderGen/ShaderCreaterFragment.cpp
Normal file
23
src/ShaderGen/ShaderCreaterFragment.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
#include<hgl/shadergen/ShaderCreaterFragment.h>
|
||||
|
||||
SHADERGEN_NAMESPACE_BEGIN
|
||||
|
||||
void ShaderCreaterFragment::UseDefaultMain()
|
||||
{
|
||||
main_codes="void main()\n{\n";
|
||||
|
||||
const auto &output_list=sdm.GetShaderStageIO().output;
|
||||
|
||||
const uint count=output_list.GetCount();
|
||||
for(uint i=0;i<count;i++)
|
||||
{
|
||||
main_codes+="\t";
|
||||
main_codes+=output_list[i]->name;
|
||||
main_codes+="=Get";
|
||||
main_codes+=output_list[i]->name;
|
||||
main_codes+="();\n";
|
||||
}
|
||||
|
||||
main_codes+="}";
|
||||
}
|
||||
SHADERGEN_NAMESPACE_END
|
0
src/ShaderGen/ShaderCreaterGeometry.cpp
Normal file
0
src/ShaderGen/ShaderCreaterGeometry.cpp
Normal file
13
src/ShaderGen/ShaderCreaterVertex.cpp
Normal file
13
src/ShaderGen/ShaderCreaterVertex.cpp
Normal file
@ -0,0 +1,13 @@
|
||||
#include<hgl/shadergen/ShaderCreaterVertex.h>
|
||||
|
||||
SHADERGEN_NAMESPACE_BEGIN
|
||||
|
||||
void ShaderCreaterVertex::UseDefaultMain()
|
||||
{
|
||||
main_codes=R"(
|
||||
void main()
|
||||
{
|
||||
gl_Position=GetPosition();
|
||||
})";
|
||||
}
|
||||
SHADERGEN_NAMESPACE_END
|
Loading…
x
Reference in New Issue
Block a user