vulkan绘制多物体--Apple的学习笔记

为了解决vulkan如何创建多物体,而且可以作为独立个体单独变换的问题。找了官网一个hologram项目学习参考,此架构不错,将来可以考虑在此基础修改。

总结

  1. 学习到了一开始就创建多个物体的方法,就是用vector将他们拼接起来即可。
  2. 学习到了用描述符绑定动态buffer的思路可以实现物体的单独变换。VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;//VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
    vkCmdBindDescriptorSets中使用offset地址对每一个obj内容修改即可实现单独变换。

关键代码

  1. 创建每个类型的多个角度/大小的物体
//object_count数量可以自行修改,选择要创建的物体个数
Simulation::Simulation(int object_count) : random_dev_() {
    MeshPicker mesh;
    ColorPicker color(random_dev_());

    objects_.reserve(object_count);
    for (int i = 0; i < object_count; i++) {
        Meshes::Type type = mesh.pick();
        float scale = mesh.scale(type);
        //可以自行修改
        objects_.emplace_back(Object{
            type, glm::vec3(0.5f + 0.5f * (float)i / object_count), color.pick(), Animation(random_dev_(), scale),
            Path(random_dev_()),
        });
    }
}
  1. 一共画3种类型的图形,每种进行记录,主要是合并vb_size和ib_size。
void build_meshes(std::array &meshes) {
    BuildPyramid build_pyramid(meshes[Meshes::MESH_PYRAMID]);
    BuildIcosphere build_icosphere(meshes[Meshes::MESH_ICOSPHERE]);
    BuildTeapot build_teapot(meshes[Meshes::MESH_TEAPOT]);
}
    for (const auto &mesh : meshes) {
        VkDrawIndexedIndirectCommand draw = {};
        draw.indexCount = mesh.index_count();
        draw.instanceCount = 1;
        draw.firstIndex = first_index;
        draw.vertexOffset = vertex_offset;
        draw.firstInstance = 0;

        draw_commands_.push_back(draw);

        first_index += mesh.index_count();
        vertex_offset += mesh.vertex_count();
        vb_size += mesh.vertex_buffer_size();
        ib_size += mesh.index_buffer_size();
    }

显示效果

多物体.png

参考网址

https://www.jianshu.com/p/4a9dff7e8d10

你可能感兴趣的:(vulkan绘制多物体--Apple的学习笔记)