#2d-graphics #vulkan #skia #graphics #ash #2d

skulpin-plugin-imgui

skulpin的imgui渲染插件

7个版本 (破坏性更新)

0.7.1 2021年1月27日
0.7.0 2020年11月3日
0.6.0 2020年9月27日
0.5.0 2020年9月12日
0.2.0 2020年3月7日

渲染 中排名 340

MIT/Apache

92KB
2K SLoC

skulpin

Skia + Vulkan = Skulpin

此crate通过结合vulkan和skia,提供了一种简单绘制硬件加速2D的选项。

请注意在使用此crate之前其状态

Build Status Crates.io

Example Screenshot

此crate主要依赖于

注意:有关如何获取skia二进制文件的信息,请参阅skia-bindings。在许多情况下,此crate将下载由其项目CI创建的二进制文件。

此crate与raw-window-handle集成,这使得它可以与sdl2、winit以及支持raw-window-handle的任何其他窗口框架一起使用。

运行示例

首先,根据操作系统确保满足以下要求。然后,可以正常运行示例。

对于获取键盘/鼠标输入的简单方法,可以查看交互式示例。

# winit 0.24
cargo run --example interactive_winit_app --features winit-app,winit-25

# sdl2
cargo run --example interactive_sdl2

物理演示也很有趣。

cargo run --example physics --features winit-app,winit-25

这是物理和交互式示例的视频。

IMAGE ALT TEXT

状态

我不再使用此crate进行任何事情,因此将只以非常基础的方式维护此crate。我将审查简单的pull请求并在已打开的问题上提出建议。然而,我可能在任何时候完全关闭此repo,尤其是如果crate停止工作且需要更多非平凡更改来解决时。遗憾的是,我在开源项目上的时间有限,因此我希望将其集中在我认为对我个人最有兴趣的crate上。我愿意将crate的所有权转交给那些已经提交了几个PR并显示出信任的人,如果有人创建了一个分支,我会很高兴提供链接。

用法

目前有两种方法可以在winit中使用此库。

  • app - 实现 AppHandler 接口并启动应用。这很简单,但不够灵活。目前仅支持使用 winit。
  • 仅渲染器 - 您自己管理窗口和事件循环。然后添加渲染器来绘制。窗口应封装在 skulpin::Window 的实现中。提供了 sdl2winit 的实现。

如果您更倾向于使用 sdl2,则需要直接使用渲染器。参见 仅 sdl2 渲染器

不要忘记安装适用于您平台的以下先决条件!(参见“需求”)

特性标志

  • skia-complete - 包含以下所有 Skia 特性。** 默认开启 **
  • skia-shaper - 启用使用 Harfbuzz 和 ICU 的文本形状
  • skia-svg - 此特性启用 SVG 渲染后端
  • skia-textlayout - 使 Skia 模块 skparagraph 可用,其中包含用于布局段落的类型
  • 有关这些标志的更多信息,请参阅 skia-safe 读取文件

