diff --git a/inc/hgl/graph/MaterialRenderList.h b/inc/hgl/graph/MaterialRenderList.h index 84991ca0..bed01b67 100644 --- a/inc/hgl/graph/MaterialRenderList.h +++ b/inc/hgl/graph/MaterialRenderList.h @@ -8,6 +8,41 @@ class RenderAssignBuffer; class SceneNode; struct CameraInfo; +struct RenderPipelineIndex +{ + Material *material; + Pipeline *pipeline; + +public: + + const int Comp(const RenderPipelineIndex &rli)const + { + if(materialrli.material)return(1); + + if(pipelinerli.pipeline)return(1); + + return(0); + } + + CompOperator(const RenderPipelineIndex &,Comp) + +public: + + RenderPipelineIndex() + { + material=nullptr; + pipeline=nullptr; + } + + RenderPipelineIndex(Material *m,Pipeline *p) + { + material=m; + pipeline=p; + } +};//struct RenderPipelineIndex + /** * 同一材质的对象渲染列表 */ @@ -16,7 +51,7 @@ class MaterialRenderList GPUDevice *device; RenderCmdBuffer *cmd_buf; - Material *material; + RenderPipelineIndex rp_index; CameraInfo *camera_info; @@ -33,7 +68,6 @@ private: uint32_t first_instance; ///<第一个绘制实例(和instance渲染无关,对应InstanceRate的VAB) uint32_t instance_count; - Pipeline * pipeline; MaterialInstance * mi; const PrimitiveDataBuffer * pdb; @@ -60,7 +94,6 @@ protected: VABList * vab_list; - Pipeline * last_pipeline; const PrimitiveDataBuffer * last_data_buffer; const VDM * last_vdm; const PrimitiveRenderData * last_render_data; @@ -75,7 +108,7 @@ protected: public: - MaterialRenderList(GPUDevice *d,bool l2w,Material *m); + MaterialRenderList(GPUDevice *d,bool l2w,const RenderPipelineIndex &rpi); ~MaterialRenderList(); void Add(SceneNode *); diff --git a/inc/hgl/graph/MaterialRenderMap.h b/inc/hgl/graph/MaterialRenderMap.h index e2487d87..91034c66 100644 --- a/inc/hgl/graph/MaterialRenderMap.h +++ b/inc/hgl/graph/MaterialRenderMap.h @@ -2,7 +2,7 @@ #include VK_NAMESPACE_BEGIN -class MaterialRenderMap:public ObjectMap +class MaterialRenderMap:public ObjectMap { public: diff --git a/inc/hgl/graph/VKDeviceCreater.h b/inc/hgl/graph/VKDeviceCreater.h index 0caaf094..caead557 100644 --- a/inc/hgl/graph/VKDeviceCreater.h +++ b/inc/hgl/graph/VKDeviceCreater.h @@ -283,7 +283,7 @@ public: inline GPUDevice *CreateRenderDevice( VulkanInstance *vi, Window *win, - const VulkanHardwareRequirement *req=nullptr, + const VulkanHardwareRequirement *req =nullptr, const PreferFormats * spf_color =&PreferSDR, const PreferColorSpaces * spf_color_space =&PreferNonlinear, const PreferFormats * spf_depth =&PreferDepth) diff --git a/src/SceneGraph/MaterialRenderList.cpp b/src/SceneGraph/MaterialRenderList.cpp index d940082f..078697a7 100644 --- a/src/SceneGraph/MaterialRenderList.cpp +++ b/src/SceneGraph/MaterialRenderList.cpp @@ -34,15 +34,6 @@ int Comparator::compare(const hgl::graph::RenderNode &ob hgl::graph::Renderable *ri_one=obj_one.scene_node->GetRenderable(); hgl::graph::Renderable *ri_two=obj_two.scene_node->GetRenderable(); - //比较管线 - { - off=ri_one->GetPipeline() - -ri_two->GetPipeline(); - - if(off) - return off; - } - auto *prim_one=ri_one->GetPrimitive(); auto *prim_two=ri_two->GetPrimitive(); @@ -82,17 +73,17 @@ int Comparator::compare(const hgl::graph::RenderNode &ob } VK_NAMESPACE_BEGIN -MaterialRenderList::MaterialRenderList(GPUDevice *d,bool l2w,Material *m) +MaterialRenderList::MaterialRenderList(GPUDevice *d,bool l2w,const RenderPipelineIndex &rpi) { device=d; cmd_buf=nullptr; - material=m; + rp_index=rpi; camera_info=nullptr; - assign_buffer=new RenderAssignBuffer(device,material); + assign_buffer=new RenderAssignBuffer(device,rp_index.material); - vab_list=new VABList(material->GetVertexInput()->GetCount()); + vab_list=new VABList(rp_index.material->GetVertexInput()->GetCount()); icb_draw=nullptr; icb_draw_indexed=nullptr; @@ -215,7 +206,6 @@ void MaterialRenderList::UpdateMaterialInstance(SceneNode *sn) void MaterialRenderList::RenderItem::Set(Renderable *ri) { - pipeline=ri->GetPipeline(); mi =ri->GetMaterialInstance(); pdb =ri->GetDataBuffer(); prd =ri->GetRenderData(); @@ -280,7 +270,6 @@ void MaterialRenderList::Stat() ri->instance_count=1; ri->Set(ro); - last_pipeline =ri->pipeline; last_data_buffer=ri->pdb; last_vdm =ri->pdb->vdm; last_render_data=ri->prd; @@ -291,14 +280,13 @@ void MaterialRenderList::Stat() { 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; - continue; - } + if(last_data_buffer->Comp(ro->GetDataBuffer())) + if(last_render_data->_Comp(ro->GetRenderData())==0) + { + ++ri->instance_count; + ++rn; + continue; + } if(ri->pdb->vdm) { @@ -318,7 +306,6 @@ void MaterialRenderList::Stat() ri->instance_count=1; ri->Set(ro); - last_pipeline =ri->pipeline; last_data_buffer=ri->pdb; last_vdm =ri->pdb->vdm; last_render_data=ri->prd; @@ -412,16 +399,6 @@ void MaterialRenderList::ProcIndirectRender() void MaterialRenderList::Render(RenderItem *ri) { - if(last_pipeline!=ri->pipeline) - { - cmd_buf->BindPipeline(ri->pipeline); - last_pipeline=ri->pipeline; - - last_data_buffer=nullptr; - - //这里未来尝试换pipeline同时不换mi/primitive是否需要重新绑定mi/primitive - } - if(!ri->pdb->Comp(last_data_buffer)) //换buf了 { if(indirect_draw_count) //如果有间接绘制的数据,赶紧给画了 @@ -460,15 +437,16 @@ void MaterialRenderList::Render(RenderCmdBuffer *rcb) cmd_buf=rcb; - last_pipeline =nullptr; + cmd_buf->BindPipeline(rp_index.pipeline); + last_data_buffer=nullptr; last_vdm =nullptr; last_render_data=nullptr; if(assign_buffer) - assign_buffer->Bind(material); + assign_buffer->Bind(rp_index.material); - cmd_buf->BindDescriptorSets(material); + cmd_buf->BindDescriptorSets(rp_index.material); RenderItem *ri=ri_array.GetData(); for(uint i=0;iGetMaterial(); + RenderPipelineIndex rpi(ri->GetMaterial(),ri->GetPipeline()); + MaterialRenderList *mrl; - if(!mrl_map.Get(mtl,mrl)) + if(!mrl_map.Get(rpi,mrl)) { - mrl=new MaterialRenderList(device,true,mtl); + mrl=new MaterialRenderList(device,true,rpi); - mrl_map.Add(mtl,mrl); + mrl_map.Add(rpi,mrl); } mrl->Add(sn); @@ -92,10 +93,10 @@ namespace hgl if(!ri)return; - Material *mtl=ri->GetMaterial(); + RenderPipelineIndex rli(ri->GetMaterial(),ri->GetPipeline()); MaterialRenderList *mrl; - if(!mrl_map.Get(mtl,mrl)) //找到对应的 + if(!mrl_map.Get(rli,mrl)) //找到对应的 return; mrl->UpdateMaterialInstance(sn);