Added UpdateMaterialInstance method. but no any test.

This commit is contained in:
hyzboy 2024-08-30 03:36:01 +08:00
parent 726a8ec635
commit 72ceffeda2
8 changed files with 81 additions and 7 deletions

View File

@ -96,5 +96,6 @@ public:
void Render(RenderCmdBuffer *); void Render(RenderCmdBuffer *);
void UpdateLocalToWorld(); //刷新所有对象的LocalToWorld矩阵 void UpdateLocalToWorld(); //刷新所有对象的LocalToWorld矩阵
void UpdateMaterialInstance(SceneNode *);
};//class MaterialRenderList };//class MaterialRenderList
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -40,6 +40,7 @@ namespace hgl
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象 virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
virtual void UpdateLocalToWorld(); ///<更新所有对象的变换数据 virtual void UpdateLocalToWorld(); ///<更新所有对象的变换数据
virtual void UpdateMaterialInstance(SceneNode *); ///<有对象互换了材质实例
virtual void Clear(); ///<彻底清理 virtual void Clear(); ///<彻底清理
};//class RenderList };//class RenderList

View File

@ -13,6 +13,8 @@ namespace hgl
struct RenderNode struct RenderNode
{ {
uint index; ///<在MaterialRenderList中的索引
SceneNode * scene_node; SceneNode * scene_node;
uint32 l2w_version; uint32 l2w_version;

View File

@ -103,6 +103,20 @@ public:
const PrimitiveDataBuffer *GetDataBuffer ()const{return primitive_data_buffer;} const PrimitiveDataBuffer *GetDataBuffer ()const{return primitive_data_buffer;}
const PrimitiveRenderData *GetRenderData ()const{return primitive_render_data;} const PrimitiveRenderData *GetRenderData ()const{return primitive_render_data;}
public:
bool ChangeMaterialInstance(MaterialInstance *mi)
{
if(!mi)
return(false);
if(mi->GetMaterial()!=mat_inst->GetMaterial()) //不能换母材质
return(false);
mat_inst=mi;
return(true);
}
};//class Renderable };//class Renderable
Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *); Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *);

View File

@ -111,6 +111,8 @@ void MaterialRenderList::Add(SceneNode *sn)
{ {
RenderNode rn; RenderNode rn;
rn.index =rn_list.GetCount();
rn.scene_node =sn; rn.scene_node =sn;
rn.l2w_version =sn->GetLocalToWorldMatrixVersion(); rn.l2w_version =sn->GetLocalToWorldMatrixVersion();
@ -187,6 +189,30 @@ void MaterialRenderList::UpdateLocalToWorld()
} }
} }
void MaterialRenderList::UpdateMaterialInstance(SceneNode *sn)
{
if(!sn)return;
if(!assign_buffer)
return;
const int node_count=rn_list.GetCount();
if(node_count<=0)return;
RenderNode *rn=rn_list.GetData();
for(int i=0;i<node_count;i++)
{
if(rn->scene_node==sn)
{
assign_buffer->UpdateMaterialInstance(rn);
return;
}
++rn;
}
}
void MaterialRenderList::RenderItem::Set(Renderable *ri) void MaterialRenderList::RenderItem::Set(Renderable *ri)
{ {
pipeline=ri->GetPipeline(); pipeline=ri->GetPipeline();

View File

@ -105,6 +105,18 @@ void RenderAssignBuffer::UpdateLocalToWorld(const RenderNodePointerList &rnp_lis
l2w_buffer->Unmap(); l2w_buffer->Unmap();
} }
void RenderAssignBuffer::UpdateMaterialInstance(const RenderNode *rn)
{
if(!rn)
return;
AssignData *adp=(AssignData *)(assign_vab->DeviceBuffer::Map(sizeof(AssignData)*rn->index,sizeof(AssignData)));
adp->mi=mi_set.Find(rn->scene_node->GetRenderable()->GetMaterialInstance());
assign_vab->Unmap();
}
void RenderAssignBuffer::StatMI(const RenderNodeList &rn_list) void RenderAssignBuffer::StatMI(const RenderNodeList &rn_list)
{ {
mi_set.Clear(); mi_set.Clear();

View File

@ -93,5 +93,6 @@ public:
void WriteNode(const RenderNodeList &); void WriteNode(const RenderNodeList &);
void UpdateLocalToWorld(const RenderNodePointerList &,const int first,const int last); void UpdateLocalToWorld(const RenderNodePointerList &,const int first,const int last);
void UpdateMaterialInstance(const RenderNode *);
};//struct RenderAssignBuffer };//struct RenderAssignBuffer
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -85,5 +85,22 @@ namespace hgl
mrl_map.UpdateLocalToWorld(); mrl_map.UpdateLocalToWorld();
} }
void RenderList::UpdateMaterialInstance(SceneNode *sn)
{
if(!sn)return;
Renderable *ri=sn->GetRenderable();
if(!ri)return;
Material *mtl=ri->GetMaterial();
MaterialRenderList *mrl;
if(!mrl_map.Get(mtl,mrl)) //找到对应的
return;
mrl->UpdateMaterialInstance(sn);
}
}//namespace graph }//namespace graph
}//namespace hgl }//namespace hgl