improved MaterialCreateInfo::AddUBO
This commit is contained in:
parent
f8ff6d9cf0
commit
7f3132236f
@ -30,7 +30,7 @@ protected:
|
||||
MaterialDescriptorInfo mdi; ///<材质描述符管理器
|
||||
|
||||
AnsiString mi_codes; ///<MaterialInstance代码
|
||||
uint32_t mi_length; ///<MaterialInstance长度
|
||||
uint32_t mi_length; ///<MaterialInstance数据长度
|
||||
|
||||
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 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)
|
||||
{
|
||||
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 AddUBO(const uint32_t flag_bits,const DescriptorSetType &set_type,const ShaderBufferSource &ss);
|
||||
|
||||
bool CreateShader();
|
||||
|
||||
|
@ -134,14 +134,23 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *
|
||||
// 一、分多次渲染,使用UBO Offset偏移UBO数据区。
|
||||
// 二、使用SSBO,但这样会导致性能下降,所以不推荐使用。
|
||||
|
||||
// 但只要我们限制一个MI数据不超过64/256字节,一次渲染不超过256种材质实例,就无需解决此问题。
|
||||
// 但我们不解决这个问题
|
||||
// 我们天然要求将材质实例数据分为两个等级,同时要求一次渲染不能超过256种材质实例。
|
||||
// 所以 UBO Range为16k时,实例数据不能超过64字节。UBO Range为64k时,实例数据不能超过256字节。
|
||||
|
||||
//if(desc_manager->hasSet(DescriptorSetType::PerMaterial))
|
||||
//{
|
||||
// data->mi_size
|
||||
// data->mi_data=new uint8[data->mi_size*256];
|
||||
//}
|
||||
//else
|
||||
if(desc_manager->hasSet(DescriptorSetType::PerMaterial))
|
||||
{
|
||||
uint size;
|
||||
|
||||
if(ubo_range>=64*1024)
|
||||
size=64*1024;
|
||||
else
|
||||
size=ubo_range;
|
||||
|
||||
data->mi_size=0;
|
||||
data->mi_data=new uint8[size];
|
||||
}
|
||||
else
|
||||
{
|
||||
data->mi_size=0;
|
||||
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(hasGeometry ())shader_map.Add(geom=new ShaderCreateInfoGeometry(&mdi));else geom=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)
|
||||
@ -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()
|
||||
{
|
||||
if(shader_map.IsEmpty())
|
||||
return(false);
|
||||
|
||||
if(mi_length>0)
|
||||
{
|
||||
AddUBO( shader_stage,
|
||||
DescriptorSetType::Global,
|
||||
mtl::SBS_MaterialInstance);
|
||||
}
|
||||
|
||||
mdi.Resort();
|
||||
|
||||
ShaderCreateInfo *sc,*last=nullptr;
|
||||
|
Loading…
x
Reference in New Issue
Block a user