目录
Vulkan Samples 资源
Git 官方:https://github.com/KhronosGroup/Vulkan-Samples.git
Git 私有:https://gitee.com/thebigapple/Vulkan-Samples.git
Git CSDN: https://codechina.csdn.net/mirrors/SaschaWillems/Vulkan.git (目录结构好)
Vulkan Samples 编译(Cmake)
- git clone --recursive https://github.com/SaschaWillems/Vulkan.git
- cd Vulkan
- git submodule init
- git submodule update
- python download_assets.py
- Cmake + VS 编译即可
Basics – Triangle
VulkanExample *vulkanExample;
vulkanExample = new VulkanExample(); //构造函数中只对相机进行初始化
vulkanExample->initVulkan();
vulkanExample->setupWindow(hInstance, WndProc);
vulkanExample->prepare();
vulkanExample->renderLoop();
delete(vulkanExample); //析构函数中对Vulkan实例相关资源进行释放
构造、析构函数
- 构造函数中对相机进行初始化
title = "Vulkan Example - Basic indexed triangle";
camera.type = Camera::CameraType::lookat;
camera.setPosition(glm::vec3(0.0f, 0.0f, -2.5f));
camera.setRotation(glm::vec3(0.0f));
camera.setPerspective(60.0f, (float)width / (float)height, 1.0f, 256.0f);
-
基类 VulkanExampleBase 的构造
-
析构函数内容
- vkDestroyPipeline:
- vkDestroyPipelineLayout
- vkDestroyDescriptorSetLayout
- vkDestroyBuffer 包括VBO、IBO、和 UBO
- vkFreeMemory 包括VBO、IBO、和 UBO
- vkDestroySemaphore
- vkDestroySemaphore
- vkDestroyFence
initVulkan 函数
- 创建 Vulkan 实例:createInstance
- 查询设置可用扩展:vkEnumerateInstanceExtensionProperties
- 查询设置实例layer:vkEnumerateInstanceLayerProperties
- 创建实例:vkCreateInstance
- 设置Debugging:setupDebugging
- vkCreateDebugUtilsMessengerEXT
- vkDestroyDebugUtilsMessengerEXT
- 查询设置使用的显卡:vkEnumeratePhysicalDevices
- commandLineParser:存储显卡信息
- physicalDevice = physicalDevices[selectedDevice]:默认选择0号位显卡
- vkGetPhysicalDeviceProperties:获取显卡属性
- vkGetPhysicalDeviceFeatures:获取显卡特性
- vkGetPhysicalDeviceMemoryProperties:获取显卡内存
- getEnabledFeatures:(未实现)
- VulkanDevice:创建 VulkanDevice 实例
- this->physicalDevice = physicalDevice:保存选择显卡 handle
- vkGetPhysicalDeviceProperties:获取显卡属性
- vkGetPhysicalDeviceFeatures:获取显卡特性
- vkGetPhysicalDeviceMemoryProperties:获取显卡内存
- vkGetPhysicalDeviceQueueFamilyProperties:获取 QueueFamily 属性
- vkEnumerateDeviceExtensionProperties:获取扩展属性
- vulkanDevice->createLogicalDevice:创建逻辑驱动
- vkCreateDevice:创建逻辑驱动
- createCommandPool:创建 CommandPool
- vkGetDeviceQueue:Get a graphics queue from the device
- getSupportedDepthFormat:获取深度 format
- swapChain.connect(instance, physicalDevice, device)
- 没有找到实例化的位置,从类的定义来看,使用默认构造,应该使用默认初始化直接使用
- Set instance, physical and logical device to use for the swapchain and get all required function pointers
- vkCreateSemaphore
- presentComplete
- renderComplete
setupWindow 函数 (略)
prepare 函数
- VulkanExampleBase::prepare:基类初始化
- initSwapchain: SwapChain 初始化
- initSurface
- createCommandPool
- setupSwapChain
- swapChain.create(&width, &height, settings.vsync):涉及到渲染循环 swapchain 的创建与销毁。(需要后续仔细看*)
- createCommandBuffers
- createSynchronizationPrimitives
- vkCreateFence
- setupDepthStencil:涉及
- vkCreateImage
- vkGetImageMemoryRequirements
- vkAllocateMemory
- vkBindImageMemory
- vkCreateImageView
- setupRenderPass
- pColorAttachments
- pDepthStencilAttachment
- subpassDescription
- vkCreateRenderPass
- createPipelineCache
- vkCreatePipelineCache
- setupFrameBuffer
- vkCreateFramebuffer
- UIOverlay:界面相关,显示渲染结果
- UIOverlay.device = vulkanDevice;
- UIOverlay.queue = queue;0
- UIOverlay.shaders:load shader
- UIOverlay.prepareResources:加载纹理、模型相关资源 (没见到VBO和IBO,所以应该只加载纹理)
- vkCreateImage
- vkCreateImageView
- vkCreateSampler
- vkCreateDescriptorPool
- vkCreateDescriptorSetLayout
- vkAllocateDescriptorSets
- vkUpdateDescriptorSets
- UIOverlay.preparePipeline:涉及到VBO、IBO的绑定
- vkCreatePipelineLayout
- pipelineInputAssemblyStateCreateInfo
- pipelineRasterizationStateCreateInfo
- pipelineColorBlendStateCreateInfo
- pipelineDepthStencilStateCreateInfo
- pipelineViewportStateCreateInfo
- pipelineMultisampleStateCreateInfo
- pipelineDynamicStateCreateInfo
- pipelineCreateInfo
- vertexInputBindingDescription
- vertexInputAttributeDescription
- pipelineVertexInputStateCreateInfo
- vkCreateGraphicsPipelines
- initSwapchain: SwapChain 初始化
renderLoop函数
- VulkanExampleBase::nextFrame
- draw:每个程序的 render 函数所需要更新的资源不同,但是 Draw 应该是相同的
- swapChain.acquireNextImage
- vkWaitForFences
- vkResetFences
- vkQueueSubmit
- swapChain.queuePresent
- draw:每个程序的 render 函数所需要更新的资源不同,但是 Draw 应该是相同的
总结
Triangle Sample 很简单,可以看作将 Vulkan Tutorial 的代码进行了抽象。先通读代码,后期深入学习大佬的架构思想。