improved MaterialCreateInfo::AddUBO
This commit is contained in:
parent
f8ff6d9cf0
commit
7f3132236f
@ -30,7 +30,7 @@ protected:
|
|||||||
MaterialDescriptorInfo mdi; ///<材质描述符管理器
|
MaterialDescriptorInfo mdi; ///<材质描述符管理器
|
||||||
|
|
||||||
AnsiString mi_codes; ///<MaterialInstance代码
|
AnsiString mi_codes; ///<MaterialInstance代码
|
||||||
uint32_t mi_length; ///<MaterialInstance长度
|
uint32_t mi_length; ///<MaterialInstance数据长度
|
||||||
|
|
||||||
ShaderCreateInfoMap shader_map; ///<着色器列表
|
ShaderCreateInfoMap shader_map; ///<着色器列表
|
||||||
|
|
||||||
@ -85,13 +85,7 @@ public:
|
|||||||
bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name);
|
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);
|
bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name);
|
||||||
|
|
||||||
bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType &set_type,const ShaderBufferSource &ss)
|
bool AddUBO(const uint32_t flag_bits,const DescriptorSetType &set_type,const ShaderBufferSource &ss);
|
||||||
{
|
|
||||||
if(!mdi.hasStruct(ss.struct_name))
|
|
||||||
mdi.AddStruct(ss.struct_name,ss.codes);
|
|
||||||
|
|
||||||
return AddUBO(flag_bits,set_type,ss.struct_name,ss.name);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CreateShader();
|
bool CreateShader();
|
||||||
|
|
||||||
|
@ -134,14 +134,23 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *
|
|||||||
// 一、分多次渲染,使用UBO Offset偏移UBO数据区。
|
// 一、分多次渲染,使用UBO Offset偏移UBO数据区。
|
||||||
// 二、使用SSBO,但这样会导致性能下降,所以不推荐使用。
|
// 二、使用SSBO,但这样会导致性能下降,所以不推荐使用。
|
||||||
|
|
||||||
// 但只要我们限制一个MI数据不超过64/256字节,一次渲染不超过256种材质实例,就无需解决此问题。
|
// 但我们不解决这个问题
|
||||||
|
// 我们天然要求将材质实例数据分为两个等级,同时要求一次渲染不能超过256种材质实例。
|
||||||
|
// 所以 UBO Range为16k时,实例数据不能超过64字节。UBO Range为64k时,实例数据不能超过256字节。
|
||||||
|
|
||||||
//if(desc_manager->hasSet(DescriptorSetType::PerMaterial))
|
if(desc_manager->hasSet(DescriptorSetType::PerMaterial))
|
||||||
//{
|
{
|
||||||
// data->mi_size
|
uint size;
|
||||||
// data->mi_data=new uint8[data->mi_size*256];
|
|
||||||
//}
|
if(ubo_range>=64*1024)
|
||||||
//else
|
size=64*1024;
|
||||||
|
else
|
||||||
|
size=ubo_range;
|
||||||
|
|
||||||
|
data->mi_size=0;
|
||||||
|
data->mi_data=new uint8[size];
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
data->mi_size=0;
|
data->mi_size=0;
|
||||||
data->mi_data=nullptr;
|
data->mi_data=nullptr;
|
||||||
|
@ -16,6 +16,8 @@ MaterialCreateInfo::MaterialCreateInfo(const AnsiString &n,const RenderTargetOut
|
|||||||
if(hasVertex ())shader_map.Add(vert=new ShaderCreateInfoVertex (&mdi));else vert=nullptr;
|
if(hasVertex ())shader_map.Add(vert=new ShaderCreateInfoVertex (&mdi));else vert=nullptr;
|
||||||
if(hasGeometry ())shader_map.Add(geom=new ShaderCreateInfoGeometry(&mdi));else geom=nullptr;
|
if(hasGeometry ())shader_map.Add(geom=new ShaderCreateInfoGeometry(&mdi));else geom=nullptr;
|
||||||
if(hasFragment ())shader_map.Add(frag=new ShaderCreateInfoFragment(&mdi));else frag=nullptr;
|
if(hasFragment ())shader_map.Add(frag=new ShaderCreateInfoFragment(&mdi));else frag=nullptr;
|
||||||
|
|
||||||
|
mi_length=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MaterialCreateInfo::AddStruct(const AnsiString &struct_name,const AnsiString &codes)
|
bool MaterialCreateInfo::AddStruct(const AnsiString &struct_name,const AnsiString &codes)
|
||||||
@ -97,11 +99,40 @@ bool MaterialCreateInfo::AddSampler(const VkShaderStageFlagBits flag_bit,const D
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MaterialCreateInfo::AddUBO(const uint32_t flag_bits,const DescriptorSetType &set_type,const ShaderBufferSource &ss)
|
||||||
|
{
|
||||||
|
if(flag_bits==0)return(false); //没有任何SHADER用?
|
||||||
|
|
||||||
|
if(!mdi.hasStruct(ss.struct_name))
|
||||||
|
mdi.AddStruct(ss.struct_name,ss.codes);
|
||||||
|
|
||||||
|
uint result=0;
|
||||||
|
VkShaderStageFlagBits bit;
|
||||||
|
|
||||||
|
for(uint i=0;i<shader_map.GetCount();i++)
|
||||||
|
{
|
||||||
|
shader_map.GetKey(i,bit);
|
||||||
|
|
||||||
|
if(flag_bits&bit)
|
||||||
|
if(AddUBO(bit,set_type,ss.struct_name,ss.name))
|
||||||
|
++result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(result==shader_map.GetCount());
|
||||||
|
}
|
||||||
|
|
||||||
bool MaterialCreateInfo::CreateShader()
|
bool MaterialCreateInfo::CreateShader()
|
||||||
{
|
{
|
||||||
if(shader_map.IsEmpty())
|
if(shader_map.IsEmpty())
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
|
if(mi_length>0)
|
||||||
|
{
|
||||||
|
AddUBO( shader_stage,
|
||||||
|
DescriptorSetType::Global,
|
||||||
|
mtl::SBS_MaterialInstance);
|
||||||
|
}
|
||||||
|
|
||||||
mdi.Resort();
|
mdi.Resort();
|
||||||
|
|
||||||
ShaderCreateInfo *sc,*last=nullptr;
|
ShaderCreateInfo *sc,*last=nullptr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user