VULKAN学习笔记-inter教学四篇
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
posted on 2018-08-13 12:16 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏
總結
以上是生活随笔為你收集整理的VULKAN学习笔记-inter教学四篇的全部內容,希望文章能夠幫你解決所遇到的問題。