--交换链相关函数:实例层
vkCreateWin32SurfaceKHR
vkDestroySurfaceKHR
vkGetPhysicalDeviceSurfaceSurportKHR
vkGetPhysicalDeviceSurfaceCapabilitesKHR
vkGetPhysicalDeviceSurfaceFormatsKHR
vkGetPhysicalDeviceSurfacePresentModesKHR

vk_create_win32_surface
vk_destroy_surface
vk_get_phydev_surface_surport
vk_get_phydev_surface_caps
vk_get_phydev_surface_fmts
vk_get_phydev_surface_present_modes
--交换链相关函数:设备层
vk_create_swapchain
vk_destroy_swapchain
vk_get_swapchain_images
vk_acquire_next_image
vk_queue_present

交换链可以支持大于三个的图像,但最多同时操作三个,不支持同时操作三个以上

--信号量相关
vkCreateSemaphore

--创建交换链
--准备数据:
--1,vkGetPhyDevSurfaceCaps获取平面的能力:支持的图像数量,图像尺寸,支持的转换格式
--2,vkGetPhyDevSurfaceFormats获取平面支持的格式 RGBA等
--3,vkGetPhyDevSurfacePresentModes 获取支持的演示模式,立即演示或垂直同步等
--为交换链创建作准备工作
--1,确定交换链图像数量
surface_caps.minImageCount < N < surface_caps.maxImageCount
--2,选择交换链图像格式
比如选择 VK_FORMAT_R8G8B8A8_UNORM,如果不支持,则选择其它的
--3,选择交换链图像大小
surface_caps.currentExtent.width = 640
surface_caps.currentExtent.height = 480
--4,选择交换链标记用法
surface_caps.surportedUsageFlags & VK_IMAGE_USAGE_XXX
VK_IMAGE_USAGE_XXX 包括:
VK_IMAGE_USAGE_SAMPLED --图像用作采样图,即在shader中采样使用
VK_IMAGE_USAGE_STORAGE
VK_IMAGE_USAGE_COLOR_ATTACHMENT
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT
VK_IAMGE_USAGE_INPUT_ATTACHMENT
--5,选择演示模式
--一共四种模式,每种模式的minImageCount都是2,因为必须支持交换链,交换链需少至少2个图
--immediate 模式,使用至少二个图像,有撕裂
--fifo 模式,使用至少二个图像,只在垂直回扫期间替换图像,无撕裂但有输入延迟
--fifo relaxed 类似fifo,帧率小于刷新率时出现撕裂
--mailbox模式,使用至少二个图像 minImageCount=2,一般申请3个,类似三缓冲,最好
VK_PRSENT_MODE_MAILBOX_KHR

--水平扫描
--垂直扫描:从上往下执行N个水平扫描
--垂直回扫:在扫描完一屏后,会有一个从下往上的回扫过程,应该比较短暂,
--垂直同步:完成垂直回扫后显示器发出一个扫描完成的信息-垂直同步信号

--注意显示与渲染的区别
--渲染:是指对交换链中的图像进行写操作
--显示:将交换链中准备好的图像显示到显示器上(显示器的光栅扫描处理过程-水平扫描,垂直扫描,垂直回扫等)

FIFO 模式只在垂直回扫期间替换需要显示的图像,但如果所有图像都在队列中,则需要等待垂直同步信号
释放当前显示的图像以用于渲染操作

MAILBOX 模式只在垂直回扫期间替换需要显示的图像,由于使用了三缓冲,不会出现[类似FIFO的]垂直同步状况

--垂直同步在游戏中要不要开?
1,如果帧率高于60或显示器刷新率就要开,防止撕裂
2,如果帧率低于30帧时,开垂直同步会导致更低的帧率,这时应以帧率为主,关掉垂直同步, 当然这时也会有撕裂,

--导致画面撕裂的原因?
根本原因是显示器扫描一屏的过程中被替换了帧数据,导致下半屏与上半屏使用了不同帧的画面
只要游戏不管垂直同步信号,不管显示器刷新率与游戏帧率是任何关系都会出现撕裂
也就是说,游戏帧率高于,低于显示器刷新率都会出现画面撕裂,只有游戏渲染引擎处理好了垂直
同步信号才能避免

-----------------------------------------------------------
--FIFO 与 MAILBOX 的根本不同在于:
--FIFO 模式下,应用要等待垂直同步信号,然后获取显示完成的图像用来渲染,渲染完成后放入待显示队列
--MAILBOX 模式下,应用渲染完一帧后交给待渲染队列,并取回该队列的图像用作渲染,因此不必等待垂直同步信号
-----------------------------------------------------------
--FIFO与MAILBOX都使用了队列,而IMEDIATE模式不使得队列

