added SortedSets<MaterialInstance *> at RenderNode.h/.cpp
This commit is contained in:
parent
d5b69fbe71
commit
aa217c6fc5
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include<hgl/math/Math.h>
|
#include<hgl/math/Math.h>
|
||||||
#include<hgl/type/Map.h>
|
#include<hgl/type/Map.h>
|
||||||
|
#include<hgl/type/SortedSets.h>
|
||||||
#include<hgl/graph/VK.h>
|
#include<hgl/graph/VK.h>
|
||||||
namespace hgl
|
namespace hgl
|
||||||
{
|
{
|
||||||
@ -55,6 +56,7 @@ namespace hgl
|
|||||||
void Set(Renderable *);
|
void Set(Renderable *);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SortedSets<MaterialInstance *> mi_set;
|
||||||
List<RenderItem> ri_list;
|
List<RenderItem> ri_list;
|
||||||
uint ri_count;
|
uint ri_count;
|
||||||
|
|
||||||
|
@ -64,8 +64,6 @@ public:
|
|||||||
|
|
||||||
bool SetMaterialInstance(const AnsiString &codes,const uint32_t length)
|
bool SetMaterialInstance(const AnsiString &codes,const uint32_t length)
|
||||||
{
|
{
|
||||||
if(length>64)return(false);
|
|
||||||
|
|
||||||
if(length>0&&codes.Length()<4)return(false);
|
if(length>0&&codes.Length()<4)return(false);
|
||||||
|
|
||||||
mi_length=length;
|
mi_length=length;
|
||||||
|
@ -58,15 +58,38 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
namespace graph
|
namespace graph
|
||||||
{
|
{
|
||||||
|
// ubo_range大致分为三档:
|
||||||
|
//
|
||||||
|
// 16k: Mali-T系列或更早、Mali-G71、nVidia GeForce RTX 3070 Laptop为16k
|
||||||
|
//
|
||||||
|
// 64k: 大部分手机与PC均为64k
|
||||||
|
//
|
||||||
|
// >64k: Intel 核显与 PowerVR 为128MB,AMD显卡为4GB,可视为随显存无上限。
|
||||||
|
//
|
||||||
|
// 我们使用uint8类型在vertex input中保存MaterialInstance ID,表示范围0-255。
|
||||||
|
// 所以MaterialInstance结构容量按16k/64k分为两个档次,64字节和256字节
|
||||||
|
|
||||||
|
// 如果一定要使用超过16K/64K硬件限制的容量,有两种办法
|
||||||
|
// 一、分多次渲染,使用UBO Offset偏移UBO数据区。
|
||||||
|
// 二、使用SSBO,但这样会导致性能下降,所以不推荐使用。
|
||||||
|
|
||||||
|
// 但我们不解决这个问题
|
||||||
|
// 我们天然要求将材质实例数据分为两个等级,同时要求一次渲染不能超过256种材质实例。
|
||||||
|
// 所以 UBO Range为16k时,实例数据不能超过64字节。UBO Range为64k时,实例数据不能超过256字节。
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 2D渲染节点额外提供的VBO数据
|
* 渲染节点额外提供的数据
|
||||||
*/
|
*/
|
||||||
struct RenderNodeExtraBuffer
|
struct RenderNodeExtraBuffer
|
||||||
{
|
{
|
||||||
uint count;
|
uint node_count; ///<渲染节点数量
|
||||||
|
uint mi_count; ///<材质实例数量
|
||||||
|
|
||||||
|
uint mi_size; ///<单个材质实例数量长度
|
||||||
|
DeviceBuffer *mi_data_buffer; ///<材质实例数据UBO
|
||||||
|
|
||||||
VBO *mi_id;
|
VBO *mi_id;
|
||||||
VkBuffer *mi_id_buffer;
|
VkBuffer mi_id_buffer;
|
||||||
|
|
||||||
VBO *bone_id,*bone_weight;
|
VBO *bone_id,*bone_weight;
|
||||||
VkBuffer bone_id_buffer,bone_weight_buffer;
|
VkBuffer bone_id_buffer,bone_weight_buffer;
|
||||||
@ -89,6 +112,7 @@ namespace hgl
|
|||||||
void Clear()
|
void Clear()
|
||||||
{
|
{
|
||||||
SAFE_CLEAR(mi_id)
|
SAFE_CLEAR(mi_id)
|
||||||
|
SAFE_CLEAR(mi_data_buffer);
|
||||||
|
|
||||||
SAFE_CLEAR(bone_id)
|
SAFE_CLEAR(bone_id)
|
||||||
SAFE_CLEAR(bone_weight)
|
SAFE_CLEAR(bone_weight)
|
||||||
@ -97,21 +121,33 @@ namespace hgl
|
|||||||
SAFE_CLEAR(l2w_vbo[1])
|
SAFE_CLEAR(l2w_vbo[1])
|
||||||
SAFE_CLEAR(l2w_vbo[2])
|
SAFE_CLEAR(l2w_vbo[2])
|
||||||
SAFE_CLEAR(l2w_vbo[3])
|
SAFE_CLEAR(l2w_vbo[3])
|
||||||
count=0;
|
node_count=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Alloc(GPUDevice *dev,const uint c)
|
void NodeAlloc(GPUDevice *dev,const uint c)
|
||||||
{
|
{
|
||||||
Clear();
|
Clear();
|
||||||
count=power_to_2(c);
|
node_count=power_to_2(c);
|
||||||
|
|
||||||
for(uint i=0;i<4;i++)
|
for(uint i=0;i<4;i++)
|
||||||
{
|
{
|
||||||
l2w_vbo[i]=dev->CreateVBO(VF_V4F,count);
|
l2w_vbo[i]=dev->CreateVBO(VF_V4F,node_count);
|
||||||
l2w_buffer[i]=l2w_vbo[i]->GetBuffer();
|
l2w_buffer[i]=l2w_vbo[i]->GetBuffer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MIAlloc(GPUDevice *dev,const uint c)
|
||||||
|
{
|
||||||
|
if(c<=0||mi_size<=0)return;
|
||||||
|
|
||||||
|
mi_count=power_to_2(c);
|
||||||
|
|
||||||
|
mi_id=dev->CreateVBO(VF_V1U8,mi_count);
|
||||||
|
mi_id_buffer=mi_id->GetBuffer();
|
||||||
|
|
||||||
|
mi_data_buffer=dev->CreateUBO(mi_count*mi_size);
|
||||||
|
}
|
||||||
|
|
||||||
void WriteData(RenderNode *render_node,const uint count)
|
void WriteData(RenderNode *render_node,const uint count)
|
||||||
{
|
{
|
||||||
RenderNode *rn;
|
RenderNode *rn;
|
||||||
@ -185,12 +221,14 @@ namespace hgl
|
|||||||
if(!extra_buffer)
|
if(!extra_buffer)
|
||||||
extra_buffer=new RenderNodeExtraBuffer;
|
extra_buffer=new RenderNodeExtraBuffer;
|
||||||
|
|
||||||
if(extra_buffer->count<count)
|
if(extra_buffer->node_count<count)
|
||||||
extra_buffer->Alloc(device,count);
|
extra_buffer->NodeAlloc(device,count);
|
||||||
|
|
||||||
//写入数据
|
//写入数据
|
||||||
extra_buffer->WriteData(rn_list.GetData(),count);
|
extra_buffer->WriteData(rn_list.GetData(),count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Stat();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MaterialRenderList::RenderItem::Set(Renderable *ri)
|
void MaterialRenderList::RenderItem::Set(Renderable *ri)
|
||||||
@ -208,6 +246,8 @@ namespace hgl
|
|||||||
ri_list.ClearData();
|
ri_list.ClearData();
|
||||||
ri_list.PreMalloc(count);
|
ri_list.PreMalloc(count);
|
||||||
|
|
||||||
|
mi_set.ClearData();
|
||||||
|
|
||||||
RenderItem *ri=ri_list.GetData();
|
RenderItem *ri=ri_list.GetData();
|
||||||
|
|
||||||
ri_count=1;
|
ri_count=1;
|
||||||
@ -220,6 +260,8 @@ namespace hgl
|
|||||||
last_mi =ri->mi;
|
last_mi =ri->mi;
|
||||||
last_vid =ri->vid;
|
last_vid =ri->vid;
|
||||||
|
|
||||||
|
mi_set.Add(last_mi);
|
||||||
|
|
||||||
++rn;
|
++rn;
|
||||||
|
|
||||||
for(uint i=1;i<count;i++)
|
for(uint i=1;i<count;i++)
|
||||||
@ -234,12 +276,15 @@ namespace hgl
|
|||||||
}
|
}
|
||||||
|
|
||||||
++ri_count;
|
++ri_count;
|
||||||
|
|
||||||
++ri;
|
++ri;
|
||||||
|
|
||||||
ri->first=i;
|
ri->first=i;
|
||||||
ri->count=1;
|
ri->count=1;
|
||||||
ri->Set(rn->ri);
|
ri->Set(rn->ri);
|
||||||
|
|
||||||
|
if(last_mi!=ri->mi)
|
||||||
|
mi_set.Add(ri->mi);
|
||||||
|
|
||||||
last_pipeline =ri->pipeline;
|
last_pipeline =ri->pipeline;
|
||||||
last_mi =ri->mi;
|
last_mi =ri->mi;
|
||||||
last_vid =ri->vid;
|
last_vid =ri->vid;
|
||||||
@ -390,8 +435,6 @@ namespace hgl
|
|||||||
|
|
||||||
if(count<=0)return;
|
if(count<=0)return;
|
||||||
|
|
||||||
Stat();
|
|
||||||
|
|
||||||
if(ri_count<=0)return;
|
if(ri_count<=0)return;
|
||||||
|
|
||||||
cmd_buf=rcb;
|
cmd_buf=rcb;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user