{"id":23427687,"url":"https://github.com/sunxfancy/vkbuilder","last_synced_at":"2025-04-09T12:43:16.901Z","repository":{"id":165018811,"uuid":"400069789","full_name":"sunxfancy/VKBuilder","owner":"sunxfancy","description":"Vulkan helper utilities - builders for everything","archived":false,"fork":false,"pushed_at":"2023-12-24T18:09:55.000Z","size":1205,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-15T06:42:20.977Z","etag":null,"topics":["builder","render","rendering","vk","vulkan","vulkan-api","vulkan-sdk"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sunxfancy.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-08-26T06:50:27.000Z","updated_at":"2023-12-01T16:37:46.000Z","dependencies_parsed_at":"2024-12-23T06:35:24.890Z","dependency_job_id":"9a5d44b6-9dbc-494d-a34c-f93bfb7e182d","html_url":"https://github.com/sunxfancy/VKBuilder","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sunxfancy%2FVKBuilder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sunxfancy%2FVKBuilder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sunxfancy%2FVKBuilder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sunxfancy%2FVKBuilder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sunxfancy","download_url":"https://codeload.github.com/sunxfancy/VKBuilder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248045217,"owners_count":21038553,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["builder","render","rendering","vk","vulkan","vulkan-api","vulkan-sdk"],"created_at":"2024-12-23T06:35:18.210Z","updated_at":"2025-04-09T12:43:16.880Z","avatar_url":"https://github.com/sunxfancy.png","language":"C++","readme":"VkBuilder 便捷的vulkan对象构造器\n================================\n\n\n我们在使用vulkan时，往往被繁琐的概念和大量的参数设置困扰，这个库的主要目的是创建一套能快速构建Vulkan对象的构造器，使用这些builder可以快速创建常用的，带有良好设计默认参数的，带有常用配置方案的对象。从而可以快速创建可用的渲染流水线。\n\n我们对Instance，Device等对象都进行了包装，将其和其他常用对象打包，使得很多API调用时可以减少参数的使用，尤其是减少参数的传入错误\n\n\n设计思路：\n1. 先提供常用的参数，允许默认构建性能一般但可用的对象，提供接口对构造时进行特化指定\n2. 大量使用流式API\n3. 通过打包其他对象，尽量减少接口调用时的参数\n4. 明确哪些对象和其他对象的约束关系，在接口中体现这种约束关系，尽量使得不符合约束关系的调用无法被编译\n5. 使用模板减少代码量\n\n\n## 使用方法\n\n\n使用VKBuilder可以快速创建实例，设备，渲染界面，交换链等等Vulkan对象。\n\n```cpp\n#define VKB_IMPL\n#include \"vkbuilder.hpp\"\n\nclass Render {\npublic:\n  void init(void *window) {\n\n    // 首先创建构造器，选择API版本，需要的layer，配置debug messenger\n    vkb::InstanceBuilder builder;\n    inst = builder.require_api_version(1, 0)\n                  .request_validation_layers()   // validate correctness\n                  .use_default_debug_messenger() // use DebugUtilsMessage\n                  .build();\n\n    // 创建surface用于渲染\n    auto surface = (VkSurfaceKHR)create_surface_glfw(inst.instance, window);\n\n    // 创建一个PhysicalDeviceSelector用来选择渲染设备\n    vkb::PhysicalDeviceSelector selector{inst};\n\n    auto phys = selector.set_surface(surface)\n            .set_minimum_version(1, 0) // require a vulkan 1.0 capable device\n            .select();\n\n    vkb::DeviceBuilder device_builder{phys};\n\n    // 构造设备\n    // automatically propagate needed data from instance \u0026 physical device\n    device = device_builder.build();\n\n    create_swapchain();\n    create_pipeline();\n  }\n\n  void create_swapchain() {\n    // 创建默认交换链\n    vkb::SwapchainBuilder swapchain_builder{device};\n    auto swap_ret = swapchain_builder.set_old_swapchain(swapchain).build();\n    swapchain.destroy();\n    swapchain = swap_ret;\n  }\n\n  void create_pipeline() {\n    // 创建渲染Pass\n    vkb::RenderPassBuilder renderpass_builder{device};\n    renderpass = renderpass_builder\n            .addPresentAttachment(swapchain.image_format, vk::AttachmentLoadOp::eClear)\n            .addSubpass(vkb::SubpassBuilder()\n              .addAttachmentRef(0, vk::ImageLayout::eColorAttachmentOptimal))\n            .addDependency(VK_SUBPASS_EXTERNAL, 0)\n            .build();\n\n    auto vert_code = readFile(\"vert.spv\");\n    auto frag_code = readFile(\"frag.spv\");\n\n    // 创建渲染流水线\n    vkb::PipelineBuilder pipeline_builder{device, swapchain};\n    pipeline = pipeline_builder\n        .useClassicPipeline(vert_code, frag_code)\n        .setVertexInputState(\n          vkb::VertexInputStateBuilder()  // VertexInputStateBuilder 可以根据Vertex上的函数进行创建\n            .addInputBinding\u003cVertex\u003e()\n            .addAttributeDescription\u003cVertex\u003e()\n        )\n        .build(renderpass);\n\n    vkb::PresentBuilder present_builder{device, swapchain};\n    present = present_builder.build(renderpass);\n\n    initVertex();\n  }\n\n  vkb::Instance inst;\n  vkb::Device device;\n  vkb::Swapchain swapchain;\n\n  vk::RenderPass renderpass;\n  vk::Pipeline pipeline;\n\n  vkb::Present present;\n\n  std::vector\u003cVertex\u003e v;\n  vkb::HostVertexBuffer buffer;\n};\n\nRender render;\n\nvoid onRender() {\n  render.render();\n}\n\nvoid initVulkan(void *window) {\n  render.init(window);\n}\n\nint main() {\n  GLFW_Window window;\n  window.createWindow();\n  initVulkan(window.getWindow());\n  window.mainLoop();\n  return 0;\n}\n```\n\n对于顶点数据结构，只需要创建`getBindingDescription`函数与`getAttributeDescription`函数，就可以将该结构体注册到我们的系统中来。\n```cpp\n\n  struct Vertex {\n    glm::vec2 pos;\n    glm::vec3 color;\n    \n    static vk::VertexInputBindingDescription \n    getBindingDescription(uint32_t binding) {\n      vk::VertexInputBindingDescription bindingDescription{};\n      bindingDescription.binding = binding;\n      bindingDescription.stride = sizeof(Vertex);\n      bindingDescription.inputRate = vk::VertexInputRate::eVertex;\n      return bindingDescription;\n    }\n    static std::vector\u003cvk::VertexInputAttributeDescription\u003e\n    getAttributeDescription(uint32_t binding) {\n      std::vector\u003cvk::VertexInputAttributeDescription\u003e attrs = {\n        vk::VertexInputAttributeDescription(0, binding, vk::Format::eR32G32Sfloat, offsetof(Vertex, pos)),\n        vk::VertexInputAttributeDescription(1, binding, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, color))\n      };\n      return attrs;\n    }\n  };\n\n  void initVertex() {\n    v.resize(3);\n    v[0].pos = {0, 0.5}; v[0].color = {1,0,0};\n    v[1].pos = {-0.5, -0.5}; v[1].color = {0,1,0};\n    v[2].pos = {0.5, -0.5}; v[2].color = {0,0,1};\n\n    // create Vertex buffer\n    buffer.allocate\u003cVertex\u003e(device, v);\n  }\n```\n\n渲染控制也非常轻松：\n```cpp\n  void render() {\n    present.begin();\n    present.beginRenderPass(renderpass);\n\n    vk::DeviceSize offset(0);\n    auto\u0026 cb = present.getCurrentCommandBuffer();\n    cb.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline);\n    cb.bindVertexBuffers(0, 1, buffer, \u0026offset);\n    cb.draw(3, 1, 0, 0);\n\n    present.endRenderPass();\n    present.end();\n    present.drawFrame();\n  }\n```\n\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsunxfancy%2Fvkbuilder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsunxfancy%2Fvkbuilder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsunxfancy%2Fvkbuilder/lists"}