==================================================================
--摘记------------------------------------------------------------
在 FIFO 模式中,显示一个图像,其余图像放在 FIFO 队列中。 该队列的长度通常等于“imageCount – 1”。
一开始,所有图像可能都可用于应用(因为队列是空的,没有任何图像)。
当应用演示图像(将其“返回”至交换链)时,该图像将附在队列末尾。
因此,队列变满后,应用需要等待其他图像,直至垂直回扫阶段释放出所显示的图像。
如果出现垂直同步信号,该队列的第一个图像将替换显示的图像。 之前显示的图像(释放的图像)可用于应用,
因为它成了未使用的图像(不演示,也不在队列中等待)。
如果所有的图像都在列队中,应用将等待下一个回扫期以访问其他图像。
如果渲染时间长于刷新率,应用将不需要等待。
==================================================================

--创建交换链

vkSwapchainCreateInfoKHR
<surface, minImgCnt, imgFmt, imgExtent, imgUsage, presentMode, cliped, alpha oldswapchain>
--alpha:该平面与其它平面混合时的alpha值
--imgExtent:图像尺寸等
--imgUsage: VK_IMAGE_USAGE_COLOR_ATTACHMENT 等

--1,vkQueueSubmit()
--提交命令缓冲区,并等待可用图像,然后硬件开始渲染,
--渲染完成后执行下一步
--2,vkQueuePresent(renderFinishedSemaphore, swapchain, image_idx)
--将显示数据放入显示队列,说明在1中是绘制到image_idx上的
问题:vkQueueSubmit的参数中并没有提供图像索引,硬件是如何知道要绘制到image_idx上?

一次可以演示多个图像,但一个交换链最多一个

---------
image view
vkImageViewCreateInfo = {
image, VK_IMAGE_VIEW_TYPE_2D, FMT,
{SWIZZLE_R,SWIZZLE_G,SWIZZLE_B,SWIZZLE_A},
{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}
}

vkCreateImageView(device, vkImageViewCreateInfo, &imgView)

================================================================
VULKAN的渲染管道是不能切换状态的,只能生成时确定好状态及错误检测
================================================================
使用不同的渲染状态,或SHADER去渲染对象时,必须创建不同的管道,
渲染透明物体使用一种管道,
渲染不透明物体只能使用另一种管道
不能使用一种管着来渲染透明和不透明物体,因为不能切换渲染状态
---------------------------------------------------------

vkPiplineShaderStageCreateInfo = {
{
SHADER_STAGE_VIERTEX, bytes, "main"
},
{
SHADER_STAGE_FRAGMENT, bytes, "main"
},
}

vkPipelineVertexInputStateCreateInfo
vkPipelineInputAssemblyStateCreateInfo{
triangle_list,
}
vkPipelineRasteriationStateCreateInfo
vkPipelineMultisampleStateCreateInfo
vkPipelineColorBlendAttachmentState
vkPipelineLayoutCreteInfo

vkGraphicsPiplineCreateInfo = {
shader_stages_info,
vertext_info,
assembly_info,
tessellation_info,
viewport_info,
rasteration_info,
multisample_info,
depthstencil_info,
colorblend_info,
pipeline_layout_info,
renderpass,
subpass_idx, --仅有一个pass时:0

}

VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
None required
VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
VK_QUEUE_GRAPHICS_BIT or
VK_QUEUE_COMPUTE_BIT
VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
VK_PIPELINE_STAGE_TRANSFER_BIT
VK_QUEUE_GRAPHICS_BIT,
VK_QUEUE_COMPUTE_BIT or
VK_QUEUE_TRANSFER_BIT
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
None required
VK_PIPELINE_STAGE_HOST_BIT
None required
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT

vkMemoryRequirements
vkGetBufferMemoryRequirements
vkPhysicalDeviceMemoryProps

vkGetPhysicalDeviceMemoryProperties
{
memoryHeaps,
memoryTypes,
}

vkMemoryAllocate

mem_prop.memoryTypes[i].proptertyFlags &
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
--主机可见内存,即应用可操作内存,我们可以map它,进行memcpy以上传顶点数据

vkMappedMemoryRange
vkFlushMappedMemoryRanges--可以刷新多段不连续内存

