diff --git a/example/Vulkan/CMakeLists.txt b/example/Vulkan/CMakeLists.txt index 7bcb6d38..4d7bfa50 100644 --- a/example/Vulkan/CMakeLists.txt +++ b/example/Vulkan/CMakeLists.txt @@ -25,6 +25,7 @@ SET(VULKAN_TEST_SOURCE_FILES main.cpp VKSemaphore.cpp VKFramebuffer.cpp VKFence.cpp + VKMaterial.cpp ) SET(VULKAN_TEST_HEADER_FILES VK.h @@ -47,6 +48,7 @@ SET(VULKAN_TEST_HEADER_FILES VK.h VKPipeline.h VKFramebuffer.h VKFence.h + VKMaterial.h Window.h) SET(SHADER_FILES shader_compile.bat diff --git a/example/Vulkan/VKDevice.cpp b/example/Vulkan/VKDevice.cpp index cac23073..23897cc1 100644 --- a/example/Vulkan/VKDevice.cpp +++ b/example/Vulkan/VKDevice.cpp @@ -8,9 +8,10 @@ #include"VKFramebuffer.h" #include"VKFence.h" #include"VKSemaphore.h" +#include"VKMaterial.h" +#include"VKDescriptorSets.h" VK_NAMESPACE_BEGIN - namespace { bool CreateVulkanBuffer(VulkanBuffer &vb,const DeviceAttribute *rsa,VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode) @@ -315,4 +316,11 @@ bool Device::QueuePresent() return(vkQueuePresentKHR(attr->present_queue, &present)==VK_SUCCESS); } + +Material *Device::CreateMaterial(Shader *shader) +{ + DescriptorSetLayoutCreater *dslc=new DescriptorSetLayoutCreater(this); + + return(new Material(shader,dslc)); +} VK_NAMESPACE_END diff --git a/example/Vulkan/VKDevice.h b/example/Vulkan/VKDevice.h index ad307a53..98c38c39 100644 --- a/example/Vulkan/VKDevice.h +++ b/example/Vulkan/VKDevice.h @@ -15,6 +15,8 @@ class CommandBuffer; class RenderPass; class Fence; class Semaphore; +class Material; +class Shader; #define MAX_FRAMES_IN_FLIGHT 2 @@ -81,6 +83,8 @@ public: #undef CREATE_BUFFER_OBJECT + Material * CreateMaterial(Shader *); + CommandBuffer * CreateCommandBuffer(); RenderPass * CreateRenderPass(VkFormat color_format,VkFormat depth_format); Fence * CreateFence(); diff --git a/example/Vulkan/VKMaterial.cpp b/example/Vulkan/VKMaterial.cpp new file mode 100644 index 00000000..6c92693d --- /dev/null +++ b/example/Vulkan/VKMaterial.cpp @@ -0,0 +1,12 @@ +#include"VKMaterial.h" +VK_NAMESPACE_BEGIN +Material::~Material() +{ + delete dsl_creater; + delete shader; +} + +MaterialInstance *Material::CreateInstance() +{ +} +VK_NAMESPACE_END diff --git a/example/Vulkan/VKMaterial.h b/example/Vulkan/VKMaterial.h new file mode 100644 index 00000000..4238b20d --- /dev/null +++ b/example/Vulkan/VKMaterial.h @@ -0,0 +1,49 @@ +#ifndef HGL_GRAPH_VULKAN_MATERIAL_INCLUDE +#define HGL_GRAPH_VULKAN_MATERIAL_INCLUDE + +#include"VK.h" +VK_NAMESPACE_BEGIN +class Shader; +class DescriptorSetLayoutCreater; +class MaterialInstance; + +/** + * 材质类
+ * 用于管理shader,提供DescriptorSetLayoutCreater + */ +class Material +{ + Shader *shader; + DescriptorSetLayoutCreater *dsl_creater; + +public: + + Material(Shader *s,DescriptorSetLayoutCreater *dslc) + { + shader=s; + dsl_creater=dslc; + } + ~Material(); + + MaterialInstance *CreateInstance(); +};//class Material + +/** + * 材质实例
+ * 用于在指定Material的情况下,具体绑定UBO/TEXTURE等,提供pipeline + */ +class MaterialInstance +{ + Material *mat; + +public: + + MaterialInstance(Material *m) + { + mat=m; + } + + ~MaterialInstance(); +};//class MaterialInstance +VK_NAMESPACE_END +#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE diff --git a/example/Vulkan/main.cpp b/example/Vulkan/main.cpp index 17e27e71..9fcb1728 100644 --- a/example/Vulkan/main.cpp +++ b/example/Vulkan/main.cpp @@ -81,7 +81,7 @@ vulkan::Shader *LoadShader(VkDevice device) return(nullptr); } -vulkan::Buffer *CreateUBO(vulkan::Device *dev,vulkan::Shader *shader) +vulkan::Buffer *CreateUBO(vulkan::Device *dev) { { const VkExtent2D extent=dev->GetExtent(); @@ -194,7 +194,7 @@ int main(int,char **) if(!shader) return -3; - vulkan::Buffer *ubo=CreateUBO(device,shader); + vulkan::Buffer *ubo=CreateUBO(device); vulkan::VertexInput *vi=CreateVertexBuffer(device);