基础代码

      +

      介绍

      在本章中,我们将设置一个基本的 Vulkan 应用程序框架,用于后续章节的开发。我们将创建一个窗口并初始化 Vulkan 库。

      创建窗口

      首先,我们需要创建一个窗口来显示我们的渲染结果。我们将使用 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();
      }

      总结

      现在我们已经设置了一个基本的 Vulkan 应用程序框架,包括窗口创建和 Vulkan 实例初始化。在下一章中,我们将继续设置验证层和物理设备选择。