standalone RenderList2D

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-03-24 22:14:43 +08:00
parent 19a20411d8
commit 8e52595123
8 changed files with 73 additions and 179 deletions

View File

@ -6,6 +6,7 @@
#include<hgl/filesystem/FileSystem.h> #include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/VKRenderablePrimitiveCreater.h> #include<hgl/graph/VKRenderablePrimitiveCreater.h>
#include<hgl/graph/mtl/2d/VertexColor2D.h> #include<hgl/graph/mtl/2d/VertexColor2D.h>
#include<hgl/graph/RenderList2D.h>
using namespace hgl; using namespace hgl;
using namespace hgl::graph; using namespace hgl::graph;
@ -33,7 +34,7 @@ class TestApp:public VulkanApplicationFramework
private: private:
SceneNode render_root; SceneNode render_root;
RenderList * render_list =nullptr; RenderList2D * render_list =nullptr;
MaterialInstance * material_instance =nullptr; MaterialInstance * material_instance =nullptr;
Renderable * render_obj =nullptr; Renderable * render_obj =nullptr;
@ -73,7 +74,7 @@ private:
render_root.RefreshMatrix(); render_root.RefreshMatrix();
render_list->Expend(GetCameraInfo(),&render_root); render_list->Expend(&render_root);
return(true); return(true);
} }
@ -90,7 +91,7 @@ public:
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false); return(false);
render_list=new RenderList(device); render_list=new RenderList2D(device);
if(!InitMaterial()) if(!InitMaterial())
return(false); return(false);

View File

