diff --git a/example/Vulkan/VKCommandBuffer.cpp b/example/Vulkan/VKCommandBuffer.cpp
index ef87aff3..f0249a0e 100644
--- a/example/Vulkan/VKCommandBuffer.cpp
+++ b/example/Vulkan/VKCommandBuffer.cpp
@@ -3,6 +3,7 @@
#include"VKFramebuffer.h"
#include"VKPipeline.h"
#include"VKPipelineLayout.h"
+#include"VKBuffer.h"
#include"VKVertexInput.h"
#include"VKDescriptorSets.h"
@@ -94,6 +95,12 @@ bool CommandBuffer::Bind(VertexInput *vi)
return(false);
vkCmdBindVertexBuffers(cmd_buf,0,count,vi->GetBuffer(),vi->GetOffset());
+
+ IndexBuffer *indices_buffer=vi->GetIndexBuffer();
+
+ if(indices_buffer)
+ vkCmdBindIndexBuffer(cmd_buf,*indices_buffer,vi->GetIndexOffset(),indices_buffer->GetType());
+
return(true);
}
void CommandBuffer::SetDepthBias(float constant_factor,float clamp,float slope_factor)
@@ -141,6 +148,16 @@ void CommandBuffer::Draw(const uint32_t vertex_count,const uint32_t instance_cou
vkCmdDraw(cmd_buf,vertex_count,instance_count,first_vertex,first_instance);
}
+void CommandBuffer::DrawIndexed(const uint32_t index_count)
+{
+ vkCmdDrawIndexed(cmd_buf,index_count,1,0,0,0);
+}
+
+void CommandBuffer::DrawIndexed(const uint32_t index_count,const uint32_t instance_count,const uint32_t first_index,const uint32_t vertex_offset,const uint32_t first_instance)
+{
+ vkCmdDrawIndexed(cmd_buf,index_count,instance_count,first_index,vertex_offset,first_instance);
+}
+
bool CommandBuffer::End()
{
vkCmdEndRenderPass(cmd_buf);
diff --git a/example/Vulkan/VKCommandBuffer.h b/example/Vulkan/VKCommandBuffer.h
index 5c2dce59..fb03563c 100644
--- a/example/Vulkan/VKCommandBuffer.h
+++ b/example/Vulkan/VKCommandBuffer.h
@@ -65,6 +65,8 @@ public:
void Draw(const uint32_t vertex_count);
void Draw(const uint32_t vertex_count,const uint32_t instance_count,const uint32_t first_vertex=0,const uint32_t first_instance=0);
+ void DrawIndexed(const uint32_t index_count);
+ void DrawIndexed(const uint32_t index_count,const uint32_t instance_count,const uint32_t first_index=0,const uint32_t vertex_offset=0,const uint32_t first_instance=0);
};//class CommandBuffer
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_COMMAND_BUFFER_INCLUDE
diff --git a/example/Vulkan/VKVertexInput.h b/example/Vulkan/VKVertexInput.h
index 995e93ed..826bca3f 100644
--- a/example/Vulkan/VKVertexInput.h
+++ b/example/Vulkan/VKVertexInput.h
@@ -4,6 +4,7 @@
#include"VK.h"
VK_NAMESPACE_BEGIN
class VertexBuffer;
+class IndexBuffer;
/**
* 顶点输入配置,类似于OpenGL的VAB
@@ -29,19 +30,29 @@ class VertexInput
}
};
- ObjectList vib_list;
+ ObjectList vib_list;
List buf_list;
List buf_offset;
List binding_list;
List attribute_list;
+ IndexBuffer *indices_buffer=nullptr;
+ VkDeviceSize indices_offset=0;
+
public:
VertexInput()=default;
virtual ~VertexInput()=default;
bool Add(uint32_t location,VertexBuffer *,bool instance=false,VkDeviceSize offset=0);
+ bool AddIndices(IndexBuffer *ib,VkDeviceSize offset=0)
+ {
+ if(!ib)return(false);
+
+ indices_buffer=ib;
+ indices_offset=offset;
+ }
public:
@@ -49,6 +60,9 @@ public:
const VkBuffer * GetBuffer ()const{return buf_list.GetData();}
const VkDeviceSize * GetOffset ()const{return buf_offset.GetData();}
+ IndexBuffer * GetIndexBuffer()const{return indices_buffer;}
+ const VkDeviceSize GetIndexOffset()const{return indices_offset;}
+
const VkPipelineVertexInputStateCreateInfo GetPipelineVertexInputStateCreateInfo()const;
};//class VertexInput
VK_NAMESPACE_END