1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
void VulkanRenderer::RenderStaticMeshWithMaterial(Ref<RenderCommandBuffer> renderCommandBuffer, Ref<Pipeline> pipeline, Ref<MeshSource> meshSource, uint32_t submeshIndex, Ref<Material> material, Ref<VertexBuffer> transformBuffer, uint32_t transformOffset, uint32_t instanceCount)
{
HZ_CORE_ASSERT(meshSource);
HZ_CORE_ASSERT(material);
Ref<VulkanMaterial> vulkanMaterial = material.As<VulkanMaterial>();
Renderer::Submit([renderCommandBuffer, pipeline,meshSource, submeshIndex, vulkanMaterial, transformBuffer, transformOffset, instanceCount]() mutable {
uint32_t frameIndex = Renderer::RT_GetCurrentFrameIndex();
VkCommandBuffer commandBuffer = renderCommandBuffer.As<VulkanRenderCommandBuffer>()->GetActiveCommandBuffer();
Ref<VulkanVertexBuffer> meshVertBuffer = meshSource->GetVertexBuffer().As<VulkanVertexBuffer>();
VkBuffer vkMeshVertBuffer = meshVertBuffer->GetVulkanBuffer();
VkDeviceSize vertexOffsets[1] = { 0 };
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &vkMeshVertBuffer, vertexOffsets); // 把整个Mesh的顶点都绑定
Ref<VulkanVertexBuffer> vulkanTransformBuffer = transformBuffer.As<VulkanVertexBuffer>();
VkBuffer vkTransformBuffer = vulkanTransformBuffer->GetVulkanBuffer();
VkDeviceSize instanceOffsets[1] = { transformOffset };
vkCmdBindVertexBuffers(commandBuffer, 1, 1, &vkTransformBuffer, instanceOffsets); // 第二个顶点缓冲区绑定当前SubMesh的变换矩阵数据
auto vulkanMeshIB = Ref<VulkanIndexBuffer>(meshSource->GetIndexBuffer());
VkBuffer ibBuffer = vulkanMeshIB->GetVulkanBuffer();
vkCmdBindIndexBuffer(commandBuffer, ibBuffer, 0, VK_INDEX_TYPE_UINT32); // 索引缓冲区全绑定
// 每个材质绑定自己的 Set=1
VkDescriptorSet matSet = vulkanMaterial->GetDescriptorSets()[frameIndex];
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
pipeline.As<VulkanPipeline>()->GetVulkanPipelineLayout(),
1, // Set=1
1, &matSet,
0, nullptr);
const auto& submeshes = meshSource->GetSubmeshes();
const auto& submesh = submeshes[submeshIndex];
vkCmdDrawIndexed(commandBuffer, submesh.IndexCount/*索引数量*/, instanceCount/*实例数量*/, submesh.BaseIndex/*索引缓冲区的偏移*/, submesh.BaseVertex/*顶点偏移*/, 0/*实例化ID开始的编号*/);
});
}
|