save full SceneNode in RenderNode,added length sort.

This commit is contained in:
hyzboy 2024-08-02 23:17:07 +08:00
parent 7f074c6c79
commit 3768507169
9 changed files with 73 additions and 31 deletions

2
CMCore

@ -1 +1 @@
Subproject commit 7589d62732b68b99de1bec561b1703dd2b043c03
Subproject commit 0dd89d78abd3cb24c6ce36d57fd9d8ccac3ec983

View File

@ -92,6 +92,7 @@ public:
}
root.RefreshMatrix();
render_list->SetCamera(&(camera_control->GetCameraInfo()));
render_list->Expend(&root);
SceneAppFramework::BuildCommandBuffer(index);

View File

@ -7,6 +7,7 @@
VK_NAMESPACE_BEGIN
class RenderAssignBuffer;
class SceneNode;
struct CameraInfo;
/**
*
@ -18,6 +19,8 @@ class MaterialRenderList
Material *material;
CameraInfo *camera_info;
RenderNodeList rn_list;
private:
@ -76,6 +79,11 @@ public:
void Add(SceneNode *);
void SetCameraInfo(CameraInfo *ci)
{
camera_info=ci;
}
void Clear()
{
rn_list.Clear();

View File

@ -9,10 +9,13 @@ public:
MaterialRenderMap()=default;
virtual ~MaterialRenderMap()=default;
void Begin()
void Begin(CameraInfo *ci)
{
for(auto *it:data_list)
{
it->value->SetCameraInfo(ci);
it->value->Clear();
}
}
void End()

View File

@ -20,6 +20,8 @@ namespace hgl
GPUDevice * device;
CameraInfo * camera_info; ///<相机信息
uint renderable_count; ///<可渲染对象数量
MaterialRenderMap mrl_map; ///<按材质分类的渲染列表
@ -32,11 +34,12 @@ namespace hgl
RenderList(GPUDevice *);
virtual ~RenderList()=default;
virtual bool Expend(SceneNode *); ///<展开场景树到渲染列表
virtual void SetCamera(CameraInfo *ci){camera_info=ci;} ///<设置相机信息
virtual bool Expend(SceneNode *); ///<展开场景树到渲染列表
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
virtual void Clear(); ///<彻底清理
virtual void Clear(); ///<彻底清理
};//class RenderList
}//namespace graph
}//namespace hgl

View File

@ -9,12 +9,14 @@ namespace hgl
{
class Renderable;
class MaterialInstance;
class SceneNode;
struct RenderNode
{
Matrix4f local_to_world;
SceneNode *scene_node;
Renderable *ri;
Vector3f world_position;
float to_camera_distance;
};
using RenderNodeList=List<RenderNode>;

View File

@ -8,6 +8,7 @@
#include"RenderAssignBuffer.h"
#include<hgl/graph/VertexDataManager.h>
#include<hgl/graph/SceneNode.h>
#include<hgl/graph/CameraInfo.h>
/**
*
@ -30,8 +31,8 @@ int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &ob
{
hgl::int64 off;
hgl::graph::Renderable *ri_one=obj_one.ri;
hgl::graph::Renderable *ri_two=obj_two.ri;
hgl::graph::Renderable *ri_one=obj_one.scene_node->GetRenderable();
hgl::graph::Renderable *ri_two=obj_two.scene_node->GetRenderable();
//比较管线
{
@ -45,29 +46,39 @@ int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &ob
auto *prim_one=ri_one->GetPrimitive();
auto *prim_two=ri_two->GetPrimitive();
//比如VDM
//比较VDM
if(prim_one->GetVDM()) //有VDM
{
off=prim_one->GetVDM()
-prim_two->GetVDM();
if(off)
return off;
}
//比较模型
{
off=prim_one
-prim_two;
if(off)
//比较模型
{
off=prim_one->GetVertexOffset()-prim_two->GetVertexOffset(); //保证vertex offset小的在前面
off=prim_one
-prim_two;
return off;
if(off)
{
off=prim_one->GetVertexOffset()-prim_two->GetVertexOffset(); //保证vertex offset小的在前面
return off;
}
}
}
return 0;
//比较距离。。。。。。。。。。。。。。。。。。。。。还不知道这个是正了还是反了,等测出来确认后修改下面的返回值和这里的注释
float foff=obj_one.to_camera_distance
-obj_two.to_camera_distance;
if(foff>0)
return 1;
else
return -1;
}
VK_NAMESPACE_BEGIN
@ -77,6 +88,8 @@ MaterialRenderList::MaterialRenderList(GPUDevice *d,bool l2w,Material *m)
cmd_buf=nullptr;
material=m;
camera_info=nullptr;
assign_buffer=new RenderAssignBuffer(device,material);
vab_list=new VABList(material->GetVertexInput()->GetCount());
@ -98,8 +111,14 @@ void MaterialRenderList::Add(SceneNode *sn)
{
RenderNode rn;
rn.local_to_world =sn->GetLocalToWorldMatrix();
rn.ri =sn->GetRenderable();
rn.scene_node =sn;
rn.world_position =sn->GetWorldPosition();
if(camera_info)
rn.to_camera_distance=length(camera_info->pos,rn.world_position);
else
rn.to_camera_distance=0;
rn_list.Add(rn);
}
@ -177,12 +196,13 @@ void MaterialRenderList::Stat()
ri_array.Alloc(count);
RenderItem *ri=ri_array.GetData();
Renderable *ro=rn->scene_node->GetRenderable();
ri_count=1;
ri->first_instance=0;
ri->instance_count=1;
ri->Set(rn->ri);
ri->Set(ro);
last_pipeline =ri->pipeline;
last_data_buffer=ri->pdb;
@ -193,9 +213,11 @@ void MaterialRenderList::Stat()
for(uint i=1;i<count;i++)
{
if(last_pipeline==rn->ri->GetPipeline())
if(last_data_buffer->Comp(rn->ri->GetDataBuffer()))
if(last_render_data->_Comp(rn->ri->GetRenderData())==0)
ro=rn->scene_node->GetRenderable();
if(last_pipeline==ro->GetPipeline())
if(last_data_buffer->Comp(ro->GetDataBuffer()))
if(last_render_data->_Comp(ro->GetRenderData())==0)
{
++ri->instance_count;
++rn;
@ -218,7 +240,7 @@ void MaterialRenderList::Stat()
ri->first_instance=i;
ri->instance_count=1;
ri->Set(rn->ri);
ri->Set(ro);
last_pipeline =ri->pipeline;
last_data_buffer=ri->pdb;

View File

@ -2,6 +2,7 @@
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKMaterialInstance.h>
#include<hgl/graph/SceneNode.h>
#include<hgl/graph/RenderNode.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/VKRenderAssign.h>
@ -72,7 +73,7 @@ void RenderAssignBuffer::StatL2W(const RenderNodeList &rn_list)
for(uint i=0;i<rn_list.GetCount();i++)
{
*l2wp=rn->local_to_world;
*l2wp=rn->scene_node->GetLocalToWorldMatrix();
++l2wp;
++rn;
}
@ -115,7 +116,7 @@ void RenderAssignBuffer::StatMI(const RenderNodeList &rn_list)
mi_set.PreAlloc(rn_list.GetCount());
for(RenderNode &rn:rn_list)
mi_set.Add(rn.ri->GetMaterialInstance());
mi_set.Add(rn.scene_node->GetRenderable()->GetMaterialInstance());
if(mi_set.GetCount()>material->GetMIMaxCount())
{
@ -181,7 +182,7 @@ void RenderAssignBuffer::WriteNode(const RenderNodeList &rn_list)
for(uint i=0;i<rn_list.GetCount();i++)
{
adp->l2w=i;
adp->mi=mi_set.Find(rn->ri->GetMaterialInstance());
adp->mi=mi_set.Find(rn->scene_node->GetRenderable()->GetMaterialInstance());
++adp;
++rn;

View File

@ -16,6 +16,8 @@ namespace hgl
{
device =dev;
renderable_count=0;
camera_info=nullptr;
}
bool RenderList::ExpendNode(SceneNode *sn)
@ -51,7 +53,7 @@ namespace hgl
{
if(!device|!sn)return(false);
mrl_map.Begin();
mrl_map.Begin(camera_info);
ExpendNode(sn);
mrl_map.End();