zoukankan      html  css  js  c++  java
  • VULKAN学习笔记-inter教学四篇

    --交换链相关函数:实例层
    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

  • 相关阅读:
    java数据库连接池dbcp的使用
    图片轮显效果大全
    W5500问题集锦(持续更新中)
    Gamma校正及其OpenCV实现
    GlusterFS源代码解析 —— GlusterFS 日志
    cocos2dx 以子弹飞行为例解说拖尾效果类CCMotionStreak
    leetcode__Convert Sorted List to Binary Search Tree
    昨天面试新浪 java试题
    linux概念之性能调优
    Java实现 黑洞数
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/9467317.html
Copyright © 2011-2022 走看看