skia-bindings 预构建二进制文件仅适用于某些特性的组合。截至本文撰写时,它适用于没有、每个特性单独或所有特性都启用的组合。需要 vulkan 特性,并且隐式使用,因此单独启用任何特性都将显著增加构建时间。建议使用所有特性(默认行为),或禁用所有特性。(使用 default-features = false

Skulpin 特性

  • winit-app - 包含 winit 应用封装。它不如直接使用渲染器灵活,但易于使用。

如果使用 winit-app,您必须指定一个 winit 版本特性标志(见下文)

Winit 版本特性标志

  • winit-21
  • winit-22
  • winit-23
  • winit-24
  • winit-25
  • winit-latest

(这些特性名称与 imgui-rs 仓库匹配。)

特性标志使用示例

# Pull in all skia features and support for all backends (sdl2 and winit)
skulpin = "0"

# Pull in all skia features but not the winit app wrapper
skulpin = { version = "0", default-features = false, features = ["skia-complete"] }

# Pull in all skia features and include the winit app wrapper
skulpin = { version = "0", default-features = false, features = ["skia-complete", "winit-app"] }

skia-safe 的上游版本控制

Skulpin 可以与许多版本的 skia-safe 一起构建和使用。为了适应库的用户,所需的版本已被留为开放。这允许新项目使用这些库的较新版本,同时不会强迫旧项目更新。

您可以通过使用 cargo update 强制使用特定的 skia safe 版本

cargo update -p skia-safe --precise 0.32

文档

由于 skia_safe 仓库需要网络连接来构建,所以文档在 docs.rs 上构建失败。(它将获取 skia 源代码或获取预构建的二进制文件。)因此,查看文档的最佳方式是自己构建它们

cargodoc -pskulpin --open

需求

最低要求的 rust 版本:1.43.0

Windows

  • 如果您使用的是 GNU 工具链(MSVC 是默认值),您可能会在构建 curl 时遇到问题。(Curl 是 skia_safe 绑定的依赖项,用于下载预构建的 skia 二进制文件。)这里有一些 解决方案列在这里。再次强调,这只会影响您使用非默认 GNU 工具链的情况。
  • 如果您正在使用SDL2,请参阅SDL2绑定要求。最简单的方法是使用“捆绑”和“静态”功能。要做到这一点,请将以下代码添加到您的Cargo.toml中:sdl2 = { version = ">=0.33", features = ["bundled", "static-link"] }。这些功能在示例中默认启用。
  • 启用vulkan验证需要LunarG验证层和一个在您的PATH中可见的Vulkan库。一个简单的方法是使用LunarG Vulkan SDK

MacOS

  • 如果您正在使用SDL2,请参阅SDL2绑定要求。最简单的方法是使用“捆绑”和“静态”功能。要做到这一点,请将以下代码添加到您的Cargo.toml中:sdl2 = { version = ">=0.33", features = ["bundled", "static-link"] }。这些功能在示例中默认启用。
  • 启用vulkan验证需要LunarG验证层和一个在您的PATH中可见的Vulkan库。一个简单的方法是使用LunarG Vulkan SDK

Linux

  • 如果您正在使用SDL2,请参阅SDL2绑定要求。最简单的方法是使用“捆绑”和“静态”功能。要做到这一点,请将以下代码添加到您的Cargo.toml中:sdl2 = { version = ">=0.33", features = ["bundled", "static-link"] }。这些功能在示例中默认启用。
  • 在Linux上,您还需要链接到bz2、GL、fontconfig和freetype。
    • 在Ubuntu上,您可以使用libbz2-devlibfreetype6-devlibfontconfig1-devlibgl-dev。 (以及libvulkan-dev以获取Vulkan SDK)
  • 启用vulkan验证需要LunarG验证层和一个在您的PATH中可见的Vulkan库。一个简单的方法是使用LunarG Vulkan SDK

其他平台

可能可以为此构建移动平台,但我尚未调查这一点。

关于高DPI显示支持的一个注意事项

对于常见情况,您可以使用“逻辑”坐标在skia画布上绘制,而不用担心dpi/缩放问题。

内部,skia表面将与swapchain大小匹配,但这个大小不一定是窗口的逻辑大小或物理大小。为了产生一致大小的结果,渲染器将在将其传递给您的绘制实现之前对skia画布应用一个缩放因子。

重要的配置选择

在配置您的应用程序如何运行时,您应该考虑以下几个主要选择

  • 坐标系 - 该库可以配置为使用几种不同的坐标系。
    • Logical - 使用逻辑坐标,这些坐标是考虑了高分辨率显示的像素
    • Physical - 使用原始像素作为坐标
    • VisibleRange - 尝试将给定的范围适应到窗口中
    • FixedWidth - 使用给定的X范围和纵横比来计算Y范围
    • None - 不要修改画布矩阵
  • 演示模式 - 您可能希望使用Fifo(默认)或Mailbox
    • Fifo (VK_PRESENT_MODE_FIFO_KHR)是默认行为,并且始终存在于完全遵守规范设备上。这将导致VSync,不应出现屏幕撕裂,并且通常以显示刷新率运行。
    • Mailbox (VK_PRESENT_MODE_MAILBOX_KHR)将尽可能快地渲染。帧将被排队,并将绘制最新的完整帧。其他帧将被丢弃。这种渲染方法将产生最低的延迟,但并非总是可用,并且可能会对笔记本电脑和移动设备造成不必要的电池消耗。
    • 有关详细信息,请参阅prefer_fifo_present_mode/prefer_mailbox_present_mode以选择两种推荐选项之一或present_mode_priority以进行完全控制。
    • 有关详细信息,请参阅PresentMode的文档和Vulkan规范。
  • 设备类型 - 最常见的设备类型将是专用或集成。默认情况下,如果可用,将选择专用设备。
    • Discrete (VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) - 当可用时,这可能是性能最好的设备
    • Integrated (VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU) - 这通常比离散GPU更节能。
    • 我认为同时拥有集成显卡和独立显卡的笔记本电脑最有可能的情况。我预计,优先考虑集成显卡可能会对电池寿命更有利,但会牺牲一些性能。然而,我没有合适的设备来进行这项测试。
    • 有关在两个推荐选项之间进行简单选择的方法,请参阅 prefer_integrated_gpu/prefer_discrete_gpu 或要进行全面控制,请参阅 physical_device_type_priority
    • 有关详细信息,请参阅 PhysicalDeviceType 的文档和 Vulkan 规范。
  • Vulkan 调试层 - 默认情况下未启用调试日志
    • use_vulkan_debug_layer 可以开启或关闭所有日志
    • validation_layer_debug_report_flags 允许选择特定的日志级别
    • 如果未安装 Vulkan SDK,则任何启用了 Vulkan 调试的应用程序将无法启动

许可证

根据您的选择,许可如下

任选其一。

字体目录包含多个字体,每个字体都有自己的许可证

sdl2 使用 zlib 许可证。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,都应按照上述方式双重许可,没有任何额外的条款或条件。

请参阅 LICENSE-APACHELICENSE-MIT

依赖项

~21–29MB
~506K SLoC