目录
- 先叨叨
- 搭建开发环境
- Git信息
- 主要逻辑
- VulkanEnv
- 代码编译和执行
先叨叨
上一篇从宏观上介绍了Vulkan中各对象的关系。接下来开始实践。
我也是Vulkan的初学者,在这里也是现学现卖,如果发现错误或有建议的话还请大家指教。
目前我在从事车辆软件的开发,因此我打算用Vulkan开发一个车辆仪表UI的显示引擎。本系列也作为这个UI引擎的开发笔记。由于工作原因更新不会很频繁,如果大家多多点赞的话会给我很大的创作动力哈哈哈。
搭建开发环境
我使用的开发环境是Ubuntu22.04。其他平台环境搭建请大家参考其他教程。
用Ubuntu开发Vulkan环境搭建很简单只要执行以下三条指令即可。
sudo apt install vulkan-tools
sudo apt install libvulkan-dev
sudo apt install vulkan-validationlayers-dev spirv-tools
Git信息
- reporsitory:https://gitee.com/J8_series/easy-car-ui
- branch: master
- tag:00-VkInstance
- url: https://gitee.com/J8_series/easy-car-ui/tree/00-VkInstance/
主要逻辑
VulkanEnv
VulkanEnv为Vulkan环境和资源的管理类。它的**Initalize()方法用于初始化Vulkan环境。在Initalize()**的第一步就是创建VkInstance。代码如下:
void VulkanEnv::CreateVkInstance()
{//https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkApplicationInfoVkApplicationInfo appInfo;appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;appInfo.pNext = nullptr;appInfo.pApplicationName = "EasyCarUI";appInfo.applicationVersion = VK_MAKE_VERSION(0, 0, 1);appInfo.pEngineName = "EasyCarUIEngine";appInfo.engineVersion = VK_MAKE_VERSION(0, 0, 1);appInfo.apiVersion = VK_API_VERSION_1_0;//https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkInstanceCreateInfoVkInstanceCreateInfo createInfo;createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;createInfo.pNext = nullptr;createInfo.flags = 0;createInfo.pApplicationInfo = &appInfo;createInfo.enabledLayerCount = 0;createInfo.ppEnabledLayerNames = nullptr;createInfo.enabledExtensionCount = 0;createInfo.ppEnabledExtensionNames = nullptr;if (VK_SUCCESS != vkCreateInstance(&createInfo, nullptr, &m_vkInstance)){throw std::runtime_error("To create VkInstance is failed"); }
}
- Vulkan中绝大多数的对象的创将都遵循这个逻辑。首先填充一个VkXXXCreateInfo的结构体,然后调用vkCreateXXX()方法。
- Vulkan中所有结构都包含一个sType属性,目的是表明当前结构的类型。这样作的目的是为了在C语言接口中实现多态机制。
- Vulkan跟OpenGL一样是一个图形API的标准(定义),因此不同的厂商都可以有自己的实现。除了核心接口外,厂商还可以实现一些扩展功能,如果需要使用这些扩展功能,需要在创将VkInstance时通过createInfo.enabledExtensionCount和createInfo.ppEnabledLayerNames指定。目前我们不需要任何扩展。
- Vulkan的另一种扩展机制称为Layer。Layer可以将自己插入到Vulkan的Command中,也可提供一些新的扩展。所有教程中最常提到的Layer应该当属validationlayers了。它可以检测和跟踪Vulkan的执行。在使用OpenGL最大的痛苦就是当屏幕是黑的时候我们很难调查是什么原因导致的。但在Vulkan中,我们可以通过validationlayers更方便的调查出原因。目前我们不需要任何Layer
代码编译和执行
Clone并进入代码目录执行
mkdir build
cd build
cmake ..
make
./EasyCarUI
如果没有输出任何log,则表明创建成功了。