diff --git a/inc/hgl/graph/VKPipeline.h b/inc/hgl/graph/VKPipeline.h index 6e1b7619..7cc525bb 100644 --- a/inc/hgl/graph/VKPipeline.h +++ b/inc/hgl/graph/VKPipeline.h @@ -13,6 +13,8 @@ class Pipeline AnsiString name; VkPipeline pipeline; + + const VIL *vil; PipelineData *data; bool alpha_test; @@ -22,12 +24,13 @@ private: friend class RenderPass; - Pipeline(const AnsiString &n,VkDevice dev,VkPipeline p,PipelineData *pd) + Pipeline(const AnsiString &n,VkDevice dev,VkPipeline p,const VIL *v,PipelineData *pd) { name=n; device=dev; pipeline=p; + vil=v; data=pd; alpha_test=false; @@ -42,6 +45,7 @@ public: operator VkPipeline(){return pipeline;} + const VIL *GetVIL()const{return vil;} const PipelineData *GetData()const{return data;} const bool IsAlphaTest()const{return data->alpha_test>0;} diff --git a/src/SceneGraph/Vulkan/VKRenderPass.cpp b/src/SceneGraph/Vulkan/VKRenderPass.cpp index 992ee840..8f03fe29 100644 --- a/src/SceneGraph/Vulkan/VKRenderPass.cpp +++ b/src/SceneGraph/Vulkan/VKRenderPass.cpp @@ -53,10 +53,9 @@ Pipeline *RenderPass::CreatePipeline(const AnsiString &name,PipelineData *pd,con return(nullptr); } - return(new Pipeline(name,device,graphicsPipeline,pd)); + return(new Pipeline(name,device,graphicsPipeline,vil,pd)); } - Pipeline *RenderPass::CreatePipeline(Material *mtl,const VIL *vil,const PipelineData *cpd,const Prim &prim,const bool prim_restart) { PipelineData *pd=new PipelineData(cpd); diff --git a/src/SceneGraph/Vulkan/VKRenderable.cpp b/src/SceneGraph/Vulkan/VKRenderable.cpp index eea25dea..b0df83b7 100644 --- a/src/SceneGraph/Vulkan/VKRenderable.cpp +++ b/src/SceneGraph/Vulkan/VKRenderable.cpp @@ -60,6 +60,10 @@ Renderable *CreateRenderable(Primitive *prim,MaterialInstance *mi,Pipeline *p) if(!prim||!mi||!p)return(nullptr); const VIL *vil=mi->GetVIL(); + + if(vil->Comp(p->GetVIL())) + return(nullptr); + const uint32_t input_count=vil->GetVertexAttribCount(VertexInputGroup::Basic); //不统计Bone/LocalToWorld组的 const UTF8String &mtl_name=mi->GetMaterial()->GetName();