@ -13,25 +13,26 @@ namespace hgl
{ {
namespace graph namespace graph
{ {
using MaterialSets=SortedSets<Material *>;
/** /**
* <br> * <br>
* mvp用UBO/SSBO等数据RenderCommandBuffer * mvp用UBO/SSBO等数据RenderCommandBuffer
*/ */
class RenderList class RenderList
{ {
protected: protected:
GPUDevice * device; GPUDevice * device;
RenderCmdBuffer *cmd_buf; RenderCmdBuffer * cmd_buf;
private: private:
RenderNodeList render_node_list; ///<场景节点列表 GPUArrayBuffer * mvp_array;
MaterialSets material_sets; ///<材质合集 CameraInfo camera_info;
RenderNodeComparator *render_node_comparator; RenderNode3DList render_node_list; ///<场景节点列表
MaterialSets material_sets; ///<材质合集
RenderNode3DComparator *render_node_comparator;
private: private:
@ -61,49 +62,11 @@ namespace hgl
RenderList(GPUDevice *); RenderList(GPUDevice *);
virtual ~RenderList(); virtual ~RenderList();
virtual bool Expend(const CameraInfo &,SceneNode *); virtual bool Expend(const CameraInfo &,SceneNode *);
virtual bool Render(RenderCmdBuffer *); virtual bool Render(RenderCmdBuffer *);
};//class RenderList };//class RenderList
class RenderList2D:public RenderList
{
protected:
virtual bool Begin() override;
virtual bool Expend(SceneNode *) override;
virtual void End() override;
public:
RenderList2D();
virtual ~RenderList2D() override;
virtual bool Expend(SceneNode *);
};
class RenderList3D:public RenderList
{
protected:
CameraInfo camera_info;
GPUArrayBuffer *mvp_array;
protected:
virtual bool Begin() override;
virtual bool Expend(SceneNode *) override;
virtual void End() override;
public:
RenderList3D();
virtual ~RenderList3D() override;
bool Expend(const CameraInfo &,SceneNode *);
};
}//namespace graph }//namespace graph
}//namespace hgl }//namespace hgl
#endif//HGL_GRAPH_RENDER_LIST_INCLUDE #endif//HGL_GRAPH_RENDER_LIST_INCLUDE

View File

@ -1,37 +1,34 @@
#ifndef HGL_GRAPH_RENDER_LIST_INCLUDE #ifndef HGL_GRAPH_RENDER_LIST_2D_INCLUDE
#define HGL_GRAPH_RENDER_LIST_INCLUDE #define HGL_GRAPH_RENDER_LIST_2D_INCLUDE
#include<hgl/graph/VK.h> #include<hgl/graph/VK.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/SceneNode.h> #include<hgl/graph/SceneNode.h>
#include<hgl/graph/RenderNode.h> #include<hgl/graph/RenderNode2D.h>
#include<hgl/graph/VKArrayBuffer.h> #include<hgl/graph/VKArrayBuffer.h>
#include<hgl/graph/SceneInfo.h> #include<hgl/graph/VKMaterial.h>
#include<hgl/color/Color4f.h>
#include<hgl/type/SortedSets.h>
namespace hgl namespace hgl
{ {
namespace graph namespace graph
{ {
using MaterialSets=SortedSets<Material *>;
/** /**
* <br> * <br>
* mvp用UBO/SSBO等数据RenderCommandBuffer * mvp用UBO/SSBO等数据RenderCommandBuffer
*/ */
class RenderList class RenderList2D
{ {
protected: protected:
GPUDevice * device; GPUDevice * device;
RenderCmdBuffer *cmd_buf; RenderCmdBuffer * cmd_buf;
private: private:
RenderNodeList render_node_list; ///<场景节点列表 // GPUArrayBuffer * mvp_array;
MaterialSets material_sets; ///<材质合集
RenderNodeComparator *render_node_comparator; RenderNode2DList render_node_list; ///<场景节点列表
MaterialSets material_sets; ///<材质合集
RenderNode2DComparator render_node_comparator;
private: private:
@ -46,7 +43,7 @@ namespace hgl
protected: protected:
virtual bool Begin(); virtual bool Begin();
virtual bool Expend(SceneNode *); virtual bool ExpendNode(SceneNode *);
virtual void End(); virtual void End();
private: private:
@ -59,51 +56,13 @@ namespace hgl
public: public:
RenderList(GPUDevice *); RenderList2D(GPUDevice *);
virtual ~RenderList(); virtual ~RenderList2D();
virtual bool Expend(const CameraInfo &,SceneNode *); virtual bool Expend(SceneNode *);
virtual bool Render(RenderCmdBuffer *); virtual bool Render(RenderCmdBuffer *);
};//class RenderList };//class RenderList2D
class RenderList2D:public RenderList
{
protected:
virtual bool Begin() override;
virtual bool Expend(SceneNode *) override;
virtual void End() override;
public:
RenderList2D();
virtual ~RenderList2D() override;
virtual bool Expend(SceneNode *);
};
class RenderList3D:public RenderList
{
protected:
CameraInfo camera_info;
GPUArrayBuffer *mvp_array;
protected:
virtual bool Begin() override;
virtual bool Expend(SceneNode *) override;
virtual void End() override;
public:
RenderList3D();
virtual ~RenderList3D() override;
bool Expend(const CameraInfo &,SceneNode *);
};
}//namespace graph }//namespace graph
}//namespace hgl }//namespace hgl
#endif//HGL_GRAPH_RENDER_LIST_INCLUDE #endif//HGL_GRAPH_RENDER_LIST_2D_INCLUDE

View File

@ -1,30 +1,16 @@
#ifndef HGL_GRAPH_RENDER_NODE_2D_INCLUDE #ifndef HGL_GRAPH_RENDER_NODE_2D_INCLUDE
#define HGL_GRAPH_RENDER_NODE_2D_INCLUDE #define HGL_GRAPH_RENDER_NODE_2D_INCLUDE
#include<hgl/math/Vector.h> #include<hgl/math/Math.h>
#include<hgl/type/List.h>
#include<hgl/graph/SceneInfo.h>
namespace hgl namespace hgl
{ {
namespace graph namespace graph
{ {
class Renderable; class Renderable;
struct Transiton2D
{
Vector2f move;
Vector2f center; //中心点
//下方的不管是缩放还是旋转均以上面的center为中心变换
Vector2f scale;
float rotate;
float z;
};
struct RenderNode2D struct RenderNode2D
{ {
Transiton2D trans; Matrix3x4f local_to_world;
Renderable *ri; Renderable *ri;
}; };

View File

@ -78,5 +78,7 @@ public:
bool Release(VIL *); bool Release(VIL *);
const uint GetVILCount(); const uint GetVILCount();
};//class Material };//class Material
using MaterialSets=SortedSets<Material *>;
VK_NAMESPACE_END VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE #endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE

View File

@ -43,7 +43,6 @@ public:
public: public:
#define MP_TYPE_IS(name) const bool is##name()const{return set_type==DescriptorSetType::name;} #define MP_TYPE_IS(name) const bool is##name()const{return set_type==DescriptorSetType::name;}
MP_TYPE_IS(Skeleton)
MP_TYPE_IS(Instance) MP_TYPE_IS(Instance)
MP_TYPE_IS(PerObject) MP_TYPE_IS(PerObject)
MP_TYPE_IS(PerMaterial) MP_TYPE_IS(PerMaterial)

View File

@ -41,9 +41,10 @@ SET(SCENE_GRAPH_HEADER ${SG_INCLUDE_PATH}/SceneInfo.h
${SG_INCLUDE_PATH}/RenderList2D.h ${SG_INCLUDE_PATH}/RenderList2D.h
) )
SET(SCENE_GRAPH_SOURCE RenderList.cpp SET(SCENE_GRAPH_SOURCE
#RenderList.cpp
RenderList2D.cpp RenderList2D.cpp
RenderList3D.cpp #RenderList3D.cpp
SceneNode.cpp SceneNode.cpp
SceneOrient.cpp) SceneOrient.cpp)
@ -118,6 +119,7 @@ SET(VK_MEMORY_SOURCE ${SG_INCLUDE_PATH}/VKMemory.h
Vulkan/VKMemory.cpp Vulkan/VKMemory.cpp
Vulkan/VKMemoryAllocator.cpp Vulkan/VKMemoryAllocator.cpp
Vulkan/VKBuffer.cpp Vulkan/VKBuffer.cpp
Vulkan/VKArrayBuffer.cpp
) )
SET(VK_DEVICE_TEXTURE_SOURCE Vulkan/Texture/BufferImageCopy2D.h SET(VK_DEVICE_TEXTURE_SOURCE Vulkan/Texture/BufferImageCopy2D.h

View File

@ -1,5 +1,4 @@
#include<hgl/graph/RenderList.h> #include<hgl/graph/RenderList2D.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/SceneNode.h> #include<hgl/graph/SceneNode.h>
#include<hgl/graph/VKBuffer.h> #include<hgl/graph/VKBuffer.h>
#include<hgl/graph/VKPrimitive.h> #include<hgl/graph/VKPrimitive.h>
@ -15,11 +14,10 @@
* for(pipeline) * for(pipeline)
* for(material_instance) * for(material_instance)
* for(vbo) * for(vbo)
* for(distance)
*/ */
template<> template<>
int Comparator<RenderNode3DPointer>::compare(const RenderNode3DPointer &obj_one,const RenderNode3DPointer &obj_two) const int Comparator<RenderNode2DPointer>::compare(const RenderNode2DPointer &obj_one,const RenderNode2DPointer &obj_two) const
{ {
int off; int off;
@ -58,17 +56,6 @@ int Comparator<RenderNode3DPointer>::compare(const RenderNode3DPointer &obj_one,
return off; return off;
} }
//比较距离
{
const double dist=obj_one->distance_to_camera_square-
obj_two->distance_to_camera_square;
//由于距离差距可能会小于1但又返回int所以需要做如此处理
if(dist>0)return 1;else
if(dist<0)return -1;
}
return 0; return 0;
} }
@ -76,7 +63,7 @@ namespace hgl
{ {
namespace graph namespace graph
{ {
RenderList::RenderList(GPUDevice *dev) RenderList2D::RenderList2D(GPUDevice *dev)
{ {
device =dev; device =dev;
cmd_buf =nullptr; cmd_buf =nullptr;
@ -87,13 +74,15 @@ namespace hgl
last_pipeline =nullptr; last_pipeline =nullptr;
hgl_zero(last_mp); hgl_zero(last_mp);
last_vbo =0; last_vbo =0;
// mvp_array =new GPUArrayBuffer(device,VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,MVPMatrixBytes);
} }
RenderList::~RenderList() RenderList2D::~RenderList2D()
{ {
} }
bool RenderList::Begin() bool RenderList2D::Begin()
{ {
render_node_list.ClearData(); render_node_list.ClearData();
ri_list.ClearData(); ri_list.ClearData();
@ -103,7 +92,7 @@ namespace hgl
return(true); return(true);
} }
void RenderList::End() void RenderList2D::End()
{ {
if(render_node_list.GetCount()<=0)return; if(render_node_list.GetCount()<=0)return;
@ -116,46 +105,46 @@ namespace hgl
{ {
//按当前总节点数量分配UBO //按当前总节点数量分配UBO
mvp_array->Alloc(count); // mvp_array->Alloc(count);
mvp_array->Clear(); // mvp_array->Clear();
ri_list.ClearData(); ri_list.ClearData();
ri_list.SetCount(count); ri_list.SetCount(count);
} }
{ {
ubo_align=mvp_array->GetUnitSize(); // ubo_align=mvp_array->GetUnitSize();
char *mp=(char *)(mvp_array->Map(0,count)); // char *mp=(char *)(mvp_array->Map(0,count));
Renderable **ri=ri_list.GetData(); Renderable **ri=ri_list.GetData();
for(RenderNode *node:render_node_list) //未来可能要在Expend处考虑做去重 for(RenderNode2D *node:render_node_list) //未来可能要在Expend处考虑做去重
{ {
memcpy(mp,&(node->matrix),MVPMatrixBytes); // memcpy(mp,&(node->matrix),MVPMatrixBytes);
mp+=ubo_align; // mp+=ubo_align;
(*ri)=node->ri; (*ri)=node->ri;
++ri; ++ri;
} }
mvp_array->Flush(count); // mvp_array->Flush(count);
} }
} }
//为所有的材质绑定 //为所有的材质绑定
for(Material *mtl:material_sets) //for(Material *mtl:material_sets)
{ //{
MaterialParameters *mp=mtl->GetMP(DescriptorSetType::PerObject); // MaterialParameters *mp=mtl->GetMP(DescriptorSetType::PerObject);
if(mp) // if(mp)
{ // {
if(mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),true)) // if(mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),true))
mp->Update(); // mp->Update();
} // }
} //}
} }
bool RenderList::Expend(SceneNode *sn) bool RenderList2D::ExpendNode(SceneNode *sn)
{ {
if(!sn)return(false); if(!sn)return(false);
@ -163,14 +152,9 @@ namespace hgl
if(ri) if(ri)
{ {
RenderNode *rn=new RenderNode; RenderNode2D *rn=new RenderNode2D;
rn->matrix.Set(sn->GetLocalToWorldMatrix(),camera_info.vp,camera_info.view); rn->local_to_world=sn->GetLocalToWorldMatrix();
rn->WorldCenter=sn->GetWorldCenter();
rn->distance_to_camera_square=length_squared(rn->WorldCenter,camera_info.pos);
// rn->distance_to_camera=sqrtf(rn->distance_to_camera_square);
rn->ri=ri; rn->ri=ri;
@ -185,20 +169,18 @@ namespace hgl
return(true); return(true);
} }
bool RenderList::Expend(const CameraInfo &ci,SceneNode *sn) bool RenderList2D::Expend(SceneNode *sn)
{ {
if(!device|!sn)return(false); if(!device|!sn)return(false);
camera_info=ci;
Begin(); Begin();
Expend(sn); ExpendNode(sn);
End(); End();
return(true); return(true);
} }
void RenderList::Render(Renderable *ri) void RenderList2D::Render(Renderable *ri)
{ {
if(last_pipeline!=ri->GetPipeline()) if(last_pipeline!=ri->GetPipeline())
{ {
@ -273,7 +255,7 @@ namespace hgl
} }
} }
bool RenderList::Render(RenderCmdBuffer *cb) bool RenderList2D::Render(RenderCmdBuffer *cb)
{ {
if(!cb) if(!cb)
return(false); return(false);