split codes of ShaderGen
This commit is contained in:
parent
ca36b4454b
commit
6b8e76b75f
@ -24,7 +24,7 @@ SET(ULRE CMCore
|
|||||||
CMSceneGraph
|
CMSceneGraph
|
||||||
CMUtil
|
CMUtil
|
||||||
ULRE.Util
|
ULRE.Util
|
||||||
# ULRE.ShaderGen
|
ULRE.ShaderGen
|
||||||
ULRE.SceneGraph
|
ULRE.SceneGraph
|
||||||
${HGL_GLM_LIB}
|
${HGL_GLM_LIB}
|
||||||
${RENDER_LIBRARY}
|
${RENDER_LIBRARY}
|
||||||
|
@ -5,3 +5,16 @@ SET(VULKAN_APP_FRAMEWORK ${CMAKE_CURRENT_SOURCE_DIR}/common/VulkanAppFramework.h
|
|||||||
add_subdirectory(Vulkan)
|
add_subdirectory(Vulkan)
|
||||||
add_subdirectory(2dVector)
|
add_subdirectory(2dVector)
|
||||||
add_subdirectory(GUI)
|
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/VKShaderDescriptor.h>
|
||||||
#include<hgl/graph/VKDescriptorSetType.h>
|
#include<hgl/graph/VKDescriptorSetType.h>
|
||||||
#include<hgl/shadergen/ShaderCommon.h>
|
#include<hgl/shadergen/ShaderGenNamespace.h>
|
||||||
#include<hgl/type/Map.h>
|
#include<hgl/type/Map.h>
|
||||||
|
|
||||||
using namespace hgl;
|
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
|
#pragma once
|
||||||
|
|
||||||
#include<hgl/shadergen/ShaderCommon.h>
|
#include<hgl/shadergen/ShaderGenNamespace.h>
|
||||||
#include<hgl/type/Map.h>
|
#include<hgl/type/Map.h>
|
||||||
#include<hgl/graph/VKShaderStage.h>
|
#include<hgl/graph/VKShaderStage.h>
|
||||||
#include<hgl/graph/VKDescriptorSetType.h>
|
#include<hgl/graph/VKDescriptorSetType.h>
|
||||||
|
@ -1,9 +1,29 @@
|
|||||||
set(SHADERGEN_INCLUDE_PATH ${ROOT_INCLUDE_PATH}/hgl/shadergen)
|
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}/ShaderDescriptorManager.h
|
||||||
${SHADERGEN_INCLUDE_PATH}/MaterialDescriptorManager.h
|
${SHADERGEN_INCLUDE_PATH}/MaterialDescriptorManager.h)
|
||||||
)
|
|
||||||
|
|
||||||
SET(SHADERGEN_SOURCE_FILES
|
SET(SHADERGEN_SOURCE_FILES
|
||||||
#PMC.cpp
|
#PMC.cpp
|
||||||
@ -17,4 +37,8 @@ SET(SHADERGEN_SOURCE_FILES
|
|||||||
|
|
||||||
add_cm_library(ULRE.ShaderGen "ULRE" ${SHADERGEN_HEADER_FILES}
|
add_cm_library(ULRE.ShaderGen "ULRE" ${SHADERGEN_HEADER_FILES}
|
||||||
${SHADERGEN_SOURCE_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/shadergen/MaterialCreater.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>
|
|
||||||
|
|
||||||
using namespace hgl;
|
using namespace hgl;
|
||||||
using namespace hgl::graph;
|
using namespace hgl::graph;
|
||||||
|
|
||||||
SHADERGEN_NAMESPACE_BEGIN
|
SHADERGEN_NAMESPACE_BEGIN
|
||||||
class ShaderCreater
|
MaterialCreater::MaterialCreater(const uint rc,const uint32 ss)
|
||||||
{
|
{
|
||||||
VkShaderStageFlagBits shader_stage; ///<着色器阶段
|
rt_count=rc;
|
||||||
|
shader_stage=ss;
|
||||||
|
|
||||||
public:
|
if(hasVertex ())shader_map.Add(vert=new ShaderCreaterVertex );else vert=nullptr;
|
||||||
|
if(hasGeometry ())shader_map.Add(geom=new ShaderCreaterGeometry);else geom=nullptr;
|
||||||
ShaderDescriptorManager sdm;
|
if(hasFragment ())shader_map.Add(frag=new ShaderCreaterFragment);else frag=nullptr;
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
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