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);