split codes of ShaderGen

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-03-06 14:06:20 +08:00
parent ca36b4454b
commit 6b8e76b75f
18 changed files with 462 additions and 313 deletions

View File

@ -24,7 +24,7 @@ SET(ULRE CMCore
CMSceneGraph
CMUtil
ULRE.Util
# ULRE.ShaderGen
ULRE.ShaderGen
ULRE.SceneGraph
${HGL_GLM_LIB}
${RENDER_LIBRARY}

View File

@ -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)

View 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;
}

View 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

View File

@ -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;

View 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 &param_list,const AnsiString &codes);
};//class ShaderCreater
SHADERGEN_NAMESPACE_END
#endif//HGL_SHADER_CREATER_INCLUDE

View 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

View 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

View 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

View 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

View File

@ -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>

View File

@ -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}
)

View File

@ -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 &param_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

View 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 &param_list,const AnsiString &codes)
{
//return sdm.AddFunction(return_type,func_name,param_list,code);
}
SHADERGEN_NAMESPACE_END

View 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

View File

View 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