VULKAN学习笔记-inter教学四篇
VULKAN學(xué)習(xí)筆記-inter教學(xué)四篇
--交換鏈相關(guān)函數(shù):實(shí)例層
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
--交換鏈相關(guān)函數(shù):設(shè)備層
vk_create_swapchain
vk_destroy_swapchain
vk_get_swapchain_images
vk_acquire_next_image
vk_queue_present
交換鏈可以支持大于三個(gè)的圖像,但最多同時(shí)操作三個(gè),不支持同時(shí)操作三個(gè)以上
--信號(hào)量相關(guān)
vkCreateSemaphore
--創(chuàng)建交換鏈
--準(zhǔn)備數(shù)據(jù):
--1,vkGetPhyDevSurfaceCaps獲取平面的能力:支持的圖像數(shù)量,圖像尺寸,支持的轉(zhuǎn)換格式
--2,vkGetPhyDevSurfaceFormats獲取平面支持的格式 RGBA等
--3,vkGetPhyDevSurfacePresentModes 獲取支持的演示模式,立即演示或垂直同步等
--為交換鏈創(chuàng)建作準(zhǔn)備工作
--1,確定交換鏈圖像數(shù)量
surface_caps.minImageCount < N < surface_caps.maxImageCount
--2,選擇交換鏈圖像格式
比如選擇 VK_FORMAT_R8G8B8A8_UNORM,如果不支持,則選擇其它的
--3,選擇交換鏈圖像大小
surface_caps.currentExtent.width = 640
surface_caps.currentExtent.height = 480
--4,選擇交換鏈標(biāo)記用法
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,因?yàn)楸仨氈С纸粨Q鏈,交換鏈需少至少2個(gè)圖
--immediate 模式,使用至少二個(gè)圖像,有撕裂
--fifo 模式,使用至少二個(gè)圖像,只在垂直回掃期間替換圖像,無(wú)撕裂但有輸入延遲
--fifo relaxed 類似fifo,幀率小于刷新率時(shí)出現(xiàn)撕裂
--mailbox模式,使用至少二個(gè)圖像 minImageCount=2,一般申請(qǐng)3個(gè),類似三緩沖,最好
VK_PRSENT_MODE_MAILBOX_KHR
--水平掃描
--垂直掃描:從上往下執(zhí)行N個(gè)水平掃描
--垂直回掃:在掃描完一屏后,會(huì)有一個(gè)從下往上的回掃過(guò)程,應(yīng)該比較短暫,
--垂直同步:完成垂直回掃后顯示器發(fā)出一個(gè)掃描完成的信息-垂直同步信號(hào)
--注意顯示與渲染的區(qū)別
--渲染:是指對(duì)交換鏈中的圖像進(jìn)行寫操作
--顯示:將交換鏈中準(zhǔn)備好的圖像顯示到顯示器上(顯示器的光柵掃描處理過(guò)程-水平掃描,垂直掃描,垂直回掃等)
FIFO 模式只在垂直回掃期間替換需要顯示的圖像,但如果所有圖像都在隊(duì)列中,則需要等待垂直同步信號(hào)
釋放當(dāng)前顯示的圖像以用于渲染操作
MAILBOX 模式只在垂直回掃期間替換需要顯示的圖像,由于使用了三緩沖,不會(huì)出現(xiàn)[類似FIFO的]垂直同步狀況
--垂直同步在游戲中要不要開(kāi)?
1,如果幀率高于60或顯示器刷新率就要開(kāi),防止撕裂
2,如果幀率低于30幀時(shí),開(kāi)垂直同步會(huì)導(dǎo)致更低的幀率,這時(shí)應(yīng)以幀率為主,關(guān)掉垂直同步, 當(dāng)然這時(shí)也會(huì)有撕裂,
--導(dǎo)致畫面撕裂的原因?
根本原因是顯示器掃描一屏的過(guò)程中被替換了幀數(shù)據(jù),導(dǎo)致下半屏與上半屏使用了不同幀的畫面
只要游戲不管垂直同步信號(hào),不管顯示器刷新率與游戲幀率是任何關(guān)系都會(huì)出現(xiàn)撕裂
也就是說(shuō),游戲幀率高于,低于顯示器刷新率都會(huì)出現(xiàn)畫面撕裂,只有游戲渲染引擎處理好了垂直
同步信號(hào)才能避免
-----------------------------------------------------------
--FIFO 與 MAILBOX 的根本不同在于:
--FIFO 模式下,應(yīng)用要等待垂直同步信號(hào),然后獲取顯示完成的圖像用來(lái)渲染,渲染完成后放入待顯示隊(duì)列
--MAILBOX 模式下,應(yīng)用渲染完一幀后交給待渲染隊(duì)列,并取回該隊(duì)列的圖像用作渲染,因此不必等待垂直同步信號(hào)
-----------------------------------------------------------
--FIFO與MAILBOX都使用了隊(duì)列,而IMEDIATE模式不使得隊(duì)列
==================================================================
--摘記------------------------------------------------------------
在 FIFO 模式中,顯示一個(gè)圖像,其余圖像放在 FIFO 隊(duì)列中。 該隊(duì)列的長(zhǎng)度通常等于“imageCount – 1”。
一開(kāi)始,所有圖像可能都可用于應(yīng)用(因?yàn)殛?duì)列是空的,沒(méi)有任何圖像)。
當(dāng)應(yīng)用演示圖像(將其“返回”至交換鏈)時(shí),該圖像將附在隊(duì)列末尾。
因此,隊(duì)列變滿后,應(yīng)用需要等待其他圖像,直至垂直回掃階段釋放出所顯示的圖像。
如果出現(xiàn)垂直同步信號(hào),該隊(duì)列的第一個(gè)圖像將替換顯示的圖像。 之前顯示的圖像(釋放的圖像)可用于應(yīng)用,
因?yàn)樗闪宋词褂玫膱D像(不演示,也不在隊(duì)列中等待)。
如果所有的圖像都在列隊(duì)中,應(yīng)用將等待下一個(gè)回掃期以訪問(wèn)其他圖像。
如果渲染時(shí)間長(zhǎng)于刷新率,應(yīng)用將不需要等待。
==================================================================
--創(chuàng)建交換鏈
vkSwapchainCreateInfoKHR
<surface, minImgCnt, imgFmt, imgExtent, imgUsage, presentMode, cliped, alpha oldswapchain>
--alpha:該平面與其它平面混合時(shí)的alpha值
--imgExtent:圖像尺寸等
--imgUsage: VK_IMAGE_USAGE_COLOR_ATTACHMENT 等
--1,vkQueueSubmit()
--提交命令緩沖區(qū),并等待可用圖像,然后硬件開(kāi)始渲染,
--渲染完成后執(zhí)行下一步
--2,vkQueuePresent(renderFinishedSemaphore, swapchain, image_idx)
--將顯示數(shù)據(jù)放入顯示隊(duì)列,說(shuō)明在1中是繪制到image_idx上的
問(wèn)題:vkQueueSubmit的參數(shù)中并沒(méi)有提供圖像索引,硬件是如何知道要繪制到image_idx上?
一次可以演示多個(gè)圖像,但一個(gè)交換鏈最多一個(gè)
---------
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的渲染管道是不能切換狀態(tài)的,只能生成時(shí)確定好狀態(tài)及錯(cuò)誤檢測(cè)
================================================================
使用不同的渲染狀態(tài),或SHADER去渲染對(duì)象時(shí),必須創(chuàng)建不同的管道,
渲染透明物體使用一種管道,
渲染不透明物體只能使用另一種管道
不能使用一種管著來(lái)渲染透明和不透明物體,因?yàn)椴荒芮袚Q渲染狀態(tài)
---------------------------------------------------------
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, --僅有一個(gè)pass時(shí):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
--主機(jī)可見(jiàn)內(nèi)存,即應(yīng)用可操作內(nèi)存,我們可以map它,進(jìn)行memcpy以上傳頂點(diǎn)數(shù)據(jù)
vkMappedMemoryRange
vkFlushMappedMemoryRanges--可以刷新多段不連續(xù)內(nèi)存
---------------------------
---??????我們可調(diào)用 vkFlushMappedMemoryRanges() 函數(shù)。
---之后,驅(qū)動(dòng)程序?qū)⒅滥男┎糠忠研薷?#xff0c;并重新加載它們(即刷新高速緩存)。
--重新加載通常在壁壘上執(zhí)行。 修改緩沖區(qū)后,我們應(yīng)設(shè)置緩沖區(qū)內(nèi)存壁壘,
--告知驅(qū)動(dòng)程序部分操作對(duì)緩沖區(qū)造成了影響,應(yīng)進(jìn)行刷新
虛擬幀:一般是包含
1個(gè)cmdbuffer,
2個(gè)semaphore,
1個(gè)fence,
1個(gè)framebuffer,
虛擬幀也就是一個(gè)緩存,三緩存就是使用三個(gè)虛擬幀
vkFenceCreateInfo{
vk_fence_create_signaled_bit,
}
vkCreateFence(device, info, &fence)
交換鏈重新創(chuàng)建時(shí),舊的圖像將無(wú)效并消失。 因此我們必須重新創(chuàng)建圖像視圖和幀緩沖器。
vkCreateFrameBuffer
<renderpass, imageview, width, height>
vkRenderPassBeginInfo{
renderpass,
framebuffer,
{{x,y},{w, h}},
clearvulue[],
}
vkCmdBeginRenderPass
posted on 2018-08-13 12:16 時(shí)空觀察者9號(hào) 閱讀(...) 評(píng)論(...) 編輯 收藏
總結(jié)
以上是生活随笔為你收集整理的VULKAN学习笔记-inter教学四篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。