diff --git a/CMSceneGraph b/CMSceneGraph index 0e91540e..a2f5b2d3 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit 0e91540e0aed109464cf1cceba0f3b417f706b64 +Subproject commit a2f5b2d3c65bf8136e3bd53b05164c4f72de23ac diff --git a/example/Gizmo/PlaneGrid3D.cpp b/example/Gizmo/PlaneGrid3D.cpp index 03c029b6..50b405c4 100644 --- a/example/Gizmo/PlaneGrid3D.cpp +++ b/example/Gizmo/PlaneGrid3D.cpp @@ -92,7 +92,7 @@ private: camera_control->SetTarget(Vector3f(0,0,0)); camera_control->Refresh(); - camera_control->SetReserveDirection(true,true); //反转x,y +// camera_control->SetReserveDirection(true,true); //反转x,y render_root.RefreshMatrix(); render_list->Expend(&render_root); diff --git a/inc/hgl/graph/MaterialRenderList.h b/inc/hgl/graph/MaterialRenderList.h index 0fa9d886..3668bcd7 100644 --- a/inc/hgl/graph/MaterialRenderList.h +++ b/inc/hgl/graph/MaterialRenderList.h @@ -13,7 +13,7 @@ class MaterialRenderList GPUDevice *device; RenderCmdBuffer *cmd_buf; - Material *mtl; + Material *material; RenderNodeList rn_list; @@ -46,12 +46,10 @@ protected: VBOList * vbo_list; - const VIL * last_vil; Pipeline * last_pipeline; const VertexInputData * last_vid; uint last_index; - void Bind(MaterialInstance *); bool Bind(const VertexInputData *,const uint); void Render(RenderItem *); diff --git a/inc/hgl/graph/VKMaterial.h b/inc/hgl/graph/VKMaterial.h index a23f9f9f..6f428892 100644 --- a/inc/hgl/graph/VKMaterial.h +++ b/inc/hgl/graph/VKMaterial.h @@ -69,6 +69,7 @@ public: } const bool hasSet (const DescriptorSetType &type)const; + const bool hasAssign ()const; const VIL * GetDefaultVIL()const; VIL * CreateVIL(const VILConfig *format_map=nullptr); diff --git a/src/SceneGraph/MaterialRenderList.cpp b/src/SceneGraph/MaterialRenderList.cpp index add7dce8..be62cfce 100644 --- a/src/SceneGraph/MaterialRenderList.cpp +++ b/src/SceneGraph/MaterialRenderList.cpp @@ -34,15 +34,6 @@ int Comparator::compare(const hgl::graph::RenderNode &ob return off; } - //比较顶点输入格式 - { - off=ri_one->GetMaterialInstance()->GetVIL() - -ri_two->GetMaterialInstance()->GetVIL(); - - if(off) - return off; - } - //比较模型 { off=ri_one->GetPrimitive() @@ -60,10 +51,14 @@ MaterialRenderList::MaterialRenderList(GPUDevice *d,Material *m) { device=d; cmd_buf=nullptr; - mtl=m; - assign_buffer=new RenderAssignBuffer(d,mtl->GetMIDataBytes()); + material=m; - vbo_list=new VBOList(mtl->GetVertexInput()->GetCount()); + if(material->hasAssign()) + assign_buffer=new RenderAssignBuffer(d,material->GetMIDataBytes()); + else + assign_buffer=nullptr; + + vbo_list=new VBOList(material->GetVertexInput()->GetCount()); } MaterialRenderList::~MaterialRenderList() @@ -91,13 +86,16 @@ void MaterialRenderList::End() if(node_count<=0)return; - if(mtl->HasMI()) - StatMI(); - Stat(); - //写入LocalToWorld数据 - assign_buffer->WriteNode(rn_list.GetData(),node_count,mi_set); + if(assign_buffer) + { + if(material->HasMI()) + StatMI(); + + //写入LocalToWorld数据 + assign_buffer->WriteNode(rn_list.GetData(),node_count,mi_set); + } } void MaterialRenderList::RenderItem::Set(Renderable *ri) @@ -114,7 +112,7 @@ void MaterialRenderList::StatMI() for(RenderNode &rn:rn_list) mi_set.Add(rn.ri->GetMaterialInstance()); - if(mi_set.GetCount()>mtl->GetMIMaxCount()) + if(mi_set.GetCount()>material->GetMIMaxCount()) { //超出最大数量了怎么办??? } @@ -137,7 +135,6 @@ void MaterialRenderList::Stat() ri->Set(rn->ri); last_pipeline =ri->pipeline; - last_vil =ri->mi->GetVIL(); last_vid =ri->vid; ++rn; @@ -145,13 +142,12 @@ void MaterialRenderList::Stat() for(uint i=1;iri->GetPipeline()) - if(last_vil==rn->ri->GetMaterialInstance()->GetVIL()) - if(last_vid->Comp(rn->ri->GetVertexInputData())) - { - ++ri->count; - ++rn; - continue; - } + if(last_vid->Comp(rn->ri->GetVertexInputData())) + { + ++ri->count; + ++rn; + continue; + } ++ri_count; ++ri; @@ -161,30 +157,20 @@ void MaterialRenderList::Stat() ri->Set(rn->ri); last_pipeline =ri->pipeline; - last_vil =ri->mi->GetVIL(); last_vid =ri->vid; ++rn; } } -void MaterialRenderList::Bind(MaterialInstance *mi) -{ - if(!mi)return; - - assign_buffer->Bind(mi); - - cmd_buf->BindDescriptorSets(mi->GetMaterial()); -} - bool MaterialRenderList::Bind(const VertexInputData *vid,const uint ri_index) { //binding号都是在VertexInput::CreateVIL时连续紧密排列生成的,所以bind时first_binding写0就行了。 - const VIL *vil=last_vil; + //const VIL *vil=last_vil; - if(vil->GetCount(VertexInputGroup::Basic)!=vid->binding_count) - return(false); //这里基本不太可能,因为CreateRenderable时就会检查值是否一样 + //if(vil->GetCount(VertexInputGroup::Basic)!=vid->binding_count) + // return(false); //这里基本不太可能,因为CreateRenderable时就会检查值是否一样 vbo_list->Restart(); @@ -221,17 +207,10 @@ bool MaterialRenderList::Bind(const VertexInputData *vid,const uint ri_index) // } //} - if(!vbo_list->IsFull()) //Assign组 + //if(!vbo_list->IsFull()) //Assign组 { - const uint assign_binding_count=vil->GetCount(VertexInputGroup::Assign); - - if(assign_binding_count>0) - { - if(assign_binding_count!=1) - return(false); - + if(assign_buffer) vbo_list->Add(assign_buffer->GetAssignVBO(),ASSIGN_VBO_STRIDE_BYTES*ri_index); - } } //if(count!=binding_count) @@ -258,14 +237,6 @@ void MaterialRenderList::Render(RenderItem *ri) //这里未来尝试换pipeline同时不换mi/primitive是否需要重新绑定mi/primitive } - if(last_vil!=ri->mi->GetVIL()) - { - Bind(ri->mi); - last_vil=ri->mi->GetVIL(); - - last_vid=nullptr; - } - if(!ri->vid->Comp(last_vid)) { Bind(ri->vid,ri->first); @@ -300,9 +271,13 @@ void MaterialRenderList::Render(RenderCmdBuffer *rcb) RenderItem *ri=ri_array.GetData(); last_pipeline =nullptr; - last_vil =nullptr; last_vid =nullptr; + if(assign_buffer) + assign_buffer->Bind(material); + + cmd_buf->BindDescriptorSets(material); + for(uint i=0;iGetBuffer(); } -void RenderAssignBuffer::Bind(MaterialInstance *mi)const +void RenderAssignBuffer::Bind(Material *mtl)const { - const VIL *vil=mi->GetVIL(); + if(!mtl)return; - const uint assign_binding_count=vil->GetCount(VertexInputGroup::Assign); - - if(assign_binding_count<=0)return; - - Material *mtl=mi->GetMaterial(); + if(!mtl->hasAssign()) + return; mtl->BindUBO(DescriptorSetType::PerFrame,mtl::SBS_LocalToWorld.name,ubo_l2w); mtl->BindUBO(DescriptorSetType::PerMaterial,mtl::SBS_MaterialInstance.name,ubo_mi); diff --git a/src/SceneGraph/RenderAssignBuffer.h b/src/SceneGraph/RenderAssignBuffer.h index 61dcd4b8..86fbc5fb 100644 --- a/src/SceneGraph/RenderAssignBuffer.h +++ b/src/SceneGraph/RenderAssignBuffer.h @@ -54,7 +54,7 @@ public: VkBuffer GetAssignVBO()const; - void Bind(MaterialInstance *)const; + void Bind(Material *)const; public: diff --git a/src/SceneGraph/Vulkan/VKMaterial.cpp b/src/SceneGraph/Vulkan/VKMaterial.cpp index 794f1fa6..99d39a57 100644 --- a/src/SceneGraph/Vulkan/VKMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKMaterial.cpp @@ -47,6 +47,11 @@ const bool Material::hasSet(const DescriptorSetType &dst)const return desc_manager->hasSet(dst); } +const bool Material::hasAssign()const +{ + return vertex_input->hasAssign(); +} + const VIL *Material::GetDefaultVIL()const { return vertex_input->GetDefaultVIL();