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