C++ · 项目报告

sebbbi/NoGraphicsAPI

Minimal graphics API. Built on top of latest Vulkan extensions. As close as possibly to my "No Graphics API" blog post and the SIGGRAPH talk.

已完成 打开 GitHub
S
788星标
19Fork
1Issue
MIT许可证

分析结果

项目分析

NoGraphicsAPI 是一个实验性的 C++20/Vulkan 1.4 极简图形 API 原型,实现 Sebastian Aaltonen “No Graphics API” 博文与 SIGGRAPH 演讲中的核心思想:用 64 位 GPU 指针替代传统 buffer/binding,用应用自行管理的 descriptor heap 替代 descriptor set/layout,用 hazard 风格的全局 barrier 替代资源状态转换列表,并通过 push data/root data 向 shader 传递小型根参数。项目当前主要面向 Vulkan 后端,包含 triangle、cube、deferred_renderer 三个示例;Metal 仅有设计文档,尚未实现。

适用领域 实时渲染 / Vulkan / 图形 API 设计 / GPU 编程 / 渲染引擎研发 / 底层图形抽象层 / Shader 与 Slang / 实验性图形架构
配置难度 高。该项目要求开发者理解 Vulkan 1.4、新扩展、GPU virtual address、descriptor heap、shader 指针、timeline semaphore、barrier/hazard 同步、Slang/SPIR-V 等底层概念。对于普通图形应用开发者或只熟悉 OpenGL/Unity/Unreal 高层接口的开发者门槛很高;更适合资深渲染工程师、引擎底层开发者和图形 API 研究人员。
商业价值 中等偏研究型。它的直接商业落地价值不在于提供一个开箱即用的渲染引擎,而在于为自研引擎团队提供未来图形 API 设计、bindless 资源系统、GPU 指针化数据访问和低开销 Vulkan 抽象的参考。对于游戏引擎、仿真可视化、GPU 驱动/中间层、图形技术预研团队具有较高技术参考价值;但由于硬件兼容性和实验性质限制,短期内不适合作为商业产品的唯一图形后端。
01

技术亮点

  • 设计非常前沿,直接探索传统 graphics API 中 descriptor set、pipeline layout、buffer object 等概念能否被进一步简化。
  • 公开 API 避免暴露 VkDescriptorSetLayout、VkDescriptorPool、VkDescriptorSet、VkPipelineLayout 等 Vulkan 复杂对象,强调更直接的数据访问模型。
  • 使用 64 位 GPU 指针让 shader 直接访问顶点数据和任意应用数据结构,接近现代 GPU 硬件能力。
  • 应用自主管理 texture 和 sampler descriptor heap,便于构建 bindless 风格资源系统。
  • 同步模型以 execution/memory hazard 为中心,而不是维护大量 per-resource layout/state transition。
  • 提供 shared C++/Slang root ABI,CPU 和 shader 可复用同一份结构定义。
  • 示例覆盖从最小 triangle 到纹理 cube,再到多 pass deferred renderer、GPU compute simulation 和 mesh shader workload。
  • MIT License,适合作为学习、研究或内部原型参考。
  • README 对硬件支持、驱动版本、扩展需求和架构限制描述非常详细。
02

目标用户

  • 熟悉 Vulkan 1.3/1.4、GPU 内存模型和同步机制的图形程序员
  • 正在设计自研渲染引擎或图形抽象层的引擎开发者
  • 研究 bindless、GPU virtual address、descriptor heap、mesh shader 的高级渲染开发者
  • 希望理解未来低开销图形 API 方向的技术研究人员
  • 对 Slang、SPIR-V、新 Vulkan 扩展感兴趣的开发者
03

