--交换链相关函数:实例层
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. 产品思维&技术思维&工程思维

    产品思维 产品思维的起源是用户(或客户)价值.用户价值是通过技术手段以产品或服务的形态去解决用户的痛点,或带去爽点.毫无疑问,工程师在日常工作中应时刻关注并理清自己的工作与用户(或客户)价值的联系,并 ...

  2. Centos下LNMP安装

    安装nginx [root@xuegod64 ~]# yum install -y gcc gcc-c++ autoconf automake zlib zlib-devel openssl open ...

  3. v-if 与 v-show 区别

    使用 v-if 时,如果在初始化渲染的时候条件为false, 那么不会做任何事情. v-if 首次局部编译不会发生,直到条件变为true. v-if 切换显示内容的消耗更高,而 v-show 在初始化 ...

  4. 完美解决IE9浏览器出现的对象未定义问题

    目前Window7的机器上,使用IE9浏览器的用户很多,但是IE9在兼容性上做了较严格的控制,导致很多程序在chrome,firefox,ie6,ie7,ie8上可以正常运行,在ie9上确出现了各种问 ...

  5. golang fmt用法举例

    下标与参数的对应 例子如下: package main import ( "fmt" ) func main() { num := 10 fmt.Printf("num: ...

  6. elastic-job 分布式定时任务框架 在 SpringBoot 中如何使用(一)初始化任务并定时执行

    第一篇需要实现一个最简单的需求:某个任务定时执行,多台机子只让其中一台机子执行任务 一.安装 分布式应用程序协调服务 zookeeper,安装步骤在链接里面 Linux(Centos7)下安装 zoo ...

  7. FPGA远程更新之限制条件

    FPGA可重配置带来了很高的灵活性,所以基于FPGA的设计/产品往往也会有后期更新/升级的需求.同时,需要更新/升级的FPGA板卡由于物理条件的限制,可能无法现场升级.比如: 1.FPGA板卡部署在异 ...

  8. 【Spring-AOP-学习笔记-5】@AfterReturning增强处理简单示例

    项目结构 业务代码 @Component("hello") public class HelloImpl implements Hello {     // 定义一个简单方法,模拟 ...

  9. 学习笔记之Moq

    dotnet/src/MoqSample at master · haotang923/dotnet · GitHub https://github.com/htanghtang/dotnet/tre ...

  10. ESXI 5.5加载 zabbix OVF 3.2.6操作

    如果是虚拟机安装ZABBIX,ZABBIX的前台WEB时间,是由虚拟机的BIOS时间决定的. 一. 1.去官方下载vmdk磁盘镜像 链接地址为https://sourceforge.net/proje ...