用zig直接写GUI项目的模板项目
基于 zgui 的 Zig 0.17 ImGui 示例项目,使用 GLFW + OpenGL 3 渲染。
项目通过 vendor/ 目录内置了已适配最新 Zig 0.17.0-dev.1811+6716bf52e 的依赖版本:
zig build run按 Esc 退出窗口。窗口内包含自定义面板和 ImGui 官方 Demo 窗口。
build.zig 中链接依赖(OpenGL 后端示例):
const zglfw = b.dependency("zglfw", .{ .target = target, .optimize = optimize });
exe.root_module.addImport("zglfw", zglfw.module("root"));
exe.root_module.linkLibrary(zglfw.artifact("glfw"));
const zopengl = b.dependency("zopengl", .{ .target = target });
exe.root_module.addImport("zopengl", zopengl.module("root"));
const zgui = b.dependency("zgui", .{
.target = target,
.optimize = optimize,
.backend = .glfw_opengl3,
});
exe.root_module.addImport("zgui", zgui.module("root"));
exe.root_module.linkLibrary(zgui.artifact("imgui"));代码中典型用法:
const zglfw = @import("zglfw");
const zopengl = @import("zopengl");
const zgui = @import("zgui");
// 创建 OpenGL 窗口后
try zopengl.loadCoreProfile(zglfw.getProcAddress, 4, 0);
zgui.init(allocator);
defer zgui.deinit();
zgui.backend.init(window);
defer zgui.backend.deinit();
// 每帧
zgui.backend.newFrame(fb_width, fb_height);
if (zgui.begin("Window", .{})) {
if (zgui.button("Button", .{})) { /* ... */ }
}
zgui.end();
zgui.backend.draw();
window.swapBuffers();更多 API 见 zgui README。
zgui 还支持 WebGPU、Vulkan、DirectX 12 等后端。WebGPU 方案需额外依赖 zgpu,设置 .backend = .glfw_wgpu 即可。
Zig 0.17 目前与上游 zig-gamedev 包存在 API 差异,本项目在 vendor/ 中做了必要适配。待上游正式支持 0.17 后,可改回 build.zig.zon 的 URL 依赖方式。