配置要求

  • CMake 3.24+
  • C++20 编译器
  • Vulkan SDK 1.4.357+
  • Vulkan 1.4 loader
  • 支持 Vulkan 1.4 且暴露必要扩展的 GPU 与驱动
  • 必需扩展包括 VK_EXT_descriptor_heap、VK_KHR_device_address_commands、VK_KHR_shader_untyped_pointers、VK_EXT_mesh_shader
  • 可选或优化相关扩展包括 VK_KHR_unified_image_layouts、VK_EXT_debug_utils
  • 需要 buffer device address、timeline semaphore、dynamic rendering、synchronization2、scalar block layout 等 Vulkan 1.4/core 功能
  • 需要 CPU-visible coherent GPU memory,离散显卡通常依赖 PCIe ReBAR,集成显卡依赖 UMA
  • 示例构建需要 Slang 2026.14.1+ 和 SPIRV-Tools 2026.3+
  • Windows 示例使用普通 swapchain 路径;Linux/SteamOS 窗口呈现支持尚未完成
  • 不支持 MinGW、32 位 x86 和 ARM 目标
  • Metal 后端未实现,仅提供 porting 设计文档
04

适用场景

  • 学习和验证“无传统图形 API”风格的渲染架构
  • 作为自研渲染引擎中底层资源绑定、GPU 指针访问、descriptor heap 管理的参考实现
  • 研究 Vulkan 1.4 新扩展,如 VK_EXT_descriptor_heap、VK_KHR_device_address_commands、VK_KHR_shader_untyped_pointers
  • 构建使用 GPU 指针进行顶点读取、场景数据访问和多 pass 渲染的实验 demo
  • 对比传统 Vulkan descriptor set/pipeline layout 模型与应用自管 descriptor heap 模型的复杂度差异
  • 评估 mesh shader、timeline semaphore、dynamic rendering、synchronization2 等现代 Vulkan 特性的组合使用
05

部署与配置

  • 安装 CMake 3.24 或更高版本。
  • 安装支持 C++20 的编译器。Windows 推荐 MSVC 或 clang-cl;其他平台可用 GNU/Clang 构建 headless 库。
  • 安装 Vulkan SDK,要求 Vulkan SDK headers 和开发库版本 1.4.357 或更高。
  • 如需构建示例,安装 Slang 2026.14.1 或更高版本,以及 SPIRV-Tools 2026.3 或更高版本。
  • 确认目标机器为 little-endian x86-64;可选 utility math 目标还要求 AVX2 和 FMA。
  • 确认 GPU、驱动和 Vulkan loader 支持 Vulkan 1.4 以及项目要求的扩展。
  • 基础构建命令:cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
  • 执行构建:cmake --build build
  • 可选安装:cmake --install build --prefix path/to/install
  • 在 CMake 项目中使用:find_package(NoGraphicsAPI CONFIG REQUIRED),并链接 NoGraphicsAPI::NoGraphicsAPI。
  • 如需开发示例和测试,使用:cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DNOGRAPHICSAPI_BUILD_EXAMPLES=ON -DNOGRAPHICSAPI_BUILD_TESTS=ON
  • 运行测试:ctest --test-dir build --output-on-failure
  • 示例程序位于 build/examples 下,包括 triangle、cube、deferred_renderer。
06

风险与注意事项

  • 项目是实验性原型,不应直接视为成熟生产级图形引擎或稳定跨平台 API。
  • 依赖非常新的 Vulkan 1.4 生态和多个前沿扩展,实际可运行硬件范围有限。
  • Windows RDNA2 当前缺少 VK_EXT_descriptor_heap;Pascal/GTX 10 等老显卡不满足要求。
  • 固定 BAR 或未开启 ReBAR 的离散 GPU 可能存在 CPU-visible VRAM 容量限制。
  • Linux/SteamOS 的窗口呈现尚未实现,跨平台完整性有限。
  • Metal 后端未实现,无法直接用于 macOS/iOS 图形开发。
  • Slang、SPIRV-Tools 和 Vulkan SDK 版本要求较新,国内开发环境配置可能较麻烦。
  • API 思路偏研究性质,与传统 Vulkan/D3D12/Metal 抽象差异较大,团队接手成本较高。
  • 自管 GPU memory、descriptor heap、timeline reuse 和 deferred destruction 对开发者要求高,容易引入难调试的 GPU 崩溃或同步 bug。
  • README 中的硬件支持信息基于特定时间点的驱动检查,实际结果仍需以 create_device() 和本机驱动为准。

历史记录

热榜历史快照

2026-09-07 第9名 新收录 · github_search