supported MaterialInstance in ShaderGen module.
This commit is contained in:
parent
d5b719152f
commit
fa7ecb91ac
@ -42,7 +42,9 @@ vec3 world_up;
|
||||
float znear,zfar;)"
|
||||
};
|
||||
|
||||
constexpr const ShaderBufferSource SBS_MaterialInstance=
|
||||
constexpr const char MaterialInstanceStruct[]="MaterialInstance";
|
||||
|
||||
constexpr const ShaderBufferSource SBS_MaterialInstanceData=
|
||||
{
|
||||
"MaterialInstanceData",
|
||||
"mtl",
|
||||
|
@ -52,23 +52,7 @@ public:
|
||||
MaterialCreateInfo(const MaterialConfig *);
|
||||
~MaterialCreateInfo()=default;
|
||||
|
||||
/**
|
||||
* 设置材质实例代码与数据长度
|
||||
* @param mi_glsl_codes 材质实例GLSL代码
|
||||
* @param mi_struct_bytes 单个材质实例数据长度
|
||||
* @return 是否设置成功
|
||||
*/
|
||||
bool SetMaterialInstance(const AnsiString &mi_glsl_codes,const uint32_t mi_struct_bytes)
|
||||
{
|
||||
if(mi_struct_bytes>0&&mi_glsl_codes.Length()<4)return(false);
|
||||
|
||||
mi_length=mi_struct_bytes;
|
||||
|
||||
if(mi_struct_bytes>0)
|
||||
mi_codes=mi_glsl_codes;
|
||||
|
||||
return(true);
|
||||
}
|
||||
bool SetMaterialInstance(const AnsiString &mi_glsl_codes,const uint32_t mi_struct_bytes,const uint32_t shader_stage);
|
||||
|
||||
bool AddStruct(const AnsiString &ubo_typename,const AnsiString &codes);
|
||||
bool AddStruct(const ShaderBufferSource &ss)
|
||||
|
@ -28,7 +28,7 @@ public:
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool GetStruct(const AnsiString &name,AnsiString &code) const
|
||||
bool GetStruct(const AnsiString &name,AnsiString &code)
|
||||
{
|
||||
return(struct_map.Get(name,code));
|
||||
}
|
||||
@ -38,8 +38,8 @@ public:
|
||||
return(struct_map.KeyExist(name));
|
||||
}
|
||||
|
||||
const UBODescriptor *AddUBO(VkShaderStageFlagBits ssb,DescriptorSetType set_type,UBODescriptor *sd);
|
||||
const SamplerDescriptor *AddSampler(VkShaderStageFlagBits ssb,DescriptorSetType set_type,SamplerDescriptor *sd);
|
||||
const UBODescriptor *AddUBO(uint32_t shader_stage_flag_bits,DescriptorSetType set_type,UBODescriptor *sd);
|
||||
const SamplerDescriptor *AddSampler(uint32_t shader_stage_flag_bits,DescriptorSetType set_type,SamplerDescriptor *sd);
|
||||
|
||||
UBODescriptor *GetUBO(const AnsiString &name);
|
||||
SamplerDescriptor *GetSampler(const AnsiString &name);
|
||||
|
@ -13,6 +13,8 @@ struct SPVData;
|
||||
class MaterialDescriptorInfo;
|
||||
class ShaderDescriptorInfo;
|
||||
|
||||
struct UBODescriptor;
|
||||
|
||||
class ShaderCreateInfo
|
||||
{
|
||||
protected:
|
||||
@ -63,6 +65,8 @@ public:
|
||||
|
||||
void AddFunction(const AnsiString &str){function_list.Add(str);}
|
||||
|
||||
void SetMaterialInstance(UBODescriptor *);
|
||||
|
||||
const AnsiString &GetOutputStruct()const{return output_struct;}
|
||||
const AnsiString &GetShaderSource()const{return final_shader;}
|
||||
|
||||
|
@ -19,28 +19,9 @@ namespace hgl
|
||||
int AddInput(const graph::VAT &type,const AnsiString &name,const VkVertexInputRate input_rate=VK_VERTEX_INPUT_RATE_VERTEX,const VertexInputGroup &group=VertexInputGroup::Basic);
|
||||
int AddInput(const AnsiString &type,const AnsiString &name,const VkVertexInputRate input_rate=VK_VERTEX_INPUT_RATE_VERTEX,const VertexInputGroup &group=VertexInputGroup::Basic);
|
||||
|
||||
void AddMaterialID()
|
||||
{
|
||||
AddInput(VAT_UINT,VAN::MaterialInstanceID,VK_VERTEX_INPUT_RATE_INSTANCE,VertexInputGroup::MaterialInstanceID);
|
||||
}
|
||||
|
||||
void AddJoint()
|
||||
{
|
||||
AddInput(VAT_UVEC4, VAN::JointID, VK_VERTEX_INPUT_RATE_VERTEX,VertexInputGroup::JointID);
|
||||
AddInput(VAT_VEC4, VAN::JointWeight,VK_VERTEX_INPUT_RATE_VERTEX,VertexInputGroup::JointWeight);
|
||||
}
|
||||
|
||||
void AddLocalToWorld()
|
||||
{
|
||||
char name[]= "LocalToWorld_?";
|
||||
|
||||
for(uint i=0;i<4;i++)
|
||||
{
|
||||
name[sizeof(name)-2]='0'+i;
|
||||
|
||||
AddInput(VAT_VEC4,name,VK_VERTEX_INPUT_RATE_INSTANCE,VertexInputGroup::LocalToWorld);
|
||||
}
|
||||
}
|
||||
void AddMaterialInstanceID();
|
||||
void AddJoint();
|
||||
void AddLocalToWorld();
|
||||
};//class ShaderCreateInfoVertex:public ShaderCreateInfo
|
||||
}//namespace graph
|
||||
}//namespace hgl::graph
|
||||
|
@ -3,7 +3,6 @@
|
||||
#include<hgl/graph/mtl/2d/Material2DConfig.h>
|
||||
#include<hgl/graph/mtl/UBOCommon.h>
|
||||
#include"common/MFGetPosition.h"
|
||||
#include"common/MFCommon.h"
|
||||
|
||||
STD_MTL_NAMESPACE_BEGIN
|
||||
Std2DMaterial::Std2DMaterial(const Material2DConfig *c)
|
||||
@ -23,7 +22,6 @@ bool Std2DMaterial::CreateVertexShader(ShaderCreateInfoVertex *vsc)
|
||||
if(cfg->local_to_world)
|
||||
{
|
||||
vsc->AddLocalToWorld();
|
||||
vsc->AddFunction(func::GetLocalToWorld);
|
||||
|
||||
vsc->AddFunction(func::GetPosition2DL2W[size_t(cfg->coordinate_system)]);
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include<hgl/shadergen/MaterialCreateInfo.h>
|
||||
#include<hgl/shadergen/ShaderDescriptorInfo.h>
|
||||
#include<hgl/graph/mtl/UBOCommon.h>
|
||||
#include"common/MFCommon.h"
|
||||
|
||||
using namespace hgl;
|
||||
using namespace hgl::graph;
|
||||
@ -118,18 +119,54 @@ bool MaterialCreateInfo::AddUBO(const uint32_t flag_bits,const DescriptorSetType
|
||||
return(result==shader_map.GetCount());
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置材质实例代码与数据长度
|
||||
* @param mi_glsl_codes 材质实例GLSL代码
|
||||
* @param mi_struct_bytes 单个材质实例数据长度
|
||||
* @param shader_stage 具体使用材质实例的shader
|
||||
* @return 是否设置成功
|
||||
*/
|
||||
bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &mi_glsl_codes,const uint32_t mi_struct_bytes,const uint32_t shader_stage)
|
||||
{
|
||||
if(mi_length>0)return(false); //已经有数据了
|
||||
|
||||
if(shader_stage==0)return(false);
|
||||
|
||||
if(mi_struct_bytes>0&&mi_glsl_codes.Length()<4)return(false);
|
||||
|
||||
mi_length=mi_struct_bytes;
|
||||
|
||||
if(mi_struct_bytes>0)
|
||||
mi_codes=mi_glsl_codes;
|
||||
|
||||
mdi.AddStruct(MaterialInstanceStruct,mi_codes);
|
||||
|
||||
UBODescriptor *ubo=new UBODescriptor();
|
||||
|
||||
ubo->type=SBS_MaterialInstanceData.struct_name;
|
||||
hgl::strcpy(ubo->name,DESCRIPTOR_NAME_MAX_LENGTH,SBS_MaterialInstanceData.name);
|
||||
ubo->stage_flag=shader_stage;
|
||||
|
||||
mdi.AddUBO(shader_stage,DescriptorSetType::PerMaterial,ubo);
|
||||
|
||||
auto *it=shader_map.GetDataList();
|
||||
|
||||
for(int i=0;i<shader_map.GetCount();i++)
|
||||
{
|
||||
if((*it)->key&shader_stage)
|
||||
(*it)->value->SetMaterialInstance(ubo);
|
||||
}
|
||||
|
||||
vert->AddMaterialInstanceID(); //增加一个材质实例ID
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool MaterialCreateInfo::CreateShader()
|
||||
{
|
||||
if(shader_map.IsEmpty())
|
||||
return(false);
|
||||
|
||||
if(mi_length>0)
|
||||
{
|
||||
AddUBO( config->shader_stage,
|
||||
DescriptorSetType::Global,
|
||||
mtl::SBS_MaterialInstance);
|
||||
}
|
||||
|
||||
mdi.Resort();
|
||||
|
||||
ShaderCreateInfo *sc,*last=nullptr;
|
||||
|
@ -27,7 +27,7 @@ const DescriptorSetType MaterialDescriptorInfo::GetSetType(const AnsiString &nam
|
||||
return DescriptorSetType::Global;
|
||||
}
|
||||
|
||||
const UBODescriptor *MaterialDescriptorInfo::AddUBO(VkShaderStageFlagBits ssb,DescriptorSetType set_type,UBODescriptor *sd)
|
||||
const UBODescriptor *MaterialDescriptorInfo::AddUBO(uint32_t ssb,DescriptorSetType set_type,UBODescriptor *sd)
|
||||
{
|
||||
RANGE_CHECK_RETURN_NULLPTR(set_type);
|
||||
if(!sd)return(nullptr);
|
||||
@ -40,7 +40,7 @@ const UBODescriptor *MaterialDescriptorInfo::AddUBO(VkShaderStageFlagBits ssb,De
|
||||
return((UBODescriptor *)obj);
|
||||
}
|
||||
|
||||
const SamplerDescriptor *MaterialDescriptorInfo::AddSampler(VkShaderStageFlagBits ssb,DescriptorSetType set_type,SamplerDescriptor *sd)
|
||||
const SamplerDescriptor *MaterialDescriptorInfo::AddSampler(uint32_t ssb,DescriptorSetType set_type,SamplerDescriptor *sd)
|
||||
{
|
||||
RANGE_CHECK_RETURN_NULLPTR(set_type);
|
||||
if(!sd)return(nullptr);
|
||||
|
@ -1,6 +1,8 @@
|
||||
#include<hgl/shadergen/ShaderCreateInfo.h>
|
||||
#include<hgl/shadergen/ShaderDescriptorInfo.h>
|
||||
#include"GLSLCompiler.h"
|
||||
#include<hgl/graph/mtl/UBOCommon.h>
|
||||
#include"common/MFCommon.h"
|
||||
|
||||
namespace hgl{namespace graph{
|
||||
ShaderCreateInfo::ShaderCreateInfo(VkShaderStageFlagBits ss,MaterialDescriptorInfo *m)
|
||||
@ -74,6 +76,13 @@ bool ShaderCreateInfo::ProcSubpassInput()
|
||||
return(true);
|
||||
}
|
||||
|
||||
void ShaderCreateInfo::SetMaterialInstance(UBODescriptor *ubo)
|
||||
{
|
||||
sdm->AddUBO(DescriptorSetType::PerMaterial,ubo);
|
||||
sdm->AddStruct(mtl::MaterialInstanceStruct);
|
||||
AddFunction(mtl::func::GetMI);
|
||||
}
|
||||
|
||||
bool ShaderCreateInfo::ProcInput(ShaderCreateInfo *last_sc)
|
||||
{
|
||||
if(!last_sc)
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include<hgl/graph/VertexAttrib.h>
|
||||
#include<hgl/graph/VKShaderStage.h>
|
||||
#include"GLSLCompiler.h"
|
||||
#include"common/MFCommon.h"
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
int ShaderCreateInfoVertex::AddInput(const VAT &type,const AnsiString &name,const VkVertexInputRate input_rate,const VertexInputGroup &group)
|
||||
@ -30,6 +31,33 @@ int ShaderCreateInfoVertex::AddInput(const AnsiString &type,const AnsiString &na
|
||||
return AddInput(vat,name,input_rate,group);
|
||||
}
|
||||
|
||||
void ShaderCreateInfoVertex::AddMaterialInstanceID()
|
||||
{
|
||||
AddInput(VAT_UINT, VAN::MaterialInstanceID,VK_VERTEX_INPUT_RATE_INSTANCE,VertexInputGroup::MaterialInstanceID);
|
||||
|
||||
AddFunction(mtl::func::HandoverMI);
|
||||
}
|
||||
|
||||
void ShaderCreateInfoVertex::AddJoint()
|
||||
{
|
||||
AddInput(VAT_UVEC4, VAN::JointID, VK_VERTEX_INPUT_RATE_VERTEX,VertexInputGroup::JointID);
|
||||
AddInput(VAT_VEC4, VAN::JointWeight,VK_VERTEX_INPUT_RATE_VERTEX,VertexInputGroup::JointWeight);
|
||||
}
|
||||
|
||||
void ShaderCreateInfoVertex::AddLocalToWorld()
|
||||
{
|
||||
char name[]= "LocalToWorld_?";
|
||||
|
||||
for(uint i=0;i<4;i++)
|
||||
{
|
||||
name[sizeof(name)-2]='0'+i;
|
||||
|
||||
AddInput(VAT_VEC4,name,VK_VERTEX_INPUT_RATE_INSTANCE,VertexInputGroup::LocalToWorld);
|
||||
}
|
||||
|
||||
AddFunction(mtl::func::GetLocalToWorld);
|
||||
}
|
||||
|
||||
bool ShaderCreateInfoVertex::ProcInput(ShaderCreateInfo *)
|
||||
{
|
||||
const auto &input=sdm->GetShaderStageIO().input;
|
||||
|
@ -35,7 +35,6 @@ void HandoverMI()
|
||||
MaterialInstance GetMI()
|
||||
{
|
||||
return mtl.mi[Input.MaterialInstanceID];
|
||||
}
|
||||
)";
|
||||
})";
|
||||
}//namespace func
|
||||
STD_MTL_NAMESPACE_END
|
||||
|
Loading…
x
Reference in New Issue
Block a user