From dbe2370a44a1d1c35168e4b7c1ab1d8758b3ec7d Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Wed, 20 Sep 2023 15:55:14 +0800 Subject: [PATCH] 1.used uvec2/ushort2 in AssignVBO 2.completed first step then merge MI buffer --- CMSceneGraph | 2 +- example/Vulkan/CMakeLists.txt | 8 +++---- example/Vulkan/fourth_triangle.cpp | 4 ++-- example/Vulkan/third_triangle.cpp | 4 ++-- inc/hgl/graph/MaterialRenderList.h | 2 +- inc/hgl/graph/RenderNode.h | 2 ++ src/SceneGraph/MaterialRenderList.cpp | 15 ++++-------- src/SceneGraph/RenderAssignBuffer.cpp | 34 ++++++++++++++------------- src/SceneGraph/RenderAssignBuffer.h | 5 ++-- 9 files changed, 37 insertions(+), 39 deletions(-) diff --git a/CMSceneGraph b/CMSceneGraph index 1e826838..b66d4003 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit 1e8268389f01b8d9c1f17f779336f68af848bf55 +Subproject commit b66d4003b11a4d4aee1df9084fc4223df1d0aa25 diff --git a/example/Vulkan/CMakeLists.txt b/example/Vulkan/CMakeLists.txt index ad8ef8da..4d3d3e5f 100644 --- a/example/Vulkan/CMakeLists.txt +++ b/example/Vulkan/CMakeLists.txt @@ -10,10 +10,10 @@ set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example/Vulkan/${group}") endmacro() -CreateProject("Basic" 1st_draw_triangle_in_NDC first_triangle.cpp) -CreateProject("Basic" 2nd_draw_triangle_use_UBO second_triangle.cpp) -CreateProject("Basic" 3rd_draw_triangle_use_RenderList third_triangle.cpp) -CreateProject("Basic" 4th_draw_triangle_use_MaterialInstance fourth_triangle.cpp) +CreateProject("Basic" 1st_draw_triangle_in_NDC first_triangle.cpp) +CreateProject("Basic" 2nd_draw_triangle_use_UBO second_triangle.cpp) +CreateProject("Basic" 3rd_AutoInstance third_triangle.cpp) +CreateProject("Basic" 4th_AutoMergeMaterialInstance fourth_triangle.cpp) #CreateProject("Basic" FragCoord FragCoordTest.cpp) #CreateProject("Basic" indices_rect indices_rect.cpp) diff --git a/example/Vulkan/fourth_triangle.cpp b/example/Vulkan/fourth_triangle.cpp index 91544361..e772a58d 100644 --- a/example/Vulkan/fourth_triangle.cpp +++ b/example/Vulkan/fourth_triangle.cpp @@ -1,5 +1,5 @@ -// fourth_triangle -// 该范例主要演示使用材质实例传递颜色参数绘制三角形 +// AutoMergeMaterialInstance +// 该范例主要演示使用一个材质下的不同材质实例传递颜色参数绘制三角形,并依赖RenderList中的自动合并功能,让同一材质下所有不同材质实例的对象一次渲染完成。 #include"VulkanAppFramework.h" #include diff --git a/example/Vulkan/third_triangle.cpp b/example/Vulkan/third_triangle.cpp index b3d8e516..8c68eb7d 100644 --- a/example/Vulkan/third_triangle.cpp +++ b/example/Vulkan/third_triangle.cpp @@ -1,5 +1,5 @@ -// third_triangle -// 该范例主要演示使用场景树系统绘制多个三角形,并利用RenderList进行排序以及自动合并进行Instance渲染 +// AutoInstance +// 该范例主要演示使用RenderList系统绘制多个三角形,并利用RenderList进行排序以及自动合并进行Instance渲染 #include"VulkanAppFramework.h" #include diff --git a/inc/hgl/graph/MaterialRenderList.h b/inc/hgl/graph/MaterialRenderList.h index 9c4a33a9..ffe24a9f 100644 --- a/inc/hgl/graph/MaterialRenderList.h +++ b/inc/hgl/graph/MaterialRenderList.h @@ -35,7 +35,7 @@ private: void Set(Renderable *); }; - SortedSets mi_id_set; + MaterialInstanceSets mi_set; DataArray ri_array; uint ri_count; diff --git a/inc/hgl/graph/RenderNode.h b/inc/hgl/graph/RenderNode.h index d164c8b3..f9241757 100644 --- a/inc/hgl/graph/RenderNode.h +++ b/inc/hgl/graph/RenderNode.h @@ -22,6 +22,8 @@ namespace hgl }; using RenderNodeList=List; + + using MaterialInstanceSets=SortedSets; ///<材质实例集合 }//namespace graph }//namespace hgl #endif//HGL_GRAPH_RENDER_NODE_INCLUDE diff --git a/src/SceneGraph/MaterialRenderList.cpp b/src/SceneGraph/MaterialRenderList.cpp index 33bb0911..5dcd608b 100644 --- a/src/SceneGraph/MaterialRenderList.cpp +++ b/src/SceneGraph/MaterialRenderList.cpp @@ -109,17 +109,15 @@ void MaterialRenderList::RenderItem::Set(Renderable *ri) void MaterialRenderList::StatMI() { - mi_id_set.Clear(); + mi_set.Clear(); for(RenderNode &rn:rn_list) - mi_id_set.Add(rn.ri->GetMaterialInstance()->GetMIID()); + mi_set.Add(rn.ri->GetMaterialInstance()); - if(mi_id_set.GetCount()>mtl->GetMIMaxCount()) + if(mi_set.GetCount()>mtl->GetMIMaxCount()) { //超出最大数量了怎么办??? } - - } void MaterialRenderList::Stat() @@ -131,7 +129,7 @@ void MaterialRenderList::Stat() ri_array.Alloc(count); RenderItem *ri=ri_array.GetData(); - + ri_count=1; ri->first=0; @@ -142,8 +140,6 @@ void MaterialRenderList::Stat() last_mi =ri->mi; last_vid =ri->vid; - mi_set.Add(last_mi); - ++rn; for(uint i=1;icount=1; ri->Set(rn->ri); - if(last_mi!=ri->mi) - mi_set.Add(ri->mi); - last_pipeline =ri->pipeline; last_mi =ri->mi; last_vid =ri->vid; diff --git a/src/SceneGraph/RenderAssignBuffer.cpp b/src/SceneGraph/RenderAssignBuffer.cpp index ad0d1e94..1571799b 100644 --- a/src/SceneGraph/RenderAssignBuffer.cpp +++ b/src/SceneGraph/RenderAssignBuffer.cpp @@ -3,21 +3,22 @@ #include #include #include +#include #include #include VK_NAMESPACE_BEGIN -RenderAssignBuffer::RenderAssignBuffer(GPUDevice *dev,const uint mi_total_bytes) +RenderAssignBuffer::RenderAssignBuffer(GPUDevice *dev,const uint mi_bytes) { hgl_zero(*this); device=dev; - if(mi_total_bytes>0) - ubo_mi=device->CreateUBO(mi_total_bytes); - else - ubo_mi=nullptr; + mi_data_bytes=mi_bytes; + + ubo_mi=nullptr; + mi_count=0; } VkBuffer RenderAssignBuffer::GetAssignVBO()const @@ -44,6 +45,7 @@ void RenderAssignBuffer::Clear() SAFE_CLEAR(vbo_assigns); node_count=0; + mi_count=0; } void RenderAssignBuffer::Alloc(const uint nc,const uint mc) @@ -51,21 +53,21 @@ void RenderAssignBuffer::Alloc(const uint nc,const uint mc) Clear(); { - node_count=power_to_2(nc); + node_count=nc; ubo_l2w=device->CreateUBO(node_count*sizeof(Matrix4f)); } + if(mi_data_bytes>0&&mc>0) + { + mi_count=mc; + + ubo_mi=device->CreateUBO(mi_data_bytes*mi_count); + } + vbo_assigns=device->CreateVBO(ASSIGN_VBO_FMT,node_count); } -bool RenderAssignBuffer::WriteMIData(void *mi_data,const uint bytes) -{ - if(!mi_data||!bytes||!ubo_mi)return(false); - - return ubo_mi->Write(mi_data,bytes); -} - void RenderAssignBuffer::WriteNode(RenderNode *render_node,const uint count,const MaterialInstanceSets &mi_set) { RenderNode *rn; @@ -78,7 +80,7 @@ void RenderAssignBuffer::WriteNode(RenderNode *render_node,const uint count,cons for(MaterialInstance *mi:mi_set) { -// memcpy(mip,mi->GetData(),mi_data_bytes); + memcpy(mip,mi->GetMIData(),mi_data_bytes); mip+=mi_data_bytes; } @@ -100,8 +102,8 @@ void RenderAssignBuffer::WriteNode(RenderNode *render_node,const uint count,cons *idp=i; ++idp; - //*idp=mi_set.Find(rn->ri->GetMaterialInstance()); - //++idp; + *idp=mi_set.Find(rn->ri->GetMaterialInstance()); + ++idp; ++rn; } diff --git a/src/SceneGraph/RenderAssignBuffer.h b/src/SceneGraph/RenderAssignBuffer.h index 949247a6..61dcd4b8 100644 --- a/src/SceneGraph/RenderAssignBuffer.h +++ b/src/SceneGraph/RenderAssignBuffer.h @@ -37,6 +37,8 @@ private: uint node_count; ///<渲染节点数量 DeviceBuffer *ubo_l2w; ///