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