From f947a0746a523e6b81f4ac9a8013d5bce5229855 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 20 Jan 2020 15:39:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0VKMaterialInstance=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Vulkan/FragCoordTest.cpp | 29 ++++-------- example/Vulkan/VulkanAppFramework.h | 1 + inc/hgl/graph/vulkan/VK.h | 1 + inc/hgl/graph/vulkan/VKMaterial.h | 3 +- inc/hgl/graph/vulkan/VKMaterialInstance.h | 33 ++++++++++++++ src/RenderDevice/Vulkan/CMakeLists.txt | 3 +- .../Vulkan/VKMaterialInstance.cpp | 44 +++++++++++++++++++ 7 files changed, 91 insertions(+), 23 deletions(-) create mode 100644 inc/hgl/graph/vulkan/VKMaterialInstance.h create mode 100644 src/RenderDevice/Vulkan/VKMaterialInstance.cpp diff --git a/example/Vulkan/FragCoordTest.cpp b/example/Vulkan/FragCoordTest.cpp index f6940817..9d0f5861 100644 --- a/example/Vulkan/FragCoordTest.cpp +++ b/example/Vulkan/FragCoordTest.cpp @@ -30,7 +30,7 @@ private: Camera cam; vulkan::Material * material =nullptr; - vulkan::DescriptorSets * descriptor_sets =nullptr; + vulkan::MaterialInstance * material_instance =nullptr; vulkan::Renderable * render_obj =nullptr; vulkan::Buffer * ubo_mvp =nullptr; @@ -46,7 +46,7 @@ public: SAFE_CLEAR(pipeline); SAFE_CLEAR(ubo_mvp); SAFE_CLEAR(render_obj); - SAFE_CLEAR(descriptor_sets); + SAFE_CLEAR(material_instance); SAFE_CLEAR(material); } @@ -60,20 +60,7 @@ private: return(false); render_obj=material->CreateRenderable(VERTEX_COUNT); - descriptor_sets=material->CreateDescriptorSets(); - return(true); - } - - bool BindUBO(const UTF8String &name,vulkan::Buffer *ubo) - { - const int index=material->GetUBO(name); - - if(index<0) - return(false); - - if(!descriptor_sets->BindUBO(index,ubo)) - return(false); - + material_instance=material->CreateInstance(); return(true); } @@ -91,10 +78,10 @@ private: if(!ubo_mvp) return(nullptr); - BindUBO("world",ubo_mvp); - BindUBO("fragment_world",ubo_mvp); + material_instance->BindUBO("world",ubo_mvp); + material_instance->BindUBO("fragment_world",ubo_mvp); - descriptor_sets->Update(); + material_instance->Update(); return(true); } @@ -135,7 +122,7 @@ public: if(!InitPipeline()) return(false); - BuildCommandBuffer(pipeline,descriptor_sets,render_obj); + BuildCommandBuffer(pipeline,material_instance->GetDescriptorSets(),render_obj); return(true); } @@ -149,7 +136,7 @@ public: ubo_mvp->Write(&cam.matrix); - BuildCommandBuffer(pipeline,descriptor_sets,render_obj); + BuildCommandBuffer(pipeline,material_instance->GetDescriptorSets(),render_obj); } };//class TestApp:public VulkanApplicationFramework diff --git a/example/Vulkan/VulkanAppFramework.h b/example/Vulkan/VulkanAppFramework.h index 061dac86..e7177357 100644 --- a/example/Vulkan/VulkanAppFramework.h +++ b/example/Vulkan/VulkanAppFramework.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include diff --git a/inc/hgl/graph/vulkan/VK.h b/inc/hgl/graph/vulkan/VK.h index c76c66f5..0d09c6e5 100644 --- a/inc/hgl/graph/vulkan/VK.h +++ b/inc/hgl/graph/vulkan/VK.h @@ -48,6 +48,7 @@ class ShaderModule; class ShaderModuleManage; class VertexShaderModule; class Material; +class MaterialInstance; class PipelineLayout; class Pipeline; class DescriptorSets; diff --git a/inc/hgl/graph/vulkan/VKMaterial.h b/inc/hgl/graph/vulkan/VKMaterial.h index d1697adb..633e6456 100644 --- a/inc/hgl/graph/vulkan/VKMaterial.h +++ b/inc/hgl/graph/vulkan/VKMaterial.h @@ -5,7 +5,7 @@ #include #include VK_NAMESPACE_BEGIN -class DescriptorSetLayoutCreater;; +class DescriptorSetLayoutCreater; using ShaderModuleMap=hgl::Map; /** @@ -58,6 +58,7 @@ public: void Write(VkPipelineVertexInputStateCreateInfo &vis)const; Renderable *CreateRenderable(const uint32_t draw_count=0); + MaterialInstance *CreateInstance(); };//class Material VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE diff --git a/inc/hgl/graph/vulkan/VKMaterialInstance.h b/inc/hgl/graph/vulkan/VKMaterialInstance.h new file mode 100644 index 00000000..60fbc05e --- /dev/null +++ b/inc/hgl/graph/vulkan/VKMaterialInstance.h @@ -0,0 +1,33 @@ +#ifndef HGL_GRAPH_VULKAN_MATERIAL_INSTANCE_INCLUDE +#define HGL_GRAPH_VULKAN_MATERIAL_INSTANCE_INCLUDE + +#include +#include +VK_NAMESPACE_BEGIN +class MaterialInstance +{ + Material *material; + + DescriptorSets *descriptor_sets; + +private: + + friend class Material; + + MaterialInstance(Material *,DescriptorSets *); + +public: + + Material * GetMaterial (){return material;} + DescriptorSets *GetDescriptorSets (){return descriptor_sets;} + +public: + + ~MaterialInstance(); + + bool BindUBO(const UTF8String &name,vulkan::Buffer *ubo); + + void Update(); +};//class MaterialInstance +VK_NAMESPACE_END +#endif//HGL_GRAPH_VULKAN_MATERIAL_INSTANCE_INCLUDE \ No newline at end of file diff --git a/src/RenderDevice/Vulkan/CMakeLists.txt b/src/RenderDevice/Vulkan/CMakeLists.txt index f08e2bbf..6c3311ec 100644 --- a/src/RenderDevice/Vulkan/CMakeLists.txt +++ b/src/RenderDevice/Vulkan/CMakeLists.txt @@ -19,7 +19,8 @@ SET(VK_SHADER_SOURCE VKShaderParse.h SET(VK_MATERIAL_SOURCE VKImageView.cpp VKTexture.cpp - VKMaterial.cpp) + VKMaterial.cpp + VKMaterialInstance.cpp) SET(VK_RENDER_PASS_SOURCE VKFramebuffer.cpp VKPipeline.cpp diff --git a/src/RenderDevice/Vulkan/VKMaterialInstance.cpp b/src/RenderDevice/Vulkan/VKMaterialInstance.cpp new file mode 100644 index 00000000..4cc6ec22 --- /dev/null +++ b/src/RenderDevice/Vulkan/VKMaterialInstance.cpp @@ -0,0 +1,44 @@ +#include + +#include +#include + +VK_NAMESPACE_BEGIN +MaterialInstance::MaterialInstance(Material *m,DescriptorSets *ds) +{ + material=m; + descriptor_sets=ds; +} + +MaterialInstance::~MaterialInstance() +{ + delete descriptor_sets; +} + +bool MaterialInstance::BindUBO(const UTF8String &name,vulkan::Buffer *ubo) +{ + const int index=material->GetUBO(name); + + if(index<0) + return(false); + + if(!descriptor_sets->BindUBO(index,ubo)) + return(false); + + return(true); +} + +void MaterialInstance::Update() +{ + descriptor_sets->Update(); +} + +MaterialInstance *Material::CreateInstance() +{ + DescriptorSets *ds=CreateDescriptorSets(); + + if(!ds)return(nullptr); + + return(new MaterialInstance(this,ds)); +} +VK_NAMESPACE_END \ No newline at end of file