基础代码
创建窗口
首先,我们需要创建一个窗口来显示我们的渲染结果。我们将使用 GLFW 库来创建窗口,因为它是一个跨平台的库,支持 Windows、Linux 和 macOS。
#include <GLFW/glfw3.h>
int main() {
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan", nullptr, nullptr);
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
这段代码初始化了 GLFW,创建了一个 800x600 像素的窗口,并运行了一个简单的循环,直到窗口关闭。
包含 Vulkan 头文件
接下来,我们需要包含 Vulkan 头文件并初始化 Vulkan 库。
#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1
#include <vulkan/vulkan.hpp>
#include <iostream>
int main() {
// 初始化 GLFW 和创建窗口...
// 初始化 Vulkan
vk::ApplicationInfo appInfo{
.pApplicationName = "Hello Triangle",
.applicationVersion = VK_MAKE_VERSION(1, 0, 0),
.pEngineName = "No Engine",
.engineVersion = VK_MAKE_VERSION(1, 0, 0),
.apiVersion = VK_API_VERSION_1_0
};
vk::InstanceCreateInfo createInfo{
.pApplicationInfo = &appInfo
};
vk::raii::Context context;
vk::raii::Instance instance(context, createInfo);
// 主循环...
return 0;
}
检查扩展支持
在创建 Vulkan 实例之前,我们应该检查系统支持的扩展。
// 获取支持的扩展
auto extensions = vk::enumerateInstanceExtensionProperties();
std::cout << "Available extensions:\n";
for (const auto& extension : extensions) {
std::cout << '\t' << extension.extensionName << '\n';
}
创建 Vulkan 实例
现在我们可以创建 Vulkan 实例了。
// 获取 GLFW 所需的扩展
uint32_t glfwExtensionCount = 0;
const char** glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
// 创建实例
vk::InstanceCreateInfo createInfo{
.pApplicationInfo = &appInfo,
.enabledExtensionCount = glfwExtensionCount,
.ppEnabledExtensionNames = glfwExtensions
};
vk::raii::Instance instance(context, createInfo);
验证层
为了帮助调试,我们可以启用验证层。
const std::vector<const char*> validationLayers = {
"VK_LAYER_KHRONOS_validation"
};
// 检查验证层支持
bool validationLayersSupported = false;
// ...
if (validationLayersSupported) {
createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());
createInfo.ppEnabledLayerNames = validationLayers.data();
}