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(); root.RefreshMatrix();
render_list->SetCamera(&(camera_control->GetCameraInfo()));
render_list->Expend(&root); render_list->Expend(&root);
SceneAppFramework::BuildCommandBuffer(index); SceneAppFramework::BuildCommandBuffer(index);

View File

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

View File

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

View File

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

View File

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

View File

@ -8,6 +8,7 @@
#include"RenderAssignBuffer.h" #include"RenderAssignBuffer.h"
#include<hgl/graph/VertexDataManager.h> #include<hgl/graph/VertexDataManager.h>
#include<hgl/graph/SceneNode.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::int64 off;
hgl::graph::Renderable *ri_one=obj_one.ri; hgl::graph::Renderable *ri_one=obj_one.scene_node->GetRenderable();
hgl::graph::Renderable *ri_two=obj_two.ri; hgl::graph::Renderable *ri_two=obj_two.scene_node->GetRenderable();
//比较管线 //比较管线
{ {
@ -45,14 +46,15 @@ int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &ob
auto *prim_one=ri_one->GetPrimitive(); auto *prim_one=ri_one->GetPrimitive();
auto *prim_two=ri_two->GetPrimitive(); auto *prim_two=ri_two->GetPrimitive();
//比如VDM //比较VDM
if(prim_one->GetVDM()) //有VDM
{ {
off=prim_one->GetVDM() off=prim_one->GetVDM()
-prim_two->GetVDM(); -prim_two->GetVDM();
if(off) if(off)
return off; return off;
}
//比较模型 //比较模型
{ {
@ -66,8 +68,17 @@ int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &ob
return off; 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 VK_NAMESPACE_BEGIN
@ -77,6 +88,8 @@ MaterialRenderList::MaterialRenderList(GPUDevice *d,bool l2w,Material *m)
cmd_buf=nullptr; cmd_buf=nullptr;
material=m; material=m;
camera_info=nullptr;
assign_buffer=new RenderAssignBuffer(device,material); assign_buffer=new RenderAssignBuffer(device,material);
vab_list=new VABList(material->GetVertexInput()->GetCount()); vab_list=new VABList(material->GetVertexInput()->GetCount());
@ -98,8 +111,14 @@ void MaterialRenderList::Add(SceneNode *sn)
{ {
RenderNode rn; RenderNode rn;
rn.local_to_world =sn->GetLocalToWorldMatrix(); rn.scene_node =sn;
rn.ri =sn->GetRenderable();
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); rn_list.Add(rn);
} }
@ -177,12 +196,13 @@ void MaterialRenderList::Stat()
ri_array.Alloc(count); ri_array.Alloc(count);
RenderItem *ri=ri_array.GetData(); RenderItem *ri=ri_array.GetData();
Renderable *ro=rn->scene_node->GetRenderable();
ri_count=1; ri_count=1;
ri->first_instance=0; ri->first_instance=0;
ri->instance_count=1; ri->instance_count=1;
ri->Set(rn->ri); ri->Set(ro);
last_pipeline =ri->pipeline; last_pipeline =ri->pipeline;
last_data_buffer=ri->pdb; last_data_buffer=ri->pdb;
@ -193,9 +213,11 @@ void MaterialRenderList::Stat()
for(uint i=1;i<count;i++) for(uint i=1;i<count;i++)
{ {
if(last_pipeline==rn->ri->GetPipeline()) ro=rn->scene_node->GetRenderable();
if(last_data_buffer->Comp(rn->ri->GetDataBuffer()))
if(last_render_data->_Comp(rn->ri->GetRenderData())==0) if(last_pipeline==ro->GetPipeline())
if(last_data_buffer->Comp(ro->GetDataBuffer()))
if(last_render_data->_Comp(ro->GetRenderData())==0)
{ {
++ri->instance_count; ++ri->instance_count;
++rn; ++rn;
@ -218,7 +240,7 @@ void MaterialRenderList::Stat()
ri->first_instance=i; ri->first_instance=i;
ri->instance_count=1; ri->instance_count=1;
ri->Set(rn->ri); ri->Set(ro);
last_pipeline =ri->pipeline; last_pipeline =ri->pipeline;
last_data_buffer=ri->pdb; last_data_buffer=ri->pdb;

View File

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

View File

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