#vulkan #ash #imgui #command-buffer #index-buffer #vertex-buffer

imgui-rs-vulkan-renderer

使用 Ash 为 imgui-rs 提供的 Vulkan 渲染器

31 个版本 (17 个稳定版)

1.14.0 2024年8月21日
1.13.0 2024年5月5日
1.12.0 2024年2月2日
1.10.0 2023年9月26日
0.3.1 2020年3月2日

图形API 中排名 37

Download history 128/week @ 2024-05-03 8/week @ 2024-05-10 25/week @ 2024-05-17 9/week @ 2024-05-24 1/week @ 2024-06-07 2/week @ 2024-06-14 4/week @ 2024-06-21 1/week @ 2024-07-26 118/week @ 2024-08-16

每月下载量 119

MIT 许可证

83KB
1.5K SLoC

imgui-rs-vulkan-renderer

Version Docs.rs Build Status Publish Status

使用 imgui-rsAsh 实现的 Vulkan 渲染器。

screenshot

兼容性

crate imgui ash gpu-allocator (功能) vk-mem (功能)
1.14.0 0.12 0.38 0.27 0.4.0
1.13.0 0.12 [0.34, 0.37] 0.26 0.3.0
1.12.0 0.11 [0.34, 0.37] 0.25 0.3.0
1.11.0 0.11 [0.34, 0.37] 0.25 0.2.3 (分支)
1.10.0 0.11 [0.34, 0.37] 0.23 0.2.3 (分支)
1.9.0 0.11 [0.34, 0.37] 0.22 0.2.3 (分支)
1.8.0 0.10 [0.34, 0.37] 0.22 0.2.3 (分支)
1.7.0 0.10 [0.34, 0.37] [0.19, 0.21] 0.2.3 (分支)
1.6.x 0.9 [0.34, 0.37] [0.19, 0.21] 0.2.3 (分支)
1.5.0 0.8 [0.34, 0.37] 0.19 0.2.3 (分支)
1.4.0 0.8 [0.34, 0.37] 0.18 0.2.3 (分支)
1.3.0 0.8 [0.34, 0.37] 0.18 0.2.3 (分支)
1.2.0 0.8 0.36 0.17 0.2.3 (分支)
1.1.x 0.8 0.35 0.15 0.2.3 (分支)
1.0.0 0.8 0.35 0.14 0.2.3 (分支)

工作原理

渲染器将绘图命令记录到应用程序提供的命令缓冲区中。以下是此crate的功能及其工作方式的简要概述。

  • 顶点/索引缓冲区

渲染器创建一个顶点缓冲区和索引缓冲区,每次调用 Renderer::cmd_draw 时都会更新这些缓冲区。如果顶点/索引计数超过缓冲区实际能容纳的数量,则缓冲区会进行缩放(实际上是销毁后重新创建)。

  • 飞行帧

渲染器支持具有多个飞行帧。您需要在初始化渲染器期间指定帧的数量。渲染器为每帧管理一个顶点缓冲区和索引缓冲区。

  • 不执行绘图调用

Renderer::cmd_draw 只会将命令记录到应用程序提供的命令缓冲区中。它不会将任何内容提交到GPU。

  • 自定义纹理

渲染器支持自定义纹理。有关详细信息,请参阅 Renderer::textures

  • 自定义Vulkan分配器

目前不支持自定义Vulkan分配器。

功能

gpu-allocator

此功能增加了对gpu-allocator的支持。它添加了Renderer::with_gpu_allocator,它接受一个Arc<Mutex<gpu_allocator::vulkan::Allocator>>。然后所有内部分配器都使用此分配器完成。

vk-mem

此功能增加了对vk-mem-rs的支持。它添加了Renderer::with_vk_mem_allocator,它接受一个Arc<Mutex<vk_mem::Allocator>>。然后所有内部分配器都使用此分配器完成。

我对Arc<Mutex<...>>的东西还不太确定。它对我工作得很好,但我不确定这是否是最好的方法。欢迎提出建议。

dynamic-rendering

如果您想将库集成到一个使用Vulkan动态渲染的应用程序中,此功能非常有用。启用后,通常接受vk::RenderPass作为参数的函数现在将接受一个DynamicRendering,它包含UI将要绘制的颜色附件的格式以及可选的深度附件格式。

集成

您可以在示例的common模块中找到集成示例。

// Example with default allocator
let renderer = Renderer::with_default_allocator(
    &instance,
    physical_device,
    device.clone(),
    graphics_queue,
    command_pool,
    render_pass,
    &mut imgui,
    Some(Options {
        in_flight_frames: 1,
        ..Default::default()
    }),
).unwrap();

示例

您可以通过运行以下命令来运行一组示例

# If you want to enable validation layers
export VK_LAYER_PATH=$VULKAN_SDK/Bin
export VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation

# Or with Powershell
$env:VK_LAYER_PATH = "$env:VULKAN_SDK\Bin"
$env:VK_INSTANCE_LAYERS = "VK_LAYER_KHRONOS_validation"

# If you changed the shader code (you'll need glslangValidator on you PATH)
# There is also a PowerShell version (compile_shaders.ps1)
./compile_shaders.sh

# Run an example
cargo run --example <example>

# Example can be one of the following value:
# - collapsing_header
# - color_button
# - creating_windows
# - custom_textures
# - disablement
# - draw_list
# - hello_world
# - id_wrangling
# - keyboard
# - long_list
# - long_table
# - multiple_fonts
# - progress_bar
# - radio_button
# - slider
# - tables_api
# - test_drawing_channels_split
# - test_window_impl
# - test_window
# - text_callbacks
# - text_input

依赖关系

~26MB
~419K SLoC