---------------------------
---??????我们可调用 vkFlushMappedMemoryRanges() 函数。
---之后,驱动程序将知道哪些部分已修改,并重新加载它们(即刷新高速缓存)。
--重新加载通常在壁垒上执行。 修改缓冲区后,我们应设置缓冲区内存壁垒,
--告知驱动程序部分操作对缓冲区造成了影响,应进行刷新

虚拟帧:一般是包含
1个cmdbuffer,
2个semaphore,
1个fence,
1个framebuffer,

虚拟帧也就是一个缓存,三缓存就是使用三个虚拟帧

vkFenceCreateInfo{
vk_fence_create_signaled_bit,
}

vkCreateFence(device, info, &fence)

交换链重新创建时,旧的图像将无效并消失。 因此我们必须重新创建图像视图和帧缓冲器。

vkCreateFrameBuffer
<renderpass, imageview, width, height>

vkRenderPassBeginInfo{
renderpass,
framebuffer,
{{x,y},{w, h}},
clearvulue[],
}

vkCmdBeginRenderPass

VULKAN学习笔记-inter教学四篇的更多相关文章

  1. Python学习笔记【第四篇】:基本数据类型

    变量:处理数据的状态 变量名 = 状态值 类型 python中有以下基本数据类型: 1:整形 2:字符串类型 3:Bool类型 4:列表 5:元祖(不可变) 6:字典(无序) 7:集合 (无序.不重复 ...

  2. 【Unity Shaders】学习笔记——SurfaceShader(四)用纹理改善漫反射

    [Unity Shaders]学习笔记——SurfaceShader(四)用纹理改善漫反射 转载请注明出处:http://www.cnblogs.com/-867259206/p/5603368.ht ...

  3. python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法

    python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...

  4. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  5. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

  6. Python学习笔记(十四)

    Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...

  8. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记看另一篇吧】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3975  Solved: 2421[Submit][Stat ...

  9. 《机器学习实战》学习笔记第十四章 —— 利用SVD简化数据

    相关博客: 吴恩达机器学习笔记(八) —— 降维与主成分分析法(PCA) <机器学习实战>学习笔记第十三章 —— 利用PCA来简化数据 奇异值分解(SVD)原理与在降维中的应用 机器学习( ...

随机推荐

  1. virtualbox centos安装增强工具和问题详解

    virtualbox centos安装增强工具和问题详解 VirtualBox 大家都习惯性把它简称为 Vbox ,比 VM 的体积小.开源.速 度快.不过在使用 VirtualBox 在虚拟机中安装 ...

  2. 抓包软件Packet Sniffer的使用

    1. 要用专门的一块zigbee插到底板上,仿真器连到CC Debug接口. 2. 打开软件,按下仿真器的复位键,可以识别到设备. 3. 进行抓包(抓到的是网络中其他节点的信息)

  3. GNU C与ANSI C的不同

    引用:http://tsroad.lofter.com/post/376316_57ac519 1.GNU C可定义0长度数组,目的是为了定义可变长结构体. struct var_struct{    ...

  4. ThinkJava-持有对象

    11.3 添加一组元素 在java.util包中的Arrays和Collection类中都有很多实用方讼,可以在一个Collection中添加 一组元素.Arrays.asList()方法接受一个数组 ...

  5. aapium 设置安卓机参数

    例子: class iBer(Unittest.TestCase): @classmethod def setUpClass(cls): logger=public.log() desired_cap ...

  6. ASP.NET Web Pages:Chart 帮助器

    ylbtech-.Net-ASP.NET Web Pages:Chart 帮助器 1.返回顶部 1. ASP.NET Web Pages - Chart 帮助器 Chart 帮助器 - 众多有用的 A ...

  7. iOS 一些常用代码的总结

    一.运算符号前后都需要加空格 二.控件view都有initWithFrame 三.initWithSubview 和 layoutSubviews initWithSubview:初始化子控件 lay ...

  8. PreApplicationStartMethodAttribute的使用

    先预备一个类,用于Start时调用 public static class MyPreApplicationStart { public static void RegisterGlobalFilte ...

  9. C# 方法中带默认值的参数

    设计一个方法的参数时,可为部分或全部参数分配默认值.然后,调用这些方法的代码可以选择不指定部分实参,接受其默认值.除此之外,调用方法时,还可通过指定参数名称的方式为其传递实参.以下代码演示了可选参数和 ...

  10. 经典算法 KMP算法详解

    内容: 1.问题引入 2.暴力求解方法 3.优化方法 4.KMP算法 1.问题引入 原始问题: 对于一个字符串 str (长度为N)和另一个字符串 match (长度为M),如果 match 是 st ...