{"id":13731680,"url":"https://github.com/andrejnau/FlyCube","last_synced_at":"2025-05-08T05:30:34.051Z","repository":{"id":41989548,"uuid":"167237794","full_name":"andrejnau/FlyCube","owner":"andrejnau","description":"Graphics API wrapper is written in C++ on top of DirectX 12, Vulkan and Metal. Provides main features including ray tracing.","archived":false,"fork":false,"pushed_at":"2025-04-18T10:16:04.000Z","size":884172,"stargazers_count":409,"open_issues_count":3,"forks_count":21,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-18T22:14:40.018Z","etag":null,"topics":["d3d12","direct3d","directx","directx-12","directx12","dxr","gamedev","graphics-api","graphics-engine","graphics-library","graphics-programming","metal","ray-tracing","raytracing","renderer","rendering","rtx","vulkan","vulkan-api"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andrejnau.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2019-01-23T19:03:44.000Z","updated_at":"2025-04-18T18:01:40.000Z","dependencies_parsed_at":"2023-11-26T12:27:08.657Z","dependency_job_id":"a0a1e6ea-8dde-4db6-b324-46cd5f453cc0","html_url":"https://github.com/andrejnau/FlyCube","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/andrejnau%2FFlyCube","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrejnau%2FFlyCube/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrejnau%2FFlyCube/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrejnau%2FFlyCube/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andrejnau","download_url":"https://codeload.github.com/andrejnau/FlyCube/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253008345,"owners_count":21839631,"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":["d3d12","direct3d","directx","directx-12","directx12","dxr","gamedev","graphics-api","graphics-engine","graphics-library","graphics-programming","metal","ray-tracing","raytracing","renderer","rendering","rtx","vulkan","vulkan-api"],"created_at":"2024-08-03T02:01:35.694Z","updated_at":"2025-05-08T05:30:34.042Z","avatar_url":"https://github.com/andrejnau.png","language":"C++","readme":"# FlyCube\nFlyCube is a low-level graphics API is written in C++ on top of `DirectX 12`, `Vulkan` and `Metal`.\n\n### The low-level graphics API features\n* Ray tracing\n* Mesh shading\n* Variable rate shading\n* Bindless resource binding\n* HLSL as a shader language for all backends\n  * Compilation in DXIL, SPIRV or MSL depend on selected backend\n\n### Supported platforms\n\n|                | DirectX 12               | Vulkan                        | Metal                    |\n|----------------|--------------------------|-------------------------------|--------------------------|\n| Windows        | :heavy_check_mark:       | :heavy_check_mark:            | :heavy_multiplication_x: |\n| macOS/iOS/tvOS | :heavy_multiplication_x: | :heavy_check_mark: (MoltenVK) | :heavy_check_mark:       |\n| Linux/Android  | :heavy_multiplication_x: | :heavy_check_mark:            | :heavy_multiplication_x: |\n\n### Cloning repository\n```\ngit clone --recursive https://github.com/andrejnau/FlyCube.git\n```\n\n### An example of the low-level graphics API usage\n```cpp\nstd::shared_ptr\u003cInstance\u003e instance = CreateInstance(settings.api_type);\nstd::shared_ptr\u003cAdapter\u003e adapter = std::move(instance-\u003eEnumerateAdapters()[settings.required_gpu_index]);\nstd::shared_ptr\u003cDevice\u003e device = adapter-\u003eCreateDevice();\nstd::shared_ptr\u003cCommandQueue\u003e command_queue = device-\u003eGetCommandQueue(CommandListType::kGraphics);\nstatic constexpr uint32_t kFrameCount = 3;\nstd::shared_ptr\u003cSwapchain\u003e swapchain = device-\u003eCreateSwapchain(app.GetNativeWindow(), app_size.width(),\n                                                                app_size.height(), kFrameCount, settings.vsync);\nuint64_t fence_value = 0;\nstd::shared_ptr\u003cFence\u003e fence = device-\u003eCreateFence(fence_value);\n\nstd::vector\u003cuint32_t\u003e index_data = { 0, 1, 2 };\nstd::shared_ptr\u003cResource\u003e index_buffer = device-\u003eCreateBuffer(BindFlag::kIndexBuffer | BindFlag::kCopyDest,\n                                                              sizeof(index_data.front()) * index_data.size());\nindex_buffer-\u003eCommitMemory(MemoryType::kUpload);\nindex_buffer-\u003eUpdateUploadBuffer(0, index_data.data(), sizeof(index_data.front()) * index_data.size());\n\nstd::vector\u003cglm::vec3\u003e vertex_data = {\n    glm::vec3(-0.5, -0.5, 0.0),\n    glm::vec3(0.0, 0.5, 0.0),\n    glm::vec3(0.5, -0.5, 0.0),\n};\nstd::shared_ptr\u003cResource\u003e vertex_buffer = device-\u003eCreateBuffer(BindFlag::kVertexBuffer | BindFlag::kCopyDest,\n                                                                sizeof(vertex_data.front()) * vertex_data.size());\nvertex_buffer-\u003eCommitMemory(MemoryType::kUpload);\nvertex_buffer-\u003eUpdateUploadBuffer(0, vertex_data.data(), sizeof(vertex_data.front()) * vertex_data.size());\n\nglm::vec4 constant_data = glm::vec4(1, 0, 0, 1);\nstd::shared_ptr\u003cResource\u003e constant_buffer =\n    device-\u003eCreateBuffer(BindFlag::kConstantBuffer | BindFlag::kCopyDest, sizeof(constant_data));\nconstant_buffer-\u003eCommitMemory(MemoryType::kUpload);\nconstant_buffer-\u003eUpdateUploadBuffer(0, \u0026constant_data, sizeof(constant_data));\n\nstd::shared_ptr\u003cShader\u003e vertex_shader =\n    device-\u003eCompileShader({ ASSETS_PATH \"shaders/Triangle/VertexShader.hlsl\", \"main\", ShaderType::kVertex, \"6_0\" });\nstd::shared_ptr\u003cShader\u003e pixel_shader =\n    device-\u003eCompileShader({ ASSETS_PATH \"shaders/Triangle/PixelShader.hlsl\", \"main\", ShaderType::kPixel, \"6_0\" });\nstd::shared_ptr\u003cProgram\u003e program = device-\u003eCreateProgram({ vertex_shader, pixel_shader });\n\nViewDesc constant_view_desc = {\n    .view_type = ViewType::kConstantBuffer,\n    .dimension = ViewDimension::kBuffer,\n};\nstd::shared_ptr\u003cView\u003e constant_view = device-\u003eCreateView(constant_buffer, constant_view_desc);\nBindKey settings_key = {\n    .shader_type = ShaderType::kPixel,\n    .view_type = ViewType::kConstantBuffer,\n    .slot = 0,\n    .space = 0,\n    .count = 1,\n};\nstd::shared_ptr\u003cBindingSetLayout\u003e layout = device-\u003eCreateBindingSetLayout({ settings_key });\nstd::shared_ptr\u003cBindingSet\u003e binding_set = device-\u003eCreateBindingSet(layout);\nbinding_set-\u003eWriteBindings({ { settings_key, constant_view } });\n\nRenderPassDesc render_pass_desc = {\n    { { swapchain-\u003eGetFormat(), RenderPassLoadOp::kClear, RenderPassStoreOp::kStore } },\n};\nstd::shared_ptr\u003cRenderPass\u003e render_pass = device-\u003eCreateRenderPass(render_pass_desc);\nClearDesc clear_desc = { { { 0.0, 0.2, 0.4, 1.0 } } };\nGraphicsPipelineDesc pipeline_desc = {\n    program,\n    layout,\n    { { 0, \"POSITION\", gli::FORMAT_RGB32_SFLOAT_PACK32, sizeof(vertex_data.front()) } },\n    render_pass,\n};\nstd::shared_ptr\u003cPipeline\u003e pipeline = device-\u003eCreateGraphicsPipeline(pipeline_desc);\n\nstd::array\u003cuint64_t, kFrameCount\u003e fence_values = {};\nstd::vector\u003cstd::shared_ptr\u003cCommandList\u003e\u003e command_lists;\nstd::vector\u003cstd::shared_ptr\u003cFramebuffer\u003e\u003e framebuffers;\nfor (uint32_t i = 0; i \u003c kFrameCount; ++i) {\n    ViewDesc back_buffer_view_desc = {\n        .view_type = ViewType::kRenderTarget,\n        .dimension = ViewDimension::kTexture2D,\n    };\n    std::shared_ptr\u003cResource\u003e back_buffer = swapchain-\u003eGetBackBuffer(i);\n    std::shared_ptr\u003cView\u003e back_buffer_view = device-\u003eCreateView(back_buffer, back_buffer_view_desc);\n    FramebufferDesc framebuffer_desc = {\n        .render_pass = render_pass,\n        .width = app_size.width(),\n        .height = app_size.height(),\n        .colors = { back_buffer_view },\n    };\n    std::shared_ptr\u003cFramebuffer\u003e framebuffer =\n        framebuffers.emplace_back(device-\u003eCreateFramebuffer(framebuffer_desc));\n    std::shared_ptr\u003cCommandList\u003e command_list =\n        command_lists.emplace_back(device-\u003eCreateCommandList(CommandListType::kGraphics));\n    command_list-\u003eBindPipeline(pipeline);\n    command_list-\u003eBindBindingSet(binding_set);\n    command_list-\u003eSetViewport(0, 0, app_size.width(), app_size.height());\n    command_list-\u003eSetScissorRect(0, 0, app_size.width(), app_size.height());\n    command_list-\u003eIASetIndexBuffer(index_buffer, gli::format::FORMAT_R32_UINT_PACK32);\n    command_list-\u003eIASetVertexBuffer(0, vertex_buffer);\n    command_list-\u003eResourceBarrier({ { back_buffer, ResourceState::kPresent, ResourceState::kRenderTarget } });\n    command_list-\u003eBeginRenderPass(render_pass, framebuffer, clear_desc);\n    command_list-\u003eDrawIndexed(3, 1, 0, 0, 0);\n    command_list-\u003eEndRenderPass();\n    command_list-\u003eResourceBarrier({ { back_buffer, ResourceState::kRenderTarget, ResourceState::kPresent } });\n    command_list-\u003eClose();\n}\n\nwhile (!app.PollEvents()) {\n    uint32_t frame_index = swapchain-\u003eNextImage(fence, ++fence_value);\n    command_queue-\u003eWait(fence, fence_value);\n    fence-\u003eWait(fence_values[frame_index]);\n    command_queue-\u003eExecuteCommandLists({ command_lists[frame_index] });\n    command_queue-\u003eSignal(fence, fence_values[frame_index] = ++fence_value);\n    swapchain-\u003ePresent(fence, fence_values[frame_index]);\n}\ncommand_queue-\u003eSignal(fence, ++fence_value);\nfence-\u003eWait(fence_value);\n```\n\n### Advanced sample\n[SponzaPbr](https://github.com/andrejnau/SponzaPbr) was originally part of the repository. This is my sandbox for rendering techniques.\n* Features\n  * Deferred rendering\n  * Physically based rendering\n  * Image based lighting\n  * Ambient occlusion\n    * Raytracing\n    * Screen space\n  * Normal mapping\n  * Point shadow mapping\n  * Skeletal animation\n  * Multisample anti-aliasing\n  * Tone mapping\n  * Simple imgui based UI settings\n\n![sponza.png](screenshots/sponza.png)\n","funding_links":[],"categories":["Graphics"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrejnau%2FFlyCube","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandrejnau%2FFlyCube","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrejnau%2FFlyCube